From f45127c595c8dce499a110eebea39393df4c1e66 Mon Sep 17 00:00:00 2001 From: Tao Huang Date: Tue, 12 Nov 2019 19:23:41 +0800 Subject: [PATCH] media/i2c/soc_camera: remove unused rockchip drivers Signed-off-by: Tao Huang Change-Id: I898b1035c9d591143ec35e7b4c137603201ef89a --- drivers/media/i2c/soc_camera/rockchip/Kconfig | 105 - .../media/i2c/soc_camera/rockchip/Makefile | 16 - .../rockchip/adv7181_v4l2-i2c-subdev.c | 582 ----- .../soc_camera/rockchip/adv_camera_module.c | 1410 ----------- .../soc_camera/rockchip/adv_camera_module.h | 295 --- .../rockchip/aptina_camera_module.c | 1630 ------------ .../rockchip/aptina_camera_module.h | 294 --- .../rockchip/imx323_v4l2-i2c-subdev.c | 660 ----- .../soc_camera/rockchip/imx_camera_module.c | 1315 ---------- .../soc_camera/rockchip/imx_camera_module.h | 292 --- .../rockchip/nt99230_v4l2-i2c-subdev.c | 1089 -------- .../rockchip/ov13850_v4l2-i2c-subdev.c | 1998 --------------- .../rockchip/ov2710_v4l2-i2c-subdev.c | 955 ------- .../rockchip/ov4689_v4l2-i2c-subdev.c | 994 -------- .../rockchip/ov5640_v4l2-i2c-subdev.c | 1083 -------- .../rockchip/ov7675_v4l2-i2c-subdev.c | 574 ----- .../rockchip/ov7750_v4l2-i2c-subdev.c | 1007 -------- .../rockchip/ov8858_v4l2-i2c-subdev.c | 2240 ----------------- .../rockchip/ov9281_v4l2-i2c-subdev.c | 830 ------ .../rockchip/ov9750_v4l2-i2c-subdev.c | 1052 -------- .../soc_camera/rockchip/ov_camera_module.c | 1356 ---------- .../soc_camera/rockchip/ov_camera_module.h | 302 --- .../soc_camera/rockchip/rk_camera_module.c | 2036 --------------- .../rockchip/rk_camera_module_version.h | 32 - .../rockchip/sc031gs_v4l2-i2c-subdev.c | 787 ------ .../rockchip/sc2232_v4l2-i2c-subdev.c | 844 ------- .../soc_camera/rockchip/sc_camera_module.c | 1301 ---------- .../soc_camera/rockchip/sc_camera_module.h | 281 --- .../rockchip/tc358749xbg_v4l2-i2c-subdev.c | 1119 -------- .../soc_camera/rockchip/tc_camera_module.c | 1516 ----------- .../soc_camera/rockchip/tc_camera_module.h | 336 --- .../rk_isp10_platform_camera_module.h | 169 -- 32 files changed, 28500 deletions(-) delete mode 100644 drivers/media/i2c/soc_camera/rockchip/Kconfig delete mode 100644 drivers/media/i2c/soc_camera/rockchip/Makefile delete mode 100644 drivers/media/i2c/soc_camera/rockchip/adv7181_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/adv_camera_module.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/adv_camera_module.h delete mode 100644 drivers/media/i2c/soc_camera/rockchip/aptina_camera_module.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/aptina_camera_module.h delete mode 100644 drivers/media/i2c/soc_camera/rockchip/imx323_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/imx_camera_module.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/imx_camera_module.h delete mode 100644 drivers/media/i2c/soc_camera/rockchip/nt99230_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov13850_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov2710_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov4689_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov5640_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov7675_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov7750_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov8858_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov9281_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov9750_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov_camera_module.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/ov_camera_module.h delete mode 100644 drivers/media/i2c/soc_camera/rockchip/rk_camera_module.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/rk_camera_module_version.h delete mode 100644 drivers/media/i2c/soc_camera/rockchip/sc031gs_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/sc2232_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/sc_camera_module.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/sc_camera_module.h delete mode 100644 drivers/media/i2c/soc_camera/rockchip/tc358749xbg_v4l2-i2c-subdev.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/tc_camera_module.c delete mode 100644 drivers/media/i2c/soc_camera/rockchip/tc_camera_module.h delete mode 100644 include/linux/platform_data/rk_isp10_platform_camera_module.h diff --git a/drivers/media/i2c/soc_camera/rockchip/Kconfig b/drivers/media/i2c/soc_camera/rockchip/Kconfig deleted file mode 100644 index 521de93673de..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/Kconfig +++ /dev/null @@ -1,105 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -config VIDEO_OV8858 - tristate "ov8858 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is ov8858 camera driver adapt to rockchip cif isp platform. - -config VIDEO_OV2710 - tristate "ov2710 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is ov2710 camera driver adapt to rockchip cif isp platform. - -config VIDEO_OV4689 - tristate "ov4689 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is OV4689 camera driver adapt to rockchip cif isp platform. - -config VIDEO_IMX323 - tristate "imx323 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is imx323 camera driver adapt to rockchip cif isp platform. - -config VIDEO_OV7750 - tristate "ov7750 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is ov7750 camera driver adapt to rockchip cif isp platform. - -config VIDEO_TC358749XBG - tristate "tc358749xbg driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is tc358749xbg hdmi video driver adapt to rockchip cif isp platform. - -config VIDEO_ADV7181 - tristate "adv7181 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is adv7181 cvbs video driver adapt to rockchip cif isp platform. - -config VIDEO_OV7675 - tristate "ov7675 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is ov7675 camera driver adapt to rockchip cif isp platform. - -config VIDEO_NT99230 - tristate "nt99230 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is nt99230 hdmi video driver adapt to rockchip cif isp platform. - -config VIDEO_OV13850 - tristate "ov13850 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is ov13850 camera driver adapt to rockchip cif isp platform. - -config VIDEO_OV9281 - tristate "ov9281 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - help - This is ov9281 camera driver adapt to rockchip cif isp platform. - -config VIDEO_OV9750 - tristate "ov9750 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - ---help--- - This is ov9750 camera driver adapt to rockchip cif isp platform. - -config VIDEO_ov5640 - tristate "ov5640 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - help - This is ov5640 camera driver adapt to rockchip cif isp platform. - -config VIDEO_SC031GS - tristate "sc031gs driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - help - This is sc031gs camera driver adapt to rockchip cif isp platform. - -config VIDEO_SC2232 - tristate "sc2232 driver adapt to rockchip cif isp platform" - depends on VIDEO_V4L2 && VIDEO_RK_CIF_ISP10 && I2C - default n - help - This is sc2232 camera driver adapt to rockchip cif isp platform. diff --git a/drivers/media/i2c/soc_camera/rockchip/Makefile b/drivers/media/i2c/soc_camera/rockchip/Makefile deleted file mode 100644 index f7c235ecd28b..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_VIDEO_OV8858) += ov_camera_module.o rk_camera_module.o ov8858_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_OV2710) += ov_camera_module.o rk_camera_module.o ov2710_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_OV4689) += ov_camera_module.o rk_camera_module.o ov4689_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_IMX323) += imx_camera_module.o rk_camera_module.o imx323_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_OV7750) += ov_camera_module.o rk_camera_module.o ov7750_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_TC358749XBG) += tc_camera_module.o rk_camera_module.o tc358749xbg_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_ADV7181) += adv_camera_module.o rk_camera_module.o adv7181_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_OV7675) += ov_camera_module.o rk_camera_module.o ov7675_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_NT99230) += ov_camera_module.o rk_camera_module.o nt99230_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_OV13850) += ov_camera_module.o rk_camera_module.o ov13850_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_OV9281) += ov_camera_module.o rk_camera_module.o ov9281_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_OV9750) += ov_camera_module.o rk_camera_module.o ov9750_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_ov5640) += ov_camera_module.o rk_camera_module.o ov5640_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_SC031GS) += sc_camera_module.o rk_camera_module.o sc031gs_v4l2-i2c-subdev.o -obj-$(CONFIG_VIDEO_SC2232) += sc_camera_module.o rk_camera_module.o sc2232_v4l2-i2c-subdev.o diff --git a/drivers/media/i2c/soc_camera/rockchip/adv7181_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/adv7181_v4l2-i2c-subdev.c deleted file mode 100644 index 332521bb330e..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/adv7181_v4l2-i2c-subdev.c +++ /dev/null @@ -1,582 +0,0 @@ -/* - * adv7181 sensor driver - * - * Copyright (C) 2017 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * Author: zhoupeng - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - * Note: - * - * v0.1.0: - * 1. Initialize version; - * 2. Stream on sensor in configuration, - * and stream off sensor after 1frame; - * 3. Stream delay time is define in power_up_delays_ms[2]; - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adv_camera_module.h" - -#define ADV7181_DRIVER_NAME "adv7181" - -/* product ID */ -#define ADV7181_PID_MAGIC 0x20 -#define ADV7181_PID_ADDR 0x11 - -#define ADV7181_STATUS1_REG 0x10 -#define ADV7181_STATUS1_IN_LOCK 0x01 -#define ADV7181_STATUS1_AUTOD_MASK 0x70 -#define ADV7181_STATUS1_AUTOD_NTSM_M_J 0x00 -#define ADV7181_STATUS1_AUTOD_NTSC_4_43 0x10 -#define ADV7181_STATUS1_AUTOD_PAL_M 0x20 -#define ADV7181_STATUS1_AUTOD_PAL_60 0x30 -#define ADV7181_STATUS1_AUTOD_PAL_B_G 0x40 -#define ADV7181_STATUS1_AUTOD_SECAM 0x50 -#define ADV7181_STATUS1_AUTOD_PAL_COMB 0x60 -#define ADV7181_STATUS1_AUTOD_SECAM_525 0x70 - -#define ADV7181_INPUT_CONTROL 0x00 -#define ADV7181_INPUT_DEFAULT 0x00 -#define ADV7181_INPUT_CVBS_AIN2 0x00 -#define ADV7181_INPUT_CVBS_AIN3 0x01 -#define ADV7181_INPUT_CVBS_AIN5 0x02 -#define ADV7181_INPUT_CVBS_AIN6 0x03 -#define ADV7181_INPUT_CVBS_AIN8 0x04 -#define ADV7181_INPUT_CVBS_AIN10 0x05 -#define ADV7181_INPUT_CVBS_AIN1 0x0B -#define ADV7181_INPUT_CVBS_AIN4 0x0D -#define ADV7181_INPUT_CVBS_AIN7 0x0F -#define ADV7181_INPUT_YPRPB_AIN6_8_10 0x09 - -#define ADV7181_EXT_CLK 24000000 - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ -/* resolution 720x480 30fps */ -static struct adv_camera_module_reg adv7180_cvbs_30fps[] = { - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x04, 0x77}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x17, 0x41}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x1D, 0x47}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x31, 0x02}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x3A, 0x17}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x3B, 0x81}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x3D, 0xA2}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x3E, 0x6A}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F, 0xA0}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x86, 0x0B}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xF3, 0x01}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xF9, 0x03}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x0E, 0x80}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x52, 0x46}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x54, 0x80}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x7F, 0xFF}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x81, 0x30}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x90, 0xC9}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x91, 0x40}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x92, 0x3C}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x93, 0xCA}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x94, 0xD5}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xB1, 0xFF}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xB6, 0x08}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xC0, 0x9A}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xCF, 0x50}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xD0, 0x4E}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xD1, 0xB9}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xD6, 0xDD}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xD7, 0xE2}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xE5, 0x51}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0xF6, 0x3B}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x0E, 0x00}, - /* disable out put data */ - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0x03, 0x4C}, - {ADV_CAMERA_MODULE_REG_TYPE_DATA, 0X00, 0X0B}, - -}; - -/* ======================================================================== */ -static struct adv_camera_module_config adv7181_configs[] = { - /* For normal preview NTSC 480i */ - { - .name = "adv7180_cvbs_ntsc_30fps", - .frm_fmt = { - .width = 720, - .height = 480, - .code = MEDIA_BUS_FMT_UYVY8_2X8 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .reg_table = (void *)adv7180_cvbs_30fps, - .reg_table_num_entries = - sizeof(adv7180_cvbs_30fps) - / - sizeof(adv7180_cvbs_30fps[0]), - .v_blanking_time_us = 0, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - .ignore_measurement_check = 1, - PLTFRM_CAM_ITF_DVP_CFG( - PLTFRM_CAM_ITF_BT656_8I, - PLTFRM_CAM_SIGNAL_HIGH_LEVEL, - PLTFRM_CAM_SIGNAL_HIGH_LEVEL, - PLTFRM_CAM_SDR_NEG_EDG, - ADV7181_EXT_CLK) - }, - /* For normal preview PAL 576i */ - { - .name = "adv7180_cvbs_pal_25fps", - .frm_fmt = { - .width = 720, - .height = 576, - .code = MEDIA_BUS_FMT_UYVY8_2X8 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 25 - } - }, - .reg_table = (void *)adv7180_cvbs_30fps, - .reg_table_num_entries = - sizeof(adv7180_cvbs_30fps) - / - sizeof(adv7180_cvbs_30fps[0]), - .v_blanking_time_us = 0, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - .ignore_measurement_check = 1, - PLTFRM_CAM_ITF_DVP_CFG( - PLTFRM_CAM_ITF_BT656_8I, - PLTFRM_CAM_SIGNAL_HIGH_LEVEL, - PLTFRM_CAM_SIGNAL_HIGH_LEVEL, - PLTFRM_CAM_SDR_NEG_EDG, - ADV7181_EXT_CLK) - }, -}; - -/*--------------------------------------------------------------------------*/ -static int adv7181_set_flip( - struct adv_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - return 0; -} - -static int adv7181_g_ctrl(struct adv_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - adv_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - adv_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int adv7181_g_timings(struct adv_camera_module *cam_mod, - struct adv_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - - timings->frame_length_lines = vts; - - return ret; -err: - adv_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int adv7181_s_ctrl(struct adv_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - adv_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - case V4L2_CID_FOCUS_ABSOLUTE: - /* todo*/ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - adv_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int adv7181_s_ext_ctrls(struct adv_camera_module *cam_mod, - struct adv_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - /* Handles only exposure and gain together special case. */ - if (ctrls->count == 1) - ret = adv7181_s_ctrl(cam_mod, ctrls->ctrls[0].id); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - adv_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int adv7181_start_streaming(struct adv_camera_module *cam_mod) -{ - int ret = 0; - - adv_camera_module_pr_debug(cam_mod, - "active config=%s\n", cam_mod->active_config->name); - - adv_camera_module_pr_debug(cam_mod, "=====streaming on ===\n"); - ret = adv_camera_module_write_reg(cam_mod, 0x03, 0x0c); - - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - adv_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int adv7181_stop_streaming(struct adv_camera_module *cam_mod) -{ - int ret = 0; - - adv_camera_module_pr_debug(cam_mod, "\n"); - ret = adv_camera_module_write_reg(cam_mod, 0x03, 0x4c); - - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - adv_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int adv7181_check_camera_id(struct adv_camera_module *cam_mod) -{ - u8 pid; - int ret = 0; - - adv_camera_module_pr_err(cam_mod, "\n"); - - ret |= adv_camera_module_read_reg(cam_mod, ADV7181_PID_ADDR, &pid); - if (IS_ERR_VALUE(ret)) { - adv_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if (pid == ADV7181_PID_MAGIC) - adv_camera_module_pr_err(cam_mod, - "successfully detected camera ID 0x%02x\n", - pid); - else { - adv_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x, detected 0x%02x\n", - ADV7181_PID_MAGIC, pid); - ret = -EINVAL; - goto err; - } - - return 0; -err: - adv_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -int adv_camera_7181_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - return 0; -} - -/* ======================================================================== */ - -int adv_camera_7181_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls) -{ - return 0; -} - -long adv_camera_7181_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - return 0; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops adv7181_camera_module_core_ops = { - .g_ctrl = adv_camera_module_g_ctrl, - .s_ctrl = adv_camera_module_s_ctrl, - .s_ext_ctrls = adv_camera_module_s_ext_ctrls, - .s_power = adv_camera_module_s_power, - .ioctl = adv_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops adv7181_camera_module_video_ops = { - .s_frame_interval = adv_camera_module_s_frame_interval, - .g_frame_interval = adv_camera_module_g_frame_interval, - .s_stream = adv_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops adv7181_camera_module_pad_ops = { - .enum_frame_interval = adv_camera_module_enum_frameintervals, - .get_fmt = adv_camera_module_g_fmt, - .set_fmt = adv_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops adv7181_camera_module_ops = { - .core = &adv7181_camera_module_core_ops, - .video = &adv7181_camera_module_video_ops, - .pad = &adv7181_camera_module_pad_ops -}; - -static struct adv_camera_module adv7181; - -static struct adv_camera_module_custom_config adv7181_custom_config = { - .start_streaming = adv7181_start_streaming, - .stop_streaming = adv7181_stop_streaming, - .s_ctrl = adv7181_s_ctrl, - .g_ctrl = adv7181_g_ctrl, - .s_ext_ctrls = adv7181_s_ext_ctrls, - .g_timings = adv7181_g_timings, - .set_flip = adv7181_set_flip, - .check_camera_id = adv7181_check_camera_id, - .configs = adv7181_configs, - .num_configs = ARRAY_SIZE(adv7181_configs), - .power_up_delays_ms = {5, 30, 30}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static ssize_t adv7181_debugfs_reg_write( - struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - struct adv_camera_module *cam_mod = - ((struct seq_file *)file->private_data)->private; - - char kbuf[30]; - int reg; - int reg_value; - int ret; - int nbytes = min(count, sizeof(kbuf) - 1); - - if (copy_from_user(kbuf, buf, nbytes)) - return -EFAULT; - - kbuf[nbytes] = '\0'; - adv_camera_module_pr_err(cam_mod, "kbuf is %s\n", kbuf); - ret = sscanf(kbuf, " %x %x", ®, ®_value); - adv_camera_module_pr_err(cam_mod, "ret = %d!\n", ret); - if (ret != 2) { - adv_camera_module_pr_err(cam_mod, "sscanf failed!\n"); - return 0; - } - - adv_camera_module_write_reg(cam_mod, (u8)reg, (u8)reg_value); - adv_camera_module_pr_err(cam_mod, - "%s(%d): read reg 0x%02x ---> 0x%x!\n", - __func__, __LINE__, - reg, reg_value); - - return count; -} - -static int adv7181_debugfs_reg_show(struct seq_file *s, void *v) -{ - int i; - u8 val; - struct adv_camera_module *cam_mod = s->private; - - adv_camera_module_pr_err(cam_mod, "test\n"); - - for (i = 0; i <= 0xff; i++) { - adv_camera_module_read_reg(cam_mod, (u8)i, &val); - seq_printf(s, "0x%02x : 0x%02x\n", i, val); - } - return 0; -} - -static int adv7181_debugfs_open(struct inode *inode, struct file *file) -{ - struct specific_sensor *spsensor = inode->i_private; - - return single_open(file, adv7181_debugfs_reg_show, spsensor); -} - -static const struct file_operations adv7181_debugfs_fops = { - .owner = THIS_MODULE, - .open = adv7181_debugfs_open, - .read = seq_read, - .write = adv7181_debugfs_reg_write, - .llseek = seq_lseek, - .release = single_release -}; - -static struct dentry *debugfs_dir; - -static int adv7181_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - v4l2_i2c_subdev_init(&adv7181.sd, client, - &adv7181_camera_module_ops); - - adv7181.custom = adv7181_custom_config; - - debugfs_dir = debugfs_create_dir("adv7181", NULL); - if (IS_ERR(debugfs_dir)) - printk(KERN_ERR "%s(%d): create debugfs dir failed!\n", - __func__, __LINE__); - else - debugfs_create_file("register", S_IRUSR, - debugfs_dir, &adv7181, - &adv7181_debugfs_fops); - - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -/* ======================================================================== */ - -static int adv7181_remove( - struct i2c_client *client) -{ - struct adv_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "remadving device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - adv_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id adv7181_id[] = { - { ADV7181_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id adv7181_of_match[] = { - {.compatible = "adi,adv7181-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, adv7181_id); - -static struct i2c_driver adv7181_i2c_driver = { - .driver = { - .name = ADV7181_DRIVER_NAME, - .of_match_table = adv7181_of_match - }, - .probe = adv7181_probe, - .remove = adv7181_remove, - .id_table = adv7181_id, -}; - -module_i2c_driver(adv7181_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for adv7181"); -MODULE_AUTHOR("Benjo"); -MODULE_LICENSE("GPL"); - diff --git a/drivers/media/i2c/soc_camera/rockchip/adv_camera_module.c b/drivers/media/i2c/soc_camera/rockchip/adv_camera_module.c deleted file mode 100644 index 3cabc32338c1..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/adv_camera_module.c +++ /dev/null @@ -1,1410 +0,0 @@ -/* - * adv_camera_module.c - * - * Generic adi sensor driver - * - * Copyright (C) 2017 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "adv_camera_module.h" - -static struct adv_camera_module *to_adv_camera_module(struct v4l2_subdev *sd) -{ - return container_of(sd, struct adv_camera_module, sd); -} - -/* ======================================================================== */ - -static void adv_camera_module_reset( - struct adv_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->inited = false; - cam_mod->active_config = NULL; - cam_mod->update_config = true; - cam_mod->frm_fmt_valid = false; - cam_mod->frm_intrvl_valid = false; - cam_mod->exp_config.auto_exp = false; - cam_mod->exp_config.auto_gain = false; - cam_mod->wb_config.auto_wb = false; - cam_mod->auto_adjust_fps = true; - cam_mod->rotation = 0; - cam_mod->ctrl_updt = 0; - cam_mod->state = ADV_CAMERA_MODULE_POWER_OFF; - cam_mod->state_before_suspend = ADV_CAMERA_MODULE_POWER_OFF; - - cam_mod->exp_config.exp_time = 0; - cam_mod->exp_config.gain = 0; - cam_mod->vts_cur = 0; -} - -/* ======================================================================== */ - -static void adv_camera_module_set_active_config( - struct adv_camera_module *cam_mod, - struct adv_camera_module_config *new_config) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(new_config)) { - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no active config\n"); - } else { - cam_mod->ctrl_updt &= ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP | - ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN | - ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - if (new_config->auto_exp_enabled != - cam_mod->exp_config.auto_exp) { - cam_mod->ctrl_updt |= - ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = - new_config->auto_exp_enabled; - } - if (new_config->auto_gain_enabled != - cam_mod->exp_config.auto_gain) { - cam_mod->ctrl_updt |= - ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = - new_config->auto_gain_enabled; - } - if (new_config->auto_wb_enabled != - cam_mod->wb_config.auto_wb) { - cam_mod->ctrl_updt |= - ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = - new_config->auto_wb_enabled; - } - if (new_config != cam_mod->active_config) { - cam_mod->update_config = true; - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "activating config '%s'\n", - cam_mod->active_config->name); - } - } -} - -/* ======================================================================== */ - -static struct adv_camera_module_config *adv_camera_module_find_config( - struct adv_camera_module *cam_mod, - struct v4l2_mbus_framefmt *fmt, - struct v4l2_subdev_frame_interval *frm_intrvl) -{ - u32 i; - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - - if (!IS_ERR_OR_NULL(fmt)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (!IS_ERR_OR_NULL(frm_intrvl)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "frame interval %d/%d\n", - frm_intrvl->interval.numerator, - frm_intrvl->interval.denominator); - - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (!IS_ERR_OR_NULL(frm_intrvl)) { - gcdiv = gcd(cam_mod->custom.configs[i]. - frm_intrvl.interval.numerator, - cam_mod->custom.configs[i]. - frm_intrvl.interval.denominator); - norm_interval.interval.numerator = - cam_mod->custom.configs[i]. - frm_intrvl.interval.numerator / gcdiv; - norm_interval.interval.denominator = - cam_mod->custom.configs[i]. - frm_intrvl.interval.denominator / gcdiv; - if ((frm_intrvl->interval.numerator != - norm_interval.interval.numerator) || - (frm_intrvl->interval.denominator != - norm_interval.interval.denominator)) - continue; - } - if (!IS_ERR_OR_NULL(fmt)) { - if ((cam_mod->custom.configs[i].frm_fmt.width != - fmt->width) || - (cam_mod->custom.configs[i].frm_fmt.height != - fmt->height) || - (cam_mod->custom.configs[i].frm_fmt.code != - fmt->code)) { - continue; - } - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "found matching config %s\n", - cam_mod->custom.configs[i].name); - return &cam_mod->custom.configs[i]; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no matching config found\n"); - - return ERR_PTR(-EINVAL); -} - -/* ======================================================================== */ - -static int adv_camera_module_write_config( - struct adv_camera_module *cam_mod) -{ - int ret = 0; - struct adv_camera_module_reg *reg_table; - u32 reg_table_num_entries; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - - if (!cam_mod->inited) { - cam_mod->active_config->soft_reset = true; - reg_table = cam_mod->active_config->reg_table; - reg_table_num_entries = - cam_mod->active_config->reg_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s\n", - cam_mod->active_config->name); - } else { - if (cam_mod->active_config->reg_diff_table && - cam_mod->active_config->reg_diff_table_num_entries) { - cam_mod->active_config->soft_reset = false; - reg_table = cam_mod->active_config->reg_diff_table; - reg_table_num_entries = - cam_mod->active_config->reg_diff_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s%s\n", - cam_mod->active_config->name, "_diff"); - } else { - cam_mod->active_config->soft_reset = true; - reg_table = cam_mod->active_config->reg_table; - reg_table_num_entries = - cam_mod->active_config->reg_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s\n", - cam_mod->active_config->name); - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.set_flip)) - cam_mod->custom.set_flip(cam_mod, - reg_table, reg_table_num_entries); - - ret = adv_camera_module_write_reglist(cam_mod, - reg_table, (int)reg_table_num_entries); - if (IS_ERR_VALUE(ret)) - goto err; - ret = pltfrm_camera_module_patch_config(&cam_mod->sd, - &cam_mod->frm_fmt, - &cam_mod->frm_intrvl); - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -static int adv_camera_module_attach( - struct adv_camera_module *cam_mod) -{ - int ret = 0; - struct adv_camera_module_custom_config *custom; - - custom = &cam_mod->custom; - - if (custom->check_camera_id) { - adv_camera_module_s_power(&cam_mod->sd, 1); - ret = custom->check_camera_id(cam_mod); - adv_camera_module_s_power(&cam_mod->sd, 0); - if (ret != 0) - goto err; - } - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - adv_camera_module_release(cam_mod); - return ret; -} - -/* ======================================================================== */ - -int adv_camera_module_try_fmt(struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *fmt) -{ - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(adv_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "format not supported\n"); - return -EINVAL; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, "format supported\n"); - - return 0; -} - -/* ======================================================================== */ - -int adv_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(adv_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "format %dx%d, code 0x%04x, not supported\n", - fmt->width, fmt->height, fmt->code); - ret = -EINVAL; - goto err; - } - cam_mod->frm_fmt_valid = true; - cam_mod->frm_fmt = *fmt; - if (cam_mod->frm_intrvl_valid) { - adv_camera_module_set_active_config(cam_mod, - adv_camera_module_find_config(cam_mod, - fmt, &cam_mod->frm_intrvl)); - } else { - adv_camera_module_set_active_config(cam_mod, - adv_camera_module_find_config(cam_mod, - fmt, NULL)); - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int adv_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->active_config) { - fmt->code = cam_mod->active_config->frm_fmt.code; - fmt->width = cam_mod->active_config->frm_fmt.width; - fmt->height = cam_mod->active_config->frm_fmt.height; - return 0; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "no active config\n"); - - return -1; -} - -/* ======================================================================== */ - -int adv_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - struct adv_camera_module_config *config; - unsigned int vts; - int ret = 0; - - if ((interval->interval.denominator == 0) || - (interval->interval.numerator == 0)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "invalid frame interval %d/%d\n", - interval->interval.numerator, - interval->interval.denominator); - ret = -EINVAL; - goto err; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d/%d (%dfps)\n", - interval->interval.numerator, interval->interval.denominator, - (interval->interval.denominator + - (interval->interval.numerator >> 1)) / - interval->interval.numerator); - - /* normalize interval */ - gcdiv = gcd(interval->interval.numerator, - interval->interval.denominator); - norm_interval.interval.numerator = - interval->interval.numerator / gcdiv; - norm_interval.interval.denominator = - interval->interval.denominator / gcdiv; - - if (!cam_mod->frm_fmt_valid) - goto end; - config = adv_camera_module_find_config( - cam_mod, - &cam_mod->active_config->frm_fmt, - &norm_interval); - - if (!IS_ERR_OR_NULL(config) && (config != cam_mod->active_config)) { - adv_camera_module_set_active_config(cam_mod, config); - if (cam_mod->state == ADV_CAMERA_MODULE_STREAMING) { - cam_mod->custom.stop_streaming(cam_mod); - adv_camera_module_write_config(cam_mod); - cam_mod->custom.start_streaming(cam_mod); - } - } else { - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - if (cam_mod->active_config->frm_intrvl.interval.denominator < - norm_interval.interval.denominator) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "%dx%d@%dfps isn't support!", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - norm_interval.interval.denominator); - ret = -EFAULT; - goto err; - } - if (!cam_mod->custom.s_vts) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "custom.s_vts isn't support!"); - ret = -EFAULT; - goto err; - } - - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= norm_interval.interval.denominator; - cam_mod->vts_cur = vts; - - if (cam_mod->state != ADV_CAMERA_MODULE_STREAMING) - goto end; - - cam_mod->custom.s_vts(cam_mod, vts); - } - -end: - cam_mod->frm_intrvl_valid = true; - cam_mod->frm_intrvl = norm_interval; - cam_mod->auto_adjust_fps = false; - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -int adv_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - - if (cam_mod->active_config) { - if (cam_mod->state == ADV_CAMERA_MODULE_STREAMING) { - if (cam_mod->frm_intrvl_valid) { - *interval = cam_mod->frm_intrvl; - return 0; - } else { - *interval = cam_mod->active_config->frm_intrvl; - return 0; - } - } - } - - return -EFAULT; -} - -/* ======================================================================== */ - -int adv_camera_module_s_stream(struct v4l2_subdev *sd, int enable) -{ - int ret = 0; - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - unsigned int vts; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", enable); - - if (enable) { - if (cam_mod->state == ADV_CAMERA_MODULE_STREAMING) - return 0; - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration, cannot start streaming\n"); - ret = -EFAULT; - goto err; - } - if (cam_mod->state != ADV_CAMERA_MODULE_SW_STANDBY) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "sensor is not powered on (in state %d), cannot start streaming\n", - cam_mod->state); - ret = -EINVAL; - goto err; - } - if (cam_mod->update_config) { - ret = adv_camera_module_write_config(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - } - - ret = cam_mod->custom.start_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - if (cam_mod->frm_intrvl_valid) { - if ((cam_mod->frm_intrvl.interval.numerator != - cam_mod->active_config->frm_intrvl.interval.numerator) || - (cam_mod->frm_intrvl.interval.denominator != - cam_mod->active_config->frm_intrvl.interval.denominator)) { - if (cam_mod->frm_intrvl.interval.denominator > - cam_mod->active_config->frm_intrvl.interval.denominator) { - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "sensor is not support stream: %dx%d@(%d/%d)fps!\n", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - cam_mod->frm_intrvl.interval.denominator, - cam_mod->frm_intrvl.interval.numerator); - goto end; - } - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= cam_mod->frm_intrvl.interval.denominator; - cam_mod->custom.s_vts(cam_mod, vts); - } - } - - if (!cam_mod->inited && cam_mod->update_config) - cam_mod->inited = true; - cam_mod->update_config = false; - cam_mod->ctrl_updt = 0; - mdelay(cam_mod->custom.power_up_delays_ms[2]); - cam_mod->state = ADV_CAMERA_MODULE_STREAMING; - } else { - int pclk; - int wait_ms; - struct isp_supplemental_sensor_mode_data timings; - - if (cam_mod->state != ADV_CAMERA_MODULE_STREAMING) - return 0; - ret = cam_mod->custom.stop_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = adv_camera_module_ioctl(sd, - RK_VIDIOC_SENSOR_MODE_DATA, - &timings); - - cam_mod->state = ADV_CAMERA_MODULE_SW_STANDBY; - - if (IS_ERR_VALUE(ret)) - goto err; - - pclk = timings.vt_pix_clk_freq_hz / 1000; - - if (!pclk) - goto err; - - wait_ms = - (timings.line_length_pck * - timings.frame_length_lines) / - pclk; - - /* - * wait for a frame period to make sure that there is - * no pending frame left. - */ - - msleep(wait_ms + 1); - } - -end: - cam_mod->state_before_suspend = cam_mod->state; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int adv_camera_module_s_power(struct v4l2_subdev *sd, int on) -{ - int ret = 0; - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - struct v4l2_subdev *af_ctrl; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", on); - - if (on) { - if (cam_mod->state == ADV_CAMERA_MODULE_POWER_OFF) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 1); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[0]); - cam_mod->state = ADV_CAMERA_MODULE_HW_STANDBY; - } - } - if (cam_mod->state == ADV_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[1]); - cam_mod->state = ADV_CAMERA_MODULE_SW_STANDBY; - if (!IS_ERR_OR_NULL( - cam_mod->custom.init_common) && - cam_mod->custom.init_common( - cam_mod)) - usleep_range(1000, 1500); - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - v4l2_subdev_call(af_ctrl, - core, init, 0); - } - } - } - if (cam_mod->update_config) { - adv_camera_module_write_config(cam_mod); - cam_mod->update_config = false; - } - } else { - if (cam_mod->state == ADV_CAMERA_MODULE_STREAMING) { - ret = adv_camera_module_s_stream(sd, 0); - if (!IS_ERR_VALUE(ret)) - cam_mod->state = ADV_CAMERA_MODULE_SW_STANDBY; - } - if (cam_mod->state == ADV_CAMERA_MODULE_SW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - - if (!IS_ERR_VALUE(ret)) - cam_mod->state = ADV_CAMERA_MODULE_HW_STANDBY; - } - if (cam_mod->state == ADV_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 0); - if (!IS_ERR_VALUE(ret)) { - cam_mod->state = ADV_CAMERA_MODULE_POWER_OFF; - adv_camera_module_reset(cam_mod); - } - } - } - - cam_mod->state_before_suspend = cam_mod->state; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "%s failed, camera left in state %d\n", - on ? "on" : "off", cam_mod->state); - goto err; - } else - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "camera powered %s\n", on ? "on" : "off"); - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int adv_camera_module_g_ctrl(struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - int ret; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, " id 0x%x\n", ctrl->id); - - if (ctrl->id == V4L2_CID_FLASH_LED_MODE) { - ctrl->value = cam_mod->exp_config.flash_mode; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_HFLIP) { - ctrl->value = cam_mod->hflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_HFLIP %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_VFLIP) { - ctrl->value = cam_mod->vflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_VFLIP %d\n", - ctrl->value); - return 0; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active configuration\n"); - return -EFAULT; - } - - if (ctrl->id == RK_V4L2_CID_VBLANKING) { - ctrl->value = cam_mod->active_config->v_blanking_time_us; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_VBLANKING %d\n", - ctrl->value); - return 0; - } - - if ((cam_mod->state != ADV_CAMERA_MODULE_SW_STANDBY) && - (cam_mod->state != ADV_CAMERA_MODULE_STREAMING)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cannot get controls when camera is off\n"); - return -EFAULT; - } - - if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - ret = v4l2_subdev_call(af_ctrl, core, g_ctrl, ctrl); - return ret; - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.g_ctrl)) { - ret = cam_mod->custom.g_ctrl(cam_mod, ctrl->id); - if (IS_ERR_VALUE(ret)) - return ret; - } - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl->value = cam_mod->exp_config.gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE: - ctrl->value = cam_mod->exp_config.exp_time; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl->value = cam_mod->wb_config.temperature; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.preset_id; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl->value = cam_mod->exp_config.auto_gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl->value = cam_mod->exp_config.auto_exp; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.auto_wb; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - ctrl->value = cam_mod->af_config.abs_pos; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - default: - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed, unknown ctrl %d\n", ctrl->id); - return -EINVAL; - } - - return 0; -} - -static int flash_light_ctrl( - struct v4l2_subdev *sd, - struct adv_camera_module *cam_mod, - int value) -{ - return 0; -} - -/* ======================================================================== */ - -int adv_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls) -{ - int i; - int ctrl_cnt = 0; - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - struct adv_camera_module_ext_ctrls adv_ctrls; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - if (ctrls->count == 0) - return -EINVAL; - - for (i = 0; i < ctrls->count; i++) { - struct v4l2_ext_control *ctrl; - u32 ctrl_updt = 0; - - ctrl = &ctrls->controls[i]; - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl_updt = ADV_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case RK_V4L2_CID_GAIN_PERCENT: - ctrl_updt = ADV_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain_percent = ctrl->value; - break; - case V4L2_CID_FLASH_LED_MODE: - ret = flash_light_ctrl(sd, cam_mod, ctrl->value); - if (ret == 0) { - cam_mod->exp_config.flash_mode = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - } - break; - case V4L2_CID_EXPOSURE: - ctrl_updt = ADV_CAMERA_MODULE_CTRL_UPDT_EXP_TIME; - cam_mod->exp_config.exp_time = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_VTS: - ctrl_updt = ADV_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE; - cam_mod->exp_config.vts_value = ctrl->value; - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl_updt = ADV_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE; - cam_mod->wb_config.temperature = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl_updt = ADV_CAMERA_MODULE_CTRL_UPDT_PRESET_WB; - cam_mod->wb_config.preset_id = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl_updt = ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl_updt = ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl_updt = ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_AUTO_FPS: - cam_mod->auto_adjust_fps = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_AUTO_FPS %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - struct v4l2_control single_ctrl; - - single_ctrl.id = - V4L2_CID_FOCUS_ABSOLUTE; - single_ctrl.value = ctrl->value; - ret = v4l2_subdev_call(af_ctrl, - core, s_ctrl, &single_ctrl); - return ret; - } - } - ctrl_updt = - ADV_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE; - cam_mod->af_config.abs_pos = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - case V4L2_CID_HFLIP: - if (ctrl->value) - cam_mod->hflip = true; - else - cam_mod->hflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_VFLIP: - if (ctrl->value) - cam_mod->vflip = true; - else - cam_mod->vflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_TEST_PATTERN: - adv_ctrls.ctrls = - kmalloc_array(ctrls->count, - sizeof(*adv_ctrls.ctrls), - GFP_KERNEL); - if (adv_ctrls.ctrls) { - for (i = 0; i < ctrls->count; i++) { - adv_ctrls.ctrls[i].id = - ctrls->controls[i].id; - adv_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - adv_ctrls.count = ctrls->count; - ret = cam_mod->custom.s_ext_ctrls(cam_mod, - &adv_ctrls); - } - kfree(adv_ctrls.ctrls); - break; - default: - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "ignoring unknown ctrl 0x%x\n", ctrl->id); - break; - } - - if (cam_mod->state != ADV_CAMERA_MODULE_SW_STANDBY && - cam_mod->state != ADV_CAMERA_MODULE_STREAMING) - cam_mod->ctrl_updt |= ctrl_updt; - else if (ctrl_updt) - ctrl_cnt++; - } - - /* if camera module is already streaming, write through */ - if (ctrl_cnt && - (cam_mod->state == ADV_CAMERA_MODULE_STREAMING || - cam_mod->state == ADV_CAMERA_MODULE_SW_STANDBY)) { - struct adv_camera_module_ext_ctrls adv_ctrls; - - adv_ctrls.ctrls = - (struct adv_camera_module_ext_ctrl *) - kmalloc(ctrl_cnt * sizeof(struct adv_camera_module_ext_ctrl), - GFP_KERNEL); - - if (adv_ctrls.ctrls) { - for (i = 0; i < ctrl_cnt; i++) { - adv_ctrls.ctrls[i].id = ctrls->controls[i].id; - adv_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - - adv_ctrls.count = ctrl_cnt; - - ret = cam_mod->custom.s_ext_ctrls(cam_mod, &adv_ctrls); - - kfree(adv_ctrls.ctrls); - } else { - ret = -ENOMEM; - } - if (IS_ERR_VALUE(ret)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed with error %d\n", ret); - } - - return ret; -} - -/* ======================================================================== */ - -int adv_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - struct v4l2_ext_control ext_ctrl[1]; - struct v4l2_ext_controls ext_ctrls; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "0x%x 0x%x\n", ctrl->id, ctrl->value); - - ext_ctrl[0].id = ctrl->id; - ext_ctrl[0].value = ctrl->value; - - ext_ctrls.count = 1; - ext_ctrls.controls = ext_ctrl; - - return adv_camera_module_s_ext_ctrls(sd, &ext_ctrls); -} - -/* ======================================================================== */ - -long adv_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - int ret, i; - unsigned int flag, val; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "cmd: 0x%x\n", cmd); - - if (cmd == RK_VIDIOC_SENSOR_MODE_DATA) { - struct adv_camera_module_timings adv_timings; - struct isp_supplemental_sensor_mode_data *timings = - (struct isp_supplemental_sensor_mode_data *)arg; - - if (cam_mod->custom.g_timings) - ret = cam_mod->custom.g_timings(cam_mod, &adv_timings); - else - ret = -EPERM; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; - } - - timings->sensor_output_width = adv_timings.sensor_output_width; - timings->sensor_output_height = adv_timings.sensor_output_height; - timings->crop_horizontal_start = - adv_timings.crop_horizontal_start; - timings->crop_vertical_start = adv_timings.crop_vertical_start; - timings->crop_horizontal_end = adv_timings.crop_horizontal_end; - timings->crop_vertical_end = adv_timings.crop_vertical_end; - timings->line_length_pck = adv_timings.line_length_pck; - timings->frame_length_lines = adv_timings.frame_length_lines; - timings->vt_pix_clk_freq_hz = adv_timings.vt_pix_clk_freq_hz; - timings->binning_factor_x = adv_timings.binning_factor_x; - timings->binning_factor_y = adv_timings.binning_factor_y; - timings->coarse_integration_time_max_margin = - adv_timings.coarse_integration_time_max_margin; - timings->coarse_integration_time_min = - adv_timings.coarse_integration_time_min; - timings->fine_integration_time_max_margin = - adv_timings.fine_integration_time_max_margin; - timings->fine_integration_time_min = - adv_timings.fine_integration_time_min; - - timings->exposure_valid_frame[0] = - cam_mod->custom.exposure_valid_frame[0]; - timings->exposure_valid_frame[1] = - cam_mod->custom.exposure_valid_frame[1]; - if (cam_mod->exp_config.exp_time) - timings->exp_time = cam_mod->exp_config.exp_time; - else - timings->exp_time = adv_timings.exp_time; - if (cam_mod->exp_config.gain) - timings->gain = cam_mod->exp_config.gain; - else - timings->gain = adv_timings.gain; - - if (cam_mod->active_config) { - timings->max_exp_gain_h = cam_mod->active_config->max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->active_config->max_exp_gain_l; - } else { - timings->max_exp_gain_h = cam_mod->custom.configs[0].max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->custom.configs[0].max_exp_gain_l; - } - return ret; - } else if (cmd == RK_VIDIOC_SENSOR_CONFIGINFO) { - struct sensor_config_info_s *sensor_config = (struct sensor_config_info_s *)arg; - - sensor_config->config_num = cam_mod->custom.num_configs; - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (i >= SENSOR_CONFIG_NUM) - break; - sensor_config->sensor_fmt[i] = - pltfrm_camera_module_pix_fmt2csi2_dt(cam_mod->custom.configs[i].frm_fmt.code); - sensor_config->reso[i].width = cam_mod->custom.configs[i].frm_fmt.width; - sensor_config->reso[i].height = cam_mod->custom.configs[i].frm_fmt.height; - } - return 0; - } else if (cmd == RK_VIDIOC_SENSOR_REG_ACCESS) { - struct sensor_reg_rw_s *sensor_rw = (struct sensor_reg_rw_s *)arg; - - if (sensor_rw->reg_access_mode == SENSOR_READ_MODE) { - for (i = 0; i < cam_mod->custom.configs[0].reg_table_num_entries; i++) { - flag = cam_mod->custom.configs[0].reg_table[i].flag; - if (flag != PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) - break; - } - if (flag == PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "Can not get sensor reg type.\n"); - return -EINVAL; - } - sensor_rw->reg_addr_len = PLTFRM_CAMERA_MODULE_REG_LEN(flag); - sensor_rw->reg_data_len = PLTFRM_CAMERA_MODULE_DATA_LEN(flag); - pltfrm_camera_module_read_reg_ex(&cam_mod->sd, 1, flag, sensor_rw->addr, &val); - sensor_rw->data = val; - } else { - flag = (sensor_rw->reg_addr_len << PLTFRM_CAMERA_MODULE_REG_LEN_BIT); - flag |= (sensor_rw->reg_data_len << PLTFRM_CAMERA_MODULE_DATA_LEN_BIT); - pltfrm_camera_module_write_reg_ex(&cam_mod->sd, flag, sensor_rw->addr, sensor_rw->data); - } - return 0; - } else if (cmd == PLTFRM_CIFCAM_G_ITF_CFG) { - struct pltfrm_cam_itf *itf_cfg = (struct pltfrm_cam_itf *)arg; - struct adv_camera_module_config *config; - - if (cam_mod->custom.num_configs <= 0) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cam_mod->custom.num_configs is NULL, Get interface config failed!\n"); - return -EINVAL; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - config = &cam_mod->custom.configs[0]; - else - config = cam_mod->active_config; - - *itf_cfg = config->itf_cfg; - - pltfrm_camera_module_ioctl(sd, PLTFRM_CIFCAM_G_ITF_CFG, arg); - return 0; - } else if (cmd == PLTFRM_CIFCAM_ATTACH) { - ret = adv_camera_module_init(cam_mod, &cam_mod->custom); - if (!IS_ERR_VALUE(ret)) { - pltfrm_camera_module_ioctl(sd, cmd, arg); - return adv_camera_module_attach(cam_mod); - } else { - adv_camera_module_release(cam_mod); - return ret; - } - } - - ret = pltfrm_camera_module_ioctl(sd, cmd, arg); - return ret; -} - -/* ======================================================================== */ - -int adv_camera_module_get_flip_mirror( - struct adv_camera_module *cam_mod) -{ - int mode = 0; - - if (!cam_mod->flip_flg) - return -1; - - if (cam_mod->hflip) - mode |= ADV_MIRROR_BIT_MASK; - else - mode &= ~ADV_MIRROR_BIT_MASK; - - if (cam_mod->vflip) - mode |= ADV_FLIP_BIT_MASK; - else - mode &= ~ADV_FLIP_BIT_MASK; - - return mode; -} - -/* ======================================================================== */ - -int adv_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie) -{ - struct adv_camera_module *cam_mod = to_adv_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", fie->index); - - if (fie->index >= cam_mod->custom.num_configs) - return -EINVAL; - fie->code = - cam_mod->custom.configs[fie->index].frm_fmt.code; - fie->width = - cam_mod->custom.configs[fie->index].frm_fmt.width; - fie->height = - cam_mod->custom.configs[fie->index].frm_fmt.height; - fie->interval.numerator = cam_mod->custom. - configs[fie->index].frm_intrvl.interval.numerator; - fie->interval.denominator = cam_mod->custom. - configs[fie->index].frm_intrvl.interval.denominator; - - return 0; -} - -/* ======================================================================== */ - -int adv_camera_module_write_reg( - struct adv_camera_module *cam_mod, - u8 reg, - u8 val) -{ - struct i2c_client *client = v4l2_get_subdevdata(&cam_mod->sd); - int ret = 0; - struct i2c_msg msg; - unsigned char data[2]; - int retries; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(&cam_mod->sd, "client->adapter NULL\n"); - return -ENODEV; - } - - for (retries = 0; retries < 5; retries++) { - msg.addr = client->addr; - msg.flags = 0; - msg.len = 2; - msg.buf = data; - - data[0] = reg; - data[1] = val; - - ret = i2c_transfer(client->adapter, &msg, 1); - if (ret == 1) { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "i2c write to offset 0x%02x success\n", reg); - return 0; - } - - pltfrm_camera_module_pr_err(&cam_mod->sd, - "retrying I2C... %d\n", retries); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(msecs_to_jiffies(20)); - } - pltfrm_camera_module_pr_err(&cam_mod->sd, - "i2c write to offset 0x%02x failed with error %d\n", reg, ret); - return ret; -} - -/* ======================================================================== */ - -int adv_camera_module_read_reg( - struct adv_camera_module *cam_mod, - u8 reg, - u8 *val) -{ - struct i2c_client *client = v4l2_get_subdevdata(&cam_mod->sd); - int ret = 0; - struct i2c_msg msg[2]; - char data[2]; - char pval; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(&cam_mod->sd, "client->adapter NULL\n"); - return -ENODEV; - } - - data[0] = reg; - msg[0].addr = client->addr; - msg[0].flags = 0; - msg[0].len = 1; - msg[0].buf = data; - - msg[1].addr = client->addr; - msg[1].flags = 1; - msg[1].len = 1; - msg[1].buf = &pval; - - ret = i2c_transfer(client->adapter, msg, 2); - if (ret >= 0) { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "i2c read from 0x%02x return 0x%02x\n", - reg, - pval); - - *val = pval; - return 0; - } - pltfrm_camera_module_pr_err(&cam_mod->sd, - "i2c read from offset 0x%02x failed with error %d\n", reg, ret); - return ret; -} - -/* ======================================================================== */ - -int adv_camera_module_read_reg_table( - struct adv_camera_module *cam_mod, - u16 reg, - u32 *val) -{ - int i; - - if (cam_mod->state == ADV_CAMERA_MODULE_STREAMING) - return pltfrm_camera_module_read_reg(&cam_mod->sd, - 1, reg, val); - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - for ( - i = cam_mod->active_config->reg_table_num_entries - 1; - i > 0; - i--) { - if (cam_mod->active_config->reg_table[i].reg == reg) { - *val = cam_mod->active_config->reg_table[i].val; - return 0; - } - } - } - - if (cam_mod->state == ADV_CAMERA_MODULE_SW_STANDBY) - return pltfrm_camera_module_read_reg(&cam_mod->sd, - 1, reg, val); - - return -EFAULT; -} - -/* ======================================================================== */ - -int adv_camera_module_write_reglist( - struct adv_camera_module *cam_mod, - const struct adv_camera_module_reg reglist[], - int len) -{ - int i; - int ret = 0; - - for (i = 0; i < len; i++) - ret |= adv_camera_module_write_reg(cam_mod, - reglist[i].reg, - reglist[i].val); - - return ret; -} - -int adv_camera_module_init(struct adv_camera_module *cam_mod, - struct adv_camera_module_custom_config *custom) -{ - int ret = 0; - int mode = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->hflip = false; - cam_mod->vflip = false; - cam_mod->flip_flg = false; - adv_camera_module_reset(cam_mod); - - if (IS_ERR_OR_NULL(custom->start_streaming) || - IS_ERR_OR_NULL(custom->stop_streaming) || - IS_ERR_OR_NULL(custom->s_ctrl) || - IS_ERR_OR_NULL(custom->g_ctrl)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "mandatory callback function is missing\n"); - ret = -EINVAL; - goto err; - } - - ret = pltfrm_camera_module_init(&cam_mod->sd, &cam_mod->pltfm_data); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - if (IS_ERR_VALUE(ret)) { - adv_camera_module_release(cam_mod); - goto err; - } - - mode = pltfrm_camera_module_get_flip_mirror(&cam_mod->sd); - if (mode != -1) { - cam_mod->hflip = mode & ADV_MIRROR_BIT_MASK ? true : false; - cam_mod->vflip = mode & ADV_FLIP_BIT_MASK ? true : false; - cam_mod->flip_flg = true; - } - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -void adv_camera_module_release(struct adv_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->otp_work.wq) { - flush_workqueue(cam_mod->otp_work.wq); - destroy_workqueue(cam_mod->otp_work.wq); - cam_mod->otp_work.wq = NULL; - } - - cam_mod->custom.configs = NULL; - - pltfrm_camera_module_release(&cam_mod->sd); - v4l2_device_unregister_subdev(&cam_mod->sd); -} diff --git a/drivers/media/i2c/soc_camera/rockchip/adv_camera_module.h b/drivers/media/i2c/soc_camera/rockchip/adv_camera_module.h deleted file mode 100644 index 392ba60be313..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/adv_camera_module.h +++ /dev/null @@ -1,295 +0,0 @@ -/* - * adv_camera_module.h - * - * Generic adi sensor driver - * - * Copyright (C) 2017 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#ifndef ADV_CAMERA_MODULE_H -#define ADV_CAMERA_MODULE_H -#include -#include -#include - -/* - * TODO: references to v4l2 should be reomved from here and go into a - * platform dependent wrapper - */ - -#define ADV_CAMERA_MODULE_REG_TYPE_DATA PLTFRM_CAMERA_MODULE_REG_TYPE_DATA -#define ADV_CAMERA_MODULE_REG_TYPE_TIMEOUT PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT -#define adv_camera_module_csi_config -#define adv_camera_module_reg pltfrm_camera_module_reg -#define ADV_FLIP_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_FLIP_BIT) -#define ADV_MIRROR_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_MIRROR_BIT) - -#define ADV_CAMERA_MODULE_CTRL_UPDT_GAIN 0x01 -#define ADV_CAMERA_MODULE_CTRL_UPDT_EXP_TIME 0x02 -#define ADV_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE 0x04 -#define ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_WB 0x08 -#define ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN 0x10 -#define ADV_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP 0x20 -#define ADV_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE 0x40 -#define ADV_CAMERA_MODULE_CTRL_UPDT_PRESET_WB 0x80 -#define ADV_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE 0x100 - -enum adv_camera_module_state { - ADV_CAMERA_MODULE_POWER_OFF = 0, - ADV_CAMERA_MODULE_HW_STANDBY = 1, - ADV_CAMERA_MODULE_SW_STANDBY = 2, - ADV_CAMERA_MODULE_STREAMING = 3 -}; - -struct adv_camera_module; - -struct adv_camera_module_timings { - /* public */ - u32 coarse_integration_time_min; - u32 coarse_integration_time_max_margin; - u32 fine_integration_time_min; - u32 fine_integration_time_max_margin; - u32 frame_length_lines; - u32 line_length_pck; - u32 vt_pix_clk_freq_hz; - u32 sensor_output_width; - u32 sensor_output_height; - u32 crop_horizontal_start; /* Sensor crop start cord. (x0,y0) */ - u32 crop_vertical_start; - u32 crop_horizontal_end; /* Sensor crop end cord. (x1,y1) */ - u32 crop_vertical_end; - u8 binning_factor_x; - u8 binning_factor_y; - u32 exp_time; - u32 gain; -}; - -struct adv_camera_module_config { - const char *name; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - bool auto_exp_enabled; - bool auto_gain_enabled; - bool auto_wb_enabled; - struct adv_camera_module_reg *reg_table; - u32 reg_table_num_entries; - struct adv_camera_module_reg *reg_diff_table; - u32 reg_diff_table_num_entries; - u32 v_blanking_time_us; - u32 line_length_pck; - u32 frame_length_lines; - struct adv_camera_module_timings timings; - bool soft_reset; - bool ignore_measurement_check; - u8 max_exp_gain_h; - u8 max_exp_gain_l; - struct pltfrm_cam_itf itf_cfg; -}; - -struct adv_camera_module_exp_config { - s32 exp_time; - bool auto_exp; - u16 gain; - u16 gain_percent; - bool auto_gain; - enum v4l2_flash_led_mode flash_mode; - u32 vts_value; -}; - -struct adv_camera_module_wb_config { - u32 temperature; - u32 preset_id; - bool auto_wb; -}; - -struct adv_camera_module_af_config { - u32 abs_pos; - u32 rel_pos; -}; - -struct adv_camera_module_ext_ctrl { - /* public */ - u32 id; - u32 value; - __u32 reserved2[1]; -}; - -struct adv_camera_module_ext_ctrls { - /* public */ - u32 count; - struct adv_camera_module_ext_ctrl *ctrls; -}; - -/* - * start_streaming: (mandatory) will be called when sensor should be - * put into streaming mode right after the base config has been - * written to the sensor. After a successful call of this function - * the sensor should start delivering frame data. - * - * stop_streaming: (mandatory) will be called when sensor should stop - * delivering data. After a successful call of this function the - * sensor should not deliver any more frame data. - * - * check_camera_id: (optional) will be called when the sensor is - * powered on. If pradvided should check the sensor ID/version - * required by the custom driver. Register access should be - * possible when this function is invoked. - * - * s_ctrl: (mandatory) will be called at the successful end of - * adv_camera_module_s_ctrl with the ctrl_id as argument. - * - * priv: (optional) for private data used by the custom driver. - */ -struct adv_camera_module_custom_config { - int (*start_streaming)(struct adv_camera_module *cam_mod); - int (*stop_streaming)(struct adv_camera_module *cam_mod); - int (*check_camera_id)(struct adv_camera_module *cam_mod); - int (*s_ctrl)(struct adv_camera_module *cam_mod, u32 ctrl_id); - int (*g_ctrl)(struct adv_camera_module *cam_mod, u32 ctrl_id); - int (*g_timings)(struct adv_camera_module *cam_mod, - struct adv_camera_module_timings *timings); - int (*s_vts)(struct adv_camera_module *cam_mod, - u32 vts); - int (*s_ext_ctrls)(struct adv_camera_module *cam_mod, - struct adv_camera_module_ext_ctrls *ctrls); - int (*set_flip)( - struct adv_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len); - int (*init_common)(struct adv_camera_module *cam_mod); - int (*read_otp)(struct adv_camera_module *cam_mod); - struct adv_camera_module_config *configs; - u32 num_configs; - u32 power_up_delays_ms[3]; - unsigned short exposure_valid_frame[2]; - void *priv; -}; - -struct adv_camera_module_otp_work { - struct work_struct work; - struct workqueue_struct *wq; - void *cam_mod; -}; - -struct adv_camera_module { - /* public */ - struct v4l2_subdev sd; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - struct adv_camera_module_exp_config exp_config; - struct adv_camera_module_wb_config wb_config; - struct adv_camera_module_af_config af_config; - struct adv_camera_module_custom_config custom; - enum adv_camera_module_state state; - enum adv_camera_module_state state_before_suspend; - struct adv_camera_module_config *active_config; - struct adv_camera_module_otp_work otp_work; - u32 ctrl_updt; - u32 vts_cur; - u32 vts_min; - bool auto_adjust_fps; - bool update_config; - bool frm_fmt_valid; - bool frm_intrvl_valid; - bool hflip; - bool vflip; - bool flip_flg; - u32 rotation; - void *pltfm_data; - bool inited; - struct mutex lock; -}; - -#define adv_camera_module_pr_info(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_info(&(cam_mod)->sd, fmt, ## arg) -#define adv_camera_module_pr_debug(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_debug(&(cam_mod)->sd, fmt, ## arg) -#define adv_camera_module_pr_warn(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_warn(&(cam_mod)->sd, fmt, ## arg) -#define adv_camera_module_pr_err(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_err(&(cam_mod)->sd, fmt, ## arg) - -int adv_camera_module_write_reglist( - struct adv_camera_module *cam_mod, - const struct adv_camera_module_reg reglist[], - int len); - -int adv_camera_module_write_reg( - struct adv_camera_module *cam_mod, - u8 reg, - u8 val); - -int adv_camera_module_read_reg( - struct adv_camera_module *cam_mod, - u8 reg, - u8 *val); - -int adv_camera_module_read_reg_table( - struct adv_camera_module *cam_mod, - u16 reg, - u32 *val); - -int adv_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int adv_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int adv_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int adv_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int adv_camera_module_s_stream( - struct v4l2_subdev *sd, - int enable); - -int adv_camera_module_s_power( - struct v4l2_subdev *sd, - int on); - -int adv_camera_module_g_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int adv_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int adv_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls); - -int adv_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie); - -int adv_camera_module_init( - struct adv_camera_module *cam_mod, - struct adv_camera_module_custom_config *custom); - -void adv_camera_module_release( - struct adv_camera_module *cam_mod); - -long adv_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg); - -int adv_camera_module_get_flip_mirror( - struct adv_camera_module *cam_mod); -#endif diff --git a/drivers/media/i2c/soc_camera/rockchip/aptina_camera_module.c b/drivers/media/i2c/soc_camera/rockchip/aptina_camera_module.c deleted file mode 100644 index 7f9ed5219533..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/aptina_camera_module.c +++ /dev/null @@ -1,1630 +0,0 @@ -/* - * aptina_camera_module.c - * - * Generic galaxycore sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "aptina_camera_module.h" - -#define I2C_M_WR 0 -#define I2C_MSG_MAX 300 -#define I2C_DATA_MAX (I2C_MSG_MAX * 3) - -/* ======================================================================== */ - -struct aptina_camera_module *to_aptina_camera_module(struct v4l2_subdev *sd) -{ - return container_of(sd, struct aptina_camera_module, sd); -} - -/* ======================================================================== */ - -void aptina_camera_module_reset( - struct aptina_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->inited = false; - cam_mod->active_config = NULL; - cam_mod->update_config = true; - cam_mod->frm_fmt_valid = false; - cam_mod->frm_intrvl_valid = false; - cam_mod->exp_config.auto_exp = false; - cam_mod->exp_config.auto_gain = false; - cam_mod->wb_config.auto_wb = false; - cam_mod->auto_adjust_fps = true; - cam_mod->rotation = 0; - cam_mod->ctrl_updt = 0; - cam_mod->state = APTINA_CAMERA_MODULE_POWER_OFF; - cam_mod->state_before_suspend = APTINA_CAMERA_MODULE_POWER_OFF; -} - -/* ======================================================================== */ - -int aptina_read_i2c_reg( - struct v4l2_subdev *sd, - u16 data_length, - u16 reg, - u32 *val) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - struct i2c_msg msg[1]; - unsigned char data[2] = { 0, 0}; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(sd, "client->adapter NULL\n"); - return -ENODEV; - } - - msg->addr = client->addr; - msg->flags = I2C_M_WR; - msg->len = 2; - msg->buf = data; - - /* High byte goes out first */ - data[0] = (u8)((reg >> 8) & 0xff); - data[1] = (u8)(reg & 0xff); - - ret = i2c_transfer(client->adapter, msg, 1); - if (ret >= 0) { - mdelay(3); - msg->flags = I2C_M_RD; - msg->len = data_length; - i2c_transfer(client->adapter, msg, 1); - } - if (ret >= 0) { - *val = 0; - /* High byte comes first */ - if (data_length == 1) - *val = data[0]; - else if (data_length == 2) - *val = data[1] + (data[0] << 8); - else - ; - - return 0; - } - pltfrm_camera_module_pr_err(sd, - "i2c read from offset 0x%08x failed with error %d\n", reg, ret); - return ret; -} - -/* ======================================================================== */ - -int aptina_write_i2c_reg( - struct v4l2_subdev *sd, - u16 reg, u16 val) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - struct i2c_msg msg[1]; - unsigned char data[4] = {0, 0, 0, 0}; - int retries; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(sd, "client->adapter NULL\n"); - return -ENODEV; - } - - for (retries = 0; retries < 5; retries++) { - msg->addr = client->addr; - msg->flags = I2C_M_WR; - msg->len = 4; - msg->buf = data; - - /* high byte goes out first */ - data[0] = (u8)((reg >> 8) & 0xff); - data[1] = (u8)(reg & 0xff); - data[2] = (u8)((val >> 8) & 0xff); - data[3] = (u8)(val & 0xff); - - ret = i2c_transfer(client->adapter, msg, 1); - usleep_range(20, 50); - - if (ret == 1) - return 0; - - pltfrm_camera_module_pr_debug(sd, - "retrying I2C... %d\n", retries); - retries++; - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(msecs_to_jiffies(20)); - } - - pltfrm_camera_module_pr_err(sd, - "i2c write to offset 0x%08x failed with error %d\n", reg, ret); - return ret; -} - -/* ======================================================================== */ - -int aptina_write_reglist( - struct v4l2_subdev *sd, - const struct pltfrm_camera_module_reg reglist[], - int len) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - unsigned int k = 0, j = 0; - int i = 0; - struct i2c_msg *msg; - unsigned char *data; - unsigned int max_entries = len; - - msg = kmalloc((sizeof(struct i2c_msg) * I2C_MSG_MAX), GFP_KERNEL); - if (!msg) - return -ENOMEM; - data = kmalloc((sizeof(unsigned char) * I2C_DATA_MAX), GFP_KERNEL); - if (!data) { - kfree(msg); - return -ENOMEM; - } - - for (i = 0; i < max_entries; i++) { - switch (reglist[i].flag) { - case PLTFRM_CAMERA_MODULE_REG_TYPE_DATA: - (msg + j)->addr = client->addr; - (msg + j)->flags = I2C_M_WR; - (msg + j)->len = 4; - (msg + j)->buf = (data + k); - - data[k + 0] = (u8)((reglist[i].reg >> 8) & 0xFF); - data[k + 1] = (u8)(reglist[i].reg & 0xFF); - data[k + 2] = (u8)((reglist[i].val >> 8) & 0xFF); - data[k + 3] = (u8)(reglist[i].val & 0xFF); - - k = k + 4; - j++; - if (j == (I2C_MSG_MAX - 1)) { - /* Bulk I2C transfer */ - pltfrm_camera_module_pr_err(sd, - "messages transfers 1 0x%p msg %d bytes %d\n", - msg, j, k); - ret = i2c_transfer(client->adapter, msg, j); - if (ret < 0) { - pltfrm_camera_module_pr_err(sd, - "i2c transfer returned with err %d\n", - ret); - kfree(msg); - kfree(data); - return ret; - } - j = 0; - k = 0; - pltfrm_camera_module_pr_debug(sd, - "i2c_transfer return %d\n", ret); - } - break; - case PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT: - if (j > 0) { - /* Bulk I2C transfer */ - pltfrm_camera_module_pr_debug(sd, - "messages transfers 1 0x%p msg %d bytes %d\n", - msg, j, k); - ret = i2c_transfer(client->adapter, msg, j); - if (ret < 0) { - pltfrm_camera_module_pr_debug(sd, - "i2c transfer returned with err %d\n", - ret); - kfree(msg); - kfree(data); - return ret; - } - pltfrm_camera_module_pr_debug(sd, - "i2c_transfer return %d\n", ret); - } - mdelay(reglist[i].val); - j = 0; - k = 0; - break; - default: - pltfrm_camera_module_pr_debug(sd, "unknown command\n"); - kfree(msg); - kfree(data); - return -1; - } - } - - if (j != 0) { /*Remaining I2C message*/ - pltfrm_camera_module_pr_debug(sd, - "messages transfers 1 0x%p msg %d bytes %d\n", - msg, j, k); - ret = i2c_transfer(client->adapter, msg, j); - if (ret < 0) { - pltfrm_camera_module_pr_err(sd, - "i2c transfer returned with err %d\n", ret); - kfree(msg); - kfree(data); - return ret; - } - pltfrm_camera_module_pr_debug(sd, - "i2c_transfer return %d\n", ret); - } - - kfree(msg); - kfree(data); - return 0; -} - -static void aptina_camera_module_set_active_config( - struct aptina_camera_module *cam_mod, - struct aptina_camera_module_config *new_config) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(new_config)) { - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no active config\n"); - } else { - cam_mod->ctrl_updt &= APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP | - APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN | - APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - if (new_config->auto_exp_enabled != - cam_mod->exp_config.auto_exp) { - cam_mod->ctrl_updt |= - APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = - new_config->auto_exp_enabled; - } - if (new_config->auto_gain_enabled != - cam_mod->exp_config.auto_gain) { - cam_mod->ctrl_updt |= - APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = - new_config->auto_gain_enabled; - } - if (new_config->auto_wb_enabled != - cam_mod->wb_config.auto_wb) { - cam_mod->ctrl_updt |= - APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = - new_config->auto_wb_enabled; - } - if (new_config != cam_mod->active_config) { - cam_mod->update_config = true; - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "activating config '%s'\n", - new_config->name); - } - } -} - -/* ======================================================================== */ - -static struct aptina_camera_module_config *aptina_camera_module_find_config( - struct aptina_camera_module *cam_mod, - struct v4l2_mbus_framefmt *fmt, - struct v4l2_subdev_frame_interval *frm_intrvl) -{ - u32 i; - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - if (!IS_ERR_OR_NULL(fmt)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (!IS_ERR_OR_NULL(frm_intrvl)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "frame interval %d/%d\n", - frm_intrvl->interval.numerator, - frm_intrvl->interval.denominator); - - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (!IS_ERR_OR_NULL(frm_intrvl)) { - gcdiv = gcd(cam_mod->custom.configs[i]. - frm_intrvl.interval.numerator, - cam_mod->custom.configs[i]. - frm_intrvl.interval.denominator); - norm_interval.interval.numerator = - cam_mod->custom.configs[i]. - frm_intrvl.interval.numerator / gcdiv; - norm_interval.interval.denominator = - cam_mod->custom.configs[i]. - frm_intrvl.interval.denominator / gcdiv; - if ((frm_intrvl->interval.numerator != - norm_interval.interval.numerator) || - (frm_intrvl->interval.denominator != - norm_interval.interval.denominator)) - continue; - } - if (!IS_ERR_OR_NULL(fmt)) { - if ((cam_mod->custom.configs[i].frm_fmt.width != - fmt->width) || - (cam_mod->custom.configs[i].frm_fmt.height != - fmt->height) || - (cam_mod->custom.configs[i].frm_fmt.code != - fmt->code)) { - continue; - } - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "found matching config %s\n", - cam_mod->custom.configs[i].name); - return &cam_mod->custom.configs[i]; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no matching config found\n"); - - return ERR_PTR(-EINVAL); -} - -/* ======================================================================== */ - -static int aptina_camera_module_write_config( - struct aptina_camera_module *cam_mod) -{ - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - - ret = aptina_write_reglist(&cam_mod->sd, - cam_mod->active_config->reg_table, - cam_mod->active_config->reg_table_num_entries); - if (IS_ERR_VALUE(ret)) - goto err; - ret = pltfrm_camera_module_patch_config(&cam_mod->sd, - &cam_mod->frm_fmt, - &cam_mod->frm_intrvl); - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -static int aptina_camera_module_attach( - struct aptina_camera_module *cam_mod) -{ - int ret = 0; - struct aptina_camera_module_custom_config *custom; - - custom = &cam_mod->custom; - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - if (custom->check_camera_id) { - aptina_camera_module_s_power(&cam_mod->sd, 1); - ret = custom->check_camera_id(cam_mod); - aptina_camera_module_s_power(&cam_mod->sd, 0); - if (ret != 0) - goto err; - } - - return 0; - -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - aptina_camera_module_release(cam_mod); - return ret; -} - -/* ======================================================================== */ - -int aptina_camera_module_try_fmt(struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *fmt) -{ - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL( - aptina_camera_module_find_config( - cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "format not supported\n"); - return -EINVAL; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, "format supported\n"); - - return 0; -} - -/* ======================================================================== */ - -int aptina_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL( - aptina_camera_module_find_config( - cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "format %dx%d, code 0x%04x, not supported\n", - fmt->width, fmt->height, fmt->code); - ret = -EINVAL; - goto err; - } - cam_mod->frm_fmt_valid = true; - cam_mod->frm_fmt = *fmt; - if (cam_mod->frm_intrvl_valid) { - aptina_camera_module_set_active_config(cam_mod, - aptina_camera_module_find_config(cam_mod, - fmt, &cam_mod->frm_intrvl)); - } else { - aptina_camera_module_set_active_config(cam_mod, - aptina_camera_module_find_config(cam_mod, - fmt, NULL)); - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int aptina_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->active_config) { - fmt->code = cam_mod->active_config->frm_fmt.code; - fmt->width = cam_mod->active_config->frm_fmt.width; - fmt->height = cam_mod->active_config->frm_fmt.height; - return 0; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "no active config\n"); - - return -1; -} - -/* ======================================================================== */ - -int aptina_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - int ret = 0; - struct aptina_camera_module_config *config; - unsigned int vts; - - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - if ((interval->interval.denominator == 0) || - (interval->interval.numerator == 0)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "invalid frame interval %d/%d\n", - interval->interval.numerator, - interval->interval.denominator); - ret = -EINVAL; - goto err; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d/%d (%dfps)\n", - interval->interval.numerator, interval->interval.denominator, - (interval->interval.denominator + - (interval->interval.numerator >> 1)) / - interval->interval.numerator); - - /* normalize interval */ - gcdiv = gcd(interval->interval.numerator, - interval->interval.denominator); - norm_interval.interval.numerator = - interval->interval.numerator / gcdiv; - norm_interval.interval.denominator = - interval->interval.denominator / gcdiv; - - if (!cam_mod->frm_fmt_valid) - goto end; - - config = aptina_camera_module_find_config( - cam_mod, - &cam_mod->active_config->frm_fmt, - &norm_interval); - - if (!IS_ERR_OR_NULL(config) && (config != cam_mod->active_config)) { - aptina_camera_module_set_active_config(cam_mod, config); - if (cam_mod->state == APTINA_CAMERA_MODULE_STREAMING) { - cam_mod->custom.stop_streaming(cam_mod); - aptina_camera_module_write_config(cam_mod); - cam_mod->custom.start_streaming(cam_mod); - } - } else { - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - if (cam_mod->active_config->frm_intrvl.interval.denominator < - norm_interval.interval.denominator) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "%dx%d@%dfps isn't support!", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - norm_interval.interval.denominator); - ret = -EFAULT; - goto err; - } - if (!cam_mod->custom.s_vts) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "custom.s_vts isn't support!"); - ret = -EFAULT; - goto err; - } - - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= norm_interval.interval.denominator; - cam_mod->vts_cur = vts; - - if (cam_mod->state != APTINA_CAMERA_MODULE_STREAMING) - goto end; - - cam_mod->custom.s_vts(cam_mod, vts); - } - -end: - cam_mod->frm_intrvl_valid = true; - cam_mod->frm_intrvl = norm_interval; - cam_mod->auto_adjust_fps = false; - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -int aptina_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - - if (cam_mod->active_config) { - if (cam_mod->state == APTINA_CAMERA_MODULE_STREAMING) { - if (cam_mod->frm_intrvl_valid) { - *interval = cam_mod->frm_intrvl; - return 0; - } else { - *interval = cam_mod->active_config->frm_intrvl; - return 0; - } - } - } - - return -EFAULT; -} - -/* ======================================================================== */ - -int aptina_camera_module_s_stream(struct v4l2_subdev *sd, int enable) -{ - int ret = 0; - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - unsigned int vts; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", enable); - - if (enable) { - if (cam_mod->state == APTINA_CAMERA_MODULE_STREAMING) - return 0; - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration, cannot start streaming\n"); - ret = -EFAULT; - goto err; - } - if (cam_mod->state != APTINA_CAMERA_MODULE_SW_STANDBY) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "sensor is not powered on (in state %d), cannot start streaming\n", - cam_mod->state); - ret = -EINVAL; - goto err; - } - - if (cam_mod->update_config) { - ret = aptina_camera_module_write_config(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - } - - ret = cam_mod->custom.start_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - if (cam_mod->frm_intrvl_valid) { - if ((cam_mod->frm_intrvl.interval.numerator != - cam_mod->active_config->frm_intrvl.interval.numerator) || - (cam_mod->frm_intrvl.interval.denominator != - cam_mod->active_config->frm_intrvl.interval.denominator)) { - if (cam_mod->frm_intrvl.interval.denominator > - cam_mod->active_config->frm_intrvl.interval.denominator) { - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "sensor is not support stream: %dx%d@(%d/%d)fps!\n", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - cam_mod->frm_intrvl.interval.denominator, - cam_mod->frm_intrvl.interval.numerator); - goto end; - } - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= cam_mod->frm_intrvl.interval.denominator; - cam_mod->custom.s_vts(cam_mod, vts); - } - } - - cam_mod->update_config = false; - cam_mod->ctrl_updt = 0; - mdelay(cam_mod->custom.power_up_delays_ms[2]); - cam_mod->state = APTINA_CAMERA_MODULE_STREAMING; - } else { - int pclk; - int wait_ms; - struct isp_supplemental_sensor_mode_data timings; - - if (cam_mod->state != APTINA_CAMERA_MODULE_STREAMING) - return 0; - ret = cam_mod->custom.stop_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - cam_mod->state = APTINA_CAMERA_MODULE_SW_STANDBY; - - ret = aptina_camera_module_ioctl(sd, RK_VIDIOC_SENSOR_MODE_DATA, - &timings); - if (IS_ERR_VALUE(ret)) - goto err; - pclk = timings.vt_pix_clk_freq_hz / 1000; - if (!pclk) - goto err; - wait_ms = (timings.line_length_pck - * timings.frame_length_lines) / pclk; - /* wait for a frame period to make sure that there is - *no pending frame left. - */ - msleep(wait_ms + 1); - } - -end: - cam_mod->state_before_suspend = cam_mod->state; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int aptina_camera_module_s_power(struct v4l2_subdev *sd, int on) -{ - int ret = 0; - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - struct v4l2_subdev *af_ctrl; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", on); - - if (on) { - if (cam_mod->state == APTINA_CAMERA_MODULE_POWER_OFF) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 1); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[0]); - cam_mod->state = - APTINA_CAMERA_MODULE_HW_STANDBY; - } - } - if (cam_mod->state == APTINA_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PWR, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - msleep(20); - - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - msleep(20); - - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - msleep(20); - - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - msleep(20); - - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - msleep(20); - - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - msleep(20); - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - msleep(20); - - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[1]); - cam_mod->state = - APTINA_CAMERA_MODULE_SW_STANDBY; - - #if 1 - if (!IS_ERR_OR_NULL( - cam_mod->custom.init_common) && - cam_mod->custom.init_common( - cam_mod)) - usleep_range(1000, 1500); - #endif - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - v4l2_subdev_call(af_ctrl, - core, init, 0); - } - } - } - } else { - if (cam_mod->state == APTINA_CAMERA_MODULE_STREAMING) { - ret = aptina_camera_module_s_stream(sd, 0); - if (!IS_ERR_VALUE(ret)) - cam_mod->state = - APTINA_CAMERA_MODULE_SW_STANDBY; - } - if (cam_mod->state == APTINA_CAMERA_MODULE_SW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PWR, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - - if (!IS_ERR_VALUE(ret)) - cam_mod->state = - APTINA_CAMERA_MODULE_HW_STANDBY; - } - if (cam_mod->state == APTINA_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 0); - if (!IS_ERR_VALUE(ret)) { - cam_mod->state = APTINA_CAMERA_MODULE_POWER_OFF; - aptina_camera_module_reset(cam_mod); - } - } - } - - cam_mod->state_before_suspend = cam_mod->state; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "%s failed, camera left in state %d\n", - on ? "on" : "off", cam_mod->state); - goto err; - } else - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "camera powered %s\n", on ? "on" : "off"); - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int aptina_camera_module_g_ctrl(struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - int ret; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, " id 0x%x\n", ctrl->id); - - if (ctrl->id == V4L2_CID_FLASH_LED_MODE) { - ctrl->value = cam_mod->exp_config.flash_mode; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_HFLIP) { - ctrl->value = cam_mod->hflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_HFLIP %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_VFLIP) { - ctrl->value = cam_mod->vflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_VFLIP %d\n", - ctrl->value); - return 0; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active configuration\n"); - return -EFAULT; - } - - if (ctrl->id == RK_V4L2_CID_VBLANKING) { - ctrl->value = cam_mod->active_config->v_blanking_time_us; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_VBLANKING %d\n", - ctrl->value); - return 0; - } - -/* - *if (ctrl->id == RK_V4L2_CID_IGNORE_MEASUREMENT_CHECK) { - * ctrl->value = cam_mod->active_config->ignore_measurement_check; - * pltfrm_camera_module_pr_debug( - * &cam_mod->sd, - * "CIF_ISP20_CID_IGNORE_MEASUREMENT_CHECK %d\n", - * ctrl->value); - * return 0; - * } - */ - - if ((cam_mod->state != APTINA_CAMERA_MODULE_SW_STANDBY) && - (cam_mod->state != APTINA_CAMERA_MODULE_STREAMING)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cannot get controls when camera is off\n"); - return -EFAULT; - } - - if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) { - struct v4l2_subdev *af_ctrl; - - af_ctrl = - pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - ret = v4l2_subdev_call(af_ctrl, core, g_ctrl, ctrl); - return ret; - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.g_ctrl)) { - ret = cam_mod->custom.g_ctrl(cam_mod, ctrl->id); - if (IS_ERR_VALUE(ret)) - return ret; - } - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl->value = cam_mod->exp_config.gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE: - ctrl->value = cam_mod->exp_config.exp_time; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl->value = cam_mod->wb_config.temperature; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl->value = cam_mod->exp_config.auto_gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl->value = cam_mod->exp_config.auto_exp; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.auto_wb; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - ctrl->value = cam_mod->af_config.abs_pos; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - default: - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed, unknown ctrl %d\n", ctrl->id); - return -EINVAL; - } - - return 0; -} - -/* ======================================================================== */ - -static int flash_light_ctrl( - struct v4l2_subdev *sd, - struct aptina_camera_module *cam_mod, - int value) -{ - return 0; -} - -/* ======================================================================== */ - -int aptina_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls) -{ - int i; - int ctrl_cnt = 0; - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - struct aptina_camera_module_ext_ctrls aptina_ctrls; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (ctrls->count == 0) - return -EINVAL; - - for (i = 0; i < ctrls->count; i++) { - struct v4l2_ext_control *ctrl; - u32 ctrl_updt = 0; - - ctrl = &ctrls->controls[i]; - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl_updt = APTINA_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case RK_V4L2_CID_GAIN_PERCENT: - ctrl_updt = APTINA_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain_percent = ctrl->value; - break; - case V4L2_CID_FLASH_LED_MODE: - ret = flash_light_ctrl(sd, cam_mod, ctrl->value); - if (ret == 0) { - cam_mod->exp_config.flash_mode = ctrl->value; - pltfrm_camera_module_pr_debug( - &cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - } - break; - case V4L2_CID_EXPOSURE: - ctrl_updt = APTINA_CAMERA_MODULE_CTRL_UPDT_EXP_TIME; - cam_mod->exp_config.exp_time = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_VTS: - ctrl_updt = APTINA_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE; - cam_mod->exp_config.vts_value = ctrl->value; - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl_updt = - APTINA_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE; - cam_mod->wb_config.temperature = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl_updt = APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl_updt = APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl_updt = APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_AUTO_FPS: - cam_mod->auto_adjust_fps = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_AUTO_FPS %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - struct v4l2_control single_ctrl; - - single_ctrl.id = - V4L2_CID_FOCUS_ABSOLUTE; - single_ctrl.value = ctrl->value; - ret = v4l2_subdev_call(af_ctrl, - core, s_ctrl, &single_ctrl); - return ret; - } - } - ctrl_updt = - APTINA_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE; - cam_mod->af_config.abs_pos = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - case V4L2_CID_HFLIP: - if (ctrl->value) - cam_mod->hflip = true; - else - cam_mod->hflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_VFLIP: - if (ctrl->value) - cam_mod->vflip = true; - else - cam_mod->vflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_TEST_PATTERN: - aptina_ctrls.ctrls = - kmalloc_array(ctrls->count, - sizeof(*aptina_ctrls.ctrls), - GFP_KERNEL); - if (aptina_ctrls.ctrls) { - for (i = 0; i < ctrls->count; i++) { - aptina_ctrls.ctrls[i].id = - ctrls->controls[i].id; - aptina_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - aptina_ctrls.count = ctrls->count; - ret = cam_mod->custom.s_ext_ctrls(cam_mod, - &aptina_ctrls); - } - kfree(aptina_ctrls.ctrls); - break; - default: - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "ignoring unknown ctrl 0x%x\n", ctrl->id); - break; - } - - if (cam_mod->state != APTINA_CAMERA_MODULE_SW_STANDBY && - cam_mod->state != APTINA_CAMERA_MODULE_STREAMING) - cam_mod->ctrl_updt |= ctrl_updt; - else if (ctrl_updt) - ctrl_cnt++; - } - - /* if camera module is already streaming, write through */ - if (ctrl_cnt && - (cam_mod->state == APTINA_CAMERA_MODULE_STREAMING || - cam_mod->state == APTINA_CAMERA_MODULE_SW_STANDBY)) { - struct aptina_camera_module_ext_ctrls aptina_ctrls; - - aptina_ctrls.ctrls = - (struct aptina_camera_module_ext_ctrl *) - kmalloc(ctrl_cnt * sizeof(struct aptina_camera_module_ext_ctrl), - GFP_KERNEL); - - if (aptina_ctrls.ctrls) { - for (i = 0; i < ctrl_cnt; i++) { - aptina_ctrls.ctrls[i].id = - ctrls->controls[i].id; - aptina_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - - aptina_ctrls.count = ctrl_cnt; - - ret = cam_mod->custom.s_ext_ctrls(cam_mod, - &aptina_ctrls); - - kfree(aptina_ctrls.ctrls); - } else { - ret = -ENOMEM; - } - - if (IS_ERR_VALUE(ret)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed with error %d\n", ret); - } - - return ret; -} - -/* ======================================================================== */ - -int aptina_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - struct v4l2_ext_control ext_ctrl[1]; - struct v4l2_ext_controls ext_ctrls; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "0x%x 0x%x\n", ctrl->id, ctrl->value); - - ext_ctrl[0].id = ctrl->id; - ext_ctrl[0].value = ctrl->value; - - ext_ctrls.count = 1; - ext_ctrls.controls = ext_ctrl; - - return aptina_camera_module_s_ext_ctrls(sd, &ext_ctrls); -} - -/* ======================================================================== */ - -long aptina_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - int ret, i; - unsigned int flag, val; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cmd == RK_VIDIOC_SENSOR_MODE_DATA) { - struct aptina_camera_module_timings aptina_timings; - struct isp_supplemental_sensor_mode_data *timings = - (struct isp_supplemental_sensor_mode_data *)arg; - - if (cam_mod->custom.g_timings) - ret = cam_mod->custom.g_timings(cam_mod, - &aptina_timings); - else - ret = -EPERM; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; - } - - timings->sensor_output_width = - aptina_timings.sensor_output_width; - timings->sensor_output_height = - aptina_timings.sensor_output_height; - timings->crop_horizontal_start = - aptina_timings.crop_horizontal_start; - timings->crop_vertical_start = - aptina_timings.crop_vertical_start; - timings->crop_horizontal_end = - aptina_timings.crop_horizontal_end; - timings->crop_vertical_end = - aptina_timings.crop_vertical_end; - timings->line_length_pck = - aptina_timings.line_length_pck; - timings->frame_length_lines = - aptina_timings.frame_length_lines; - timings->vt_pix_clk_freq_hz = - aptina_timings.vt_pix_clk_freq_hz; - timings->binning_factor_x = - aptina_timings.binning_factor_x; - timings->binning_factor_y = - aptina_timings.binning_factor_y; - timings->coarse_integration_time_max_margin = - aptina_timings.coarse_integration_time_max_margin; - timings->coarse_integration_time_min = - aptina_timings.coarse_integration_time_min; - timings->fine_integration_time_max_margin = - aptina_timings.fine_integration_time_max_margin; - timings->fine_integration_time_min = - aptina_timings.fine_integration_time_min; - - timings->exposure_valid_frame[0] = - cam_mod->custom.exposure_valid_frame[0]; - timings->exposure_valid_frame[1] = - cam_mod->custom.exposure_valid_frame[1]; - - /* - *timings->exp_time = cam_mod->exp_config.exp_time; - *timings->gain = cam_mod->exp_config.gain; - */ - if (cam_mod->active_config) { - timings->max_exp_gain_h = cam_mod->active_config->max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->active_config->max_exp_gain_l; - } else { - timings->max_exp_gain_h = cam_mod->custom.configs[0].max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->custom.configs[0].max_exp_gain_l; - } - return ret; - } else if (cmd == RK_VIDIOC_SENSOR_CONFIGINFO) { - struct sensor_config_info_s *sensor_config = (struct sensor_config_info_s *)arg; - - sensor_config->config_num = cam_mod->custom.num_configs; - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (i >= SENSOR_CONFIG_NUM) - break; - sensor_config->sensor_fmt[i] = - pltfrm_camera_module_pix_fmt2csi2_dt(cam_mod->custom.configs[i].frm_fmt.code); - sensor_config->reso[i].width = cam_mod->custom.configs[i].frm_fmt.width; - sensor_config->reso[i].height = cam_mod->custom.configs[i].frm_fmt.height; - } - return 0; - } else if (cmd == RK_VIDIOC_SENSOR_REG_ACCESS) { - struct sensor_reg_rw_s *sensor_rw = (struct sensor_reg_rw_s *)arg; - - if (sensor_rw->reg_access_mode == SENSOR_READ_MODE) { - for (i = 0; i < cam_mod->custom.configs[0].reg_table_num_entries; i++) { - flag = cam_mod->custom.configs[0].reg_table[i].flag; - if (flag != PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) - break; - } - if (flag == PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "Can not get sensor reg type.\n"); - return -EINVAL; - } - sensor_rw->reg_addr_len = PLTFRM_CAMERA_MODULE_REG_LEN(flag); - sensor_rw->reg_data_len = PLTFRM_CAMERA_MODULE_DATA_LEN(flag); - pltfrm_camera_module_read_reg_ex(&cam_mod->sd, 1, flag, sensor_rw->addr, &val); - sensor_rw->data = val; - } else { - flag = (sensor_rw->reg_addr_len << PLTFRM_CAMERA_MODULE_REG_LEN_BIT); - flag |= (sensor_rw->reg_data_len << PLTFRM_CAMERA_MODULE_DATA_LEN_BIT); - pltfrm_camera_module_write_reg_ex(&cam_mod->sd, flag, sensor_rw->addr, sensor_rw->data); - } - return 0; - } else if (cmd == PLTFRM_CIFCAM_G_ITF_CFG) { - struct pltfrm_cam_itf *itf_cfg = (struct pltfrm_cam_itf *)arg; - struct aptina_camera_module_config *config; - - if (cam_mod->custom.num_configs <= 0) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cam_mod->custom.num_configs is NULL, Get interface config failed!\n"); - return -EINVAL; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - config = &cam_mod->custom.configs[0]; - else - config = cam_mod->active_config; - - *itf_cfg = config->itf_cfg; - pltfrm_camera_module_ioctl(sd, PLTFRM_CIFCAM_G_ITF_CFG, arg); - return 0; - } else if (cmd == PLTFRM_CIFCAM_ATTACH) { - ret = aptina_camera_module_init(cam_mod, &cam_mod->custom); - if (!IS_ERR_VALUE(ret)) { - pltfrm_camera_module_ioctl(sd, cmd, arg); - return aptina_camera_module_attach(cam_mod); - } else { - aptina_camera_module_release(cam_mod); - return ret; - } - } - - ret = pltfrm_camera_module_ioctl(sd, cmd, arg); - return ret; -} - -/* Reconfigure bayer order according to xml's definition */ -static int aptina_camera_module_s_flip(struct aptina_camera_module *cam_mod) -{ - int i, mode = 0; - static int flip_mode; - - if (!cam_mod->custom.configs->bayer_order_alter_enble) { - aptina_camera_module_pr_info(cam_mod, - "not need to change bayer order!"); - return 0; - } - - mode = pltfrm_camera_module_get_flip_mirror(&cam_mod->sd); - - aptina_camera_module_pr_debug(cam_mod, - "%s(%d): flip_mode is %d, mode is %d.\n", - __func__, - __LINE__, - flip_mode, - mode); - - if (mode != flip_mode) { - /* Reconfigure the compatible bayer order */ - switch (mode) { - case 0: - /* Change all the bayter order of registered configs */ - for (i = 0; i < cam_mod->custom.num_configs; i++) - cam_mod->custom.configs[i].frm_fmt.code = - MEDIA_BUS_FMT_SGRBG10_1X10; - break; - - case 1: - for (i = 0; i < cam_mod->custom.num_configs; i++) - cam_mod->custom.configs[i].frm_fmt.code = - MEDIA_BUS_FMT_SRGGB10_1X10; - break; - - case 2: - for (i = 0; i < cam_mod->custom.num_configs; i++) - cam_mod->custom.configs[i].frm_fmt.code = - MEDIA_BUS_FMT_SBGGR10_1X10; - break; - - case 3: - for (i = 0; i < cam_mod->custom.num_configs; i++) - cam_mod->custom.configs[i].frm_fmt.code = - MEDIA_BUS_FMT_SGBRG10_1X10; - break; - - default: - break; - }; - } - - flip_mode = mode; - - return 0; -} - -int aptina_camera_module_get_flip_mirror( - struct aptina_camera_module *cam_mod) -{ - int mode = 0; - - if (!cam_mod->flip_flg) - return -1; - - if (cam_mod->hflip) - mode |= APTINA_MIRROR_BIT_MASK; - else - mode &= ~APTINA_MIRROR_BIT_MASK; - - if (cam_mod->vflip) - mode |= APTINA_FLIP_BIT_MASK; - else - mode &= ~APTINA_FLIP_BIT_MASK; - - return mode; -} - -int aptina_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *file) -{ - struct aptina_camera_module *cam_mod = to_aptina_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", file->index); - - if (file->index >= cam_mod->custom.num_configs) - return -EINVAL; - - aptina_camera_module_s_flip(cam_mod); - file->code = - cam_mod->custom.configs[file->index].frm_fmt.code; - file->width = cam_mod->custom.configs[file->index].frm_fmt.width; - file->height = cam_mod->custom.configs[file->index].frm_fmt.height; - file->interval.numerator = cam_mod->custom. - configs[file->index].frm_intrvl.interval.numerator; - file->interval.denominator = cam_mod->custom. - configs[file->index].frm_intrvl.interval.denominator; - return 0; -} - -/* ======================================================================== */ - -int aptina_camera_module_write_reglist( - struct aptina_camera_module *cam_mod, - const struct aptina_camera_module_reg reglist[], - int len) -{ - return aptina_write_reglist(&cam_mod->sd, reglist, len); -} - -/* ======================================================================== */ - -int aptina_camera_module_write_reg( - struct aptina_camera_module *cam_mod, - u16 reg, - u16 val) -{ - return aptina_write_i2c_reg(&cam_mod->sd, reg, val); -} - -/* ======================================================================== */ - -int aptina_camera_module_read_reg( - struct aptina_camera_module *cam_mod, - u16 data_length, - u16 reg, - u32 *val) -{ - return aptina_read_i2c_reg(&cam_mod->sd, - data_length, reg, val); -} - -/* ======================================================================== */ - -int aptina_camera_module_read_reg_table( - struct aptina_camera_module *cam_mod, - u16 reg, - u32 *val) -{ - int i; - - if (cam_mod->state == APTINA_CAMERA_MODULE_STREAMING) - return aptina_read_i2c_reg(&cam_mod->sd, - 1, reg, val); - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - for ( - i = cam_mod->active_config->reg_table_num_entries - 1; - i > 0; - i--) { - if (cam_mod->active_config->reg_table[i].reg == reg) { - *val = cam_mod->active_config->reg_table[i].val; - return 0; - } - } - } - - if (cam_mod->state == APTINA_CAMERA_MODULE_SW_STANDBY) - return aptina_read_i2c_reg(&cam_mod->sd, - 1, reg, val); - - return -EFAULT; -} - -/* ======================================================================== */ - -int aptina_camera_module_init(struct aptina_camera_module *cam_mod, - struct aptina_camera_module_custom_config *custom) -{ - int ret = 0; - int mode = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->hflip = false; - cam_mod->vflip = false; - cam_mod->flip_flg = false; - aptina_camera_module_reset(cam_mod); - - if (IS_ERR_OR_NULL(custom->start_streaming) || - IS_ERR_OR_NULL(custom->stop_streaming) || - IS_ERR_OR_NULL(custom->s_ctrl) || - IS_ERR_OR_NULL(custom->g_ctrl)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "mandatory callback function is missing\n"); - ret = -EINVAL; - goto err; - } - - ret = pltfrm_camera_module_init(&cam_mod->sd, &cam_mod->pltfm_data); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - if (IS_ERR_VALUE(ret)) { - aptina_camera_module_release(cam_mod); - goto err; - } -/* - *if (custom->check_camera_id) { - * aptina_camera_module_s_power(&cam_mod->sd, 1); - * ret = (custom->check_camera_id)(cam_mod); - * aptina_camera_module_s_power(&cam_mod->sd, 0); - *} - * - *if (IS_ERR_VALUE(ret)) { - * aptina_camera_module_release(cam_mod); - * goto err; - *} - */ - - mode = pltfrm_camera_module_get_flip_mirror(&cam_mod->sd); - if (mode != -1) { - cam_mod->hflip = mode & APTINA_MIRROR_BIT_MASK ? true : false; - cam_mod->vflip = mode & APTINA_FLIP_BIT_MASK ? true : false; - cam_mod->flip_flg = true; - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -void aptina_camera_module_release(struct aptina_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->custom.configs = NULL; - - pltfrm_camera_module_release(&cam_mod->sd); - v4l2_device_unregister_subdev(&cam_mod->sd); -} diff --git a/drivers/media/i2c/soc_camera/rockchip/aptina_camera_module.h b/drivers/media/i2c/soc_camera/rockchip/aptina_camera_module.h deleted file mode 100644 index 415f74d464af..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/aptina_camera_module.h +++ /dev/null @@ -1,294 +0,0 @@ -/* - * aptina_camera_module.h - * - * Generic galaxycore sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#ifndef APTINA_CAMERA_MODULE_H -#define APTINA_CAMERA_MODULE_H -#include -#include -#include -/* - * TODO: references to v4l2 should be reomved from here and go into a - * platform dependent wrapper - */ - -#define APTINA_CAMERA_MODULE_REG_TYPE_DATA \ - PLTFRM_CAMERA_MODULE_REG_TYPE_DATA -#define APTINA_CAMERA_MODULE_REG_TYPE_TIMEOUT \ - PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT -#define aptina_camera_module_csi_config -#define aptina_camera_module_reg pltfrm_camera_module_reg -#define APTINA_FLIP_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_FLIP_BIT) -#define APTINA_MIRROR_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_MIRROR_BIT) - -#define APTINA_CAMERA_MODULE_CTRL_UPDT_GAIN 0x01 -#define APTINA_CAMERA_MODULE_CTRL_UPDT_EXP_TIME 0x02 -#define APTINA_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE 0x04 -#define APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_WB 0x08 -#define APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN 0x10 -#define APTINA_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP 0x20 -#define APTINA_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE 0x40 -#define APTINA_CAMERA_MODULE_CTRL_UPDT_PRESET_WB 0x80 -#define APTINA_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE 0x100 - -enum aptina_camera_module_state { - APTINA_CAMERA_MODULE_POWER_OFF = 0, - APTINA_CAMERA_MODULE_HW_STANDBY = 1, - APTINA_CAMERA_MODULE_SW_STANDBY = 2, - APTINA_CAMERA_MODULE_STREAMING = 3 -}; - -struct aptina_camera_module; - -struct aptina_camera_module_timings { - /* public */ - u32 coarse_integration_time_min; - u32 coarse_integration_time_max_margin; - u32 fine_integration_time_min; - u32 fine_integration_time_max_margin; - u32 frame_length_lines; - u32 line_length_pck; - u32 vt_pix_clk_freq_hz; - u32 sensor_output_width; - u32 sensor_output_height; - u32 crop_horizontal_start; /* Sensor crop start cord. (x0,y0) */ - u32 crop_vertical_start; - u32 crop_horizontal_end; /* Sensor crop end cord. (x1,y1) */ - u32 crop_vertical_end; - u8 binning_factor_x; - u8 binning_factor_y; -}; - -struct aptina_camera_module_config { - const char *name; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - bool auto_exp_enabled; - bool auto_gain_enabled; - bool auto_wb_enabled; - struct aptina_camera_module_reg *reg_table; - u32 reg_table_num_entries; - u32 bayer_order_alter_enble; - u32 v_blanking_time_us; - u32 line_length_pck; - u32 frame_length_lines; - struct aptina_camera_module_timings timings; - bool soft_reset; - bool ignore_measurement_check; - u8 max_exp_gain_h; - u8 max_exp_gain_l; - struct pltfrm_cam_itf itf_cfg; -}; - -struct aptina_camera_module_exp_config { - u32 exp_time; - bool auto_exp; - u16 gain; - u16 gain_percent; - bool auto_gain; - enum v4l2_flash_led_mode flash_mode; - u32 vts_value; -}; - -struct aptina_camera_module_wb_config { - u32 temperature; - u32 preset_id; - bool auto_wb; -}; - -struct aptina_camera_module_af_config { - u32 abs_pos; - u32 rel_pos; -}; - -struct aptina_camera_module_ext_ctrl { - /* public */ - u32 id; - u32 value; - __u32 reserved2[1]; -}; - -struct aptina_camera_module_ext_ctrls { - /* public */ - u32 count; - struct aptina_camera_module_ext_ctrl *ctrls; -}; - -/* - * start_streaming: (mandatory) will be called when sensor should be - * put into streaming mode right after the base config has been - * written to the sensor. After a successful call of this function - * the sensor should start delivering frame data. - * - * stop_streaming: (mandatory) will be called when sensor should stop - * delivering data. After a successful call of this function the - * sensor should not deliver any more frame data. - * - * check_camera_id: (optional) will be called when the sensor is - * powered on. If provided should check the sensor ID/version - * required by the custom driver. Register access should be - * possible when this function is invoked. - * - * s_ctrl: (mandatory) will be called at the successful end of - * aptina_camera_module_s_ctrl with the ctrl_id as argument. - * - * priv: (optional) for private data used by the custom driver. - */ -struct aptina_camera_module_custom_config { - int (*start_streaming)(struct aptina_camera_module *cam_mod); - int (*stop_streaming)(struct aptina_camera_module *cam_mod); - int (*check_camera_id)(struct aptina_camera_module *cam_mod); - int (*s_ctrl)(struct aptina_camera_module *cam_mod, u32 ctrl_id); - int (*g_ctrl)(struct aptina_camera_module *cam_mod, u32 ctrl_id); - int (*g_timings)(struct aptina_camera_module *cam_mod, - struct aptina_camera_module_timings *timings); - int (*s_vts)(struct aptina_camera_module *cam_mod, - u32 vts); - int (*s_ext_ctrls)(struct aptina_camera_module *cam_mod, - struct aptina_camera_module_ext_ctrls *ctrls); - int (*set_flip)(struct aptina_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len); - struct aptina_camera_module_config *configs; - int (*init_common)(struct aptina_camera_module *cam_mod); - int (*g_exposure_valid_frame)(struct aptina_camera_module *cam_mod); - u32 num_configs; - u32 power_up_delays_ms[3]; - unsigned short exposure_valid_frame[2]; - void *priv; - struct aptina_camera_module_timings timings; -}; - -struct aptina_camera_module { - /* public */ - struct v4l2_subdev sd; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - struct aptina_camera_module_exp_config exp_config; - struct aptina_camera_module_wb_config wb_config; - struct aptina_camera_module_af_config af_config; - struct aptina_camera_module_custom_config custom; - enum aptina_camera_module_state state; - enum aptina_camera_module_state state_before_suspend; - struct aptina_camera_module_config *active_config; - u32 ctrl_updt; - u32 vts_cur; - u32 vts_min; - bool auto_adjust_fps; - bool update_config; - bool frm_fmt_valid; - bool frm_intrvl_valid; - bool hflip; - bool vflip; - bool flip_flg; - u32 rotation; - void *pltfm_data; - bool inited; - struct mutex lock; -}; - -#define aptina_camera_module_pr_info(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_info(&cam_mod->sd, fmt, ## arg) -#define aptina_camera_module_pr_debug(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_debug(&cam_mod->sd, fmt, ## arg) -#define aptina_camera_module_pr_warn(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_warn(&cam_mod->sd, fmt, ## arg) -#define aptina_camera_module_pr_err(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_err(&cam_mod->sd, fmt, ## arg) - -int aptina_camera_module_write_reglist( - struct aptina_camera_module *cam_mod, - const struct aptina_camera_module_reg reglist[], - int len); - -int aptina_camera_module_write_reg( - struct aptina_camera_module *cam_mod, - u16 reg, - u16 val); - -int aptina_camera_module_read_reg( - struct aptina_camera_module *cam_mod, - u16 data_length, - u16 reg, - u32 *val); - -int aptina_camera_module_read_reg_table( - struct aptina_camera_module *cam_mod, - u16 reg, - u32 *val); - -int aptina_camera_module_try_fmt( - struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *fmt); - -int aptina_camera_module_s_fmt( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int aptina_camera_module_g_fmt( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int aptina_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int aptina_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int aptina_camera_module_s_stream( - struct v4l2_subdev *sd, - int enable); - -int aptina_camera_module_s_power( - struct v4l2_subdev *sd, - int on); - -int aptina_camera_module_g_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int aptina_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int aptina_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls); - -int aptina_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *file); - -int aptina_camera_module_init( - struct aptina_camera_module *cam_mod, - struct aptina_camera_module_custom_config *custom); - -void aptina_camera_module_release( - struct aptina_camera_module *cam_mod); - -long aptina_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg); - -int aptina_camera_module_get_flip_mirror( - struct aptina_camera_module *cam_mod); -#endif - diff --git a/drivers/media/i2c/soc_camera/rockchip/imx323_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/imx323_v4l2-i2c-subdev.c deleted file mode 100644 index 94c428357411..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/imx323_v4l2-i2c-subdev.c +++ /dev/null @@ -1,660 +0,0 @@ -/* - * IMX323 sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "imx_camera_module.h" - -#define IMX323_DRIVER_NAME "imx323" - -#define IMX323_AEC_PK_GAIN_REG 0x301e - -#define IMX323_AEC_PK_EXPO_HIGH_REG 0x0202 -#define IMX323_AEC_PK_EXPO_LOW_REG 0x0203 - -#define IMX323_FETCH_HIGH_BYTE_EXP(VAL) ((VAL >> 8) & 0xFF) -#define IMX323_FETCH_LOW_BYTE_EXP(VAL) (VAL & 0xFF) - -#define IMX323_PID_ADDR 0x0112 -#define IMX323_PID_MAGIC 0xa - -#define IMX323_TIMING_VTS_HIGH_REG 0x0340 -#define IMX323_TIMING_VTS_LOW_REG 0x0341 -#define IMX323_TIMING_HTS_HIGH_REG 0x0342 -#define IMX323_TIMING_HTS_LOW_REG 0x0343 - -#define IMX323_INTEGRATION_TIME_MARGIN 8 -#define IMX323_FINE_INTG_TIME_MIN 0 -#define IMX323_FINE_INTG_TIME_MAX_MARGIN 0 -#define IMX323_COARSE_INTG_TIME_MIN 16 -#define IMX323_COARSE_INTG_TIME_MAX_MARGIN 4 - -#define IMX323_ORIENTATION_REG 0x0101 -#define IMX323_ORIENTATION_H 0x1 -#define IMX323_ORIENTATION_V 0x2 - -#define IMX323_EXT_CLK 37125000 - -static struct imx_camera_module imx323; -static struct imx_camera_module_custom_config imx323_custom_config; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ - -/* MCLK:37.125MHz 1920x1080 30fps DVP_12_DATA PCLK:74.25MHz */ -static struct imx_camera_module_reg imx323_init_tab_1920_1080_30fps[] = { - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {IMX_CAMERA_MODULE_REG_TYPE_TIMEOUT, 0x0000, 0x01}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x0009, 0xf0}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x0112, 0x0c}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x0113, 0x0c}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x0340, 0x04}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x0341, 0x65}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x0342, 0x04}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x0343, 0x4c}, - {IMX_CAMERA_MODULE_REG_TYPE_TIMEOUT, 0x0000, 0x01}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3000, 0x31}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3002, 0x0f}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x00}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3012, 0x82}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0x40}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3016, 0x3c}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x301a, 0xc9}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x301c, 0x50}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x301f, 0x73}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3021, 0x00}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3022, 0x40}, - {IMX_CAMERA_MODULE_REG_TYPE_TIMEOUT, 0x0000, 0x01}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3027, 0x20}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x302c, 0x00}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x303f, 0x0a}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x304f, 0x47}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3054, 0x11}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x307a, 0x00}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x307b, 0x00}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3098, 0x26}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3099, 0x02}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x309a, 0x26}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x309b, 0x02}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x30ce, 0x16}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x30cf, 0x82}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x30d0, 0x00}, - {IMX_CAMERA_MODULE_REG_TYPE_DATA, 0x3117, 0x0d} -}; - -/* ======================================================================== */ - -static struct imx_camera_module_config imx323_configs[] = { - { - .name = "1920x1080_30fps", - .frm_fmt = { - .width = 2200, - .height = 1125, - .code = MEDIA_BUS_FMT_SGBRG12_1X12 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)imx323_init_tab_1920_1080_30fps, - .reg_table_num_entries = - sizeof(imx323_init_tab_1920_1080_30fps) / - sizeof(imx323_init_tab_1920_1080_30fps[0]), - .v_blanking_time_us = 5000, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_DVP_CFG( - PLTFRM_CAM_ITF_BT601_12, - PLTFRM_CAM_SIGNAL_HIGH_LEVEL, - PLTFRM_CAM_SIGNAL_HIGH_LEVEL, - PLTFRM_CAM_SDR_NEG_EDG, - IMX323_EXT_CLK) - } -}; - -/*--------------------------------------------------------------------------*/ - -static int imx323_g_VTS(struct imx_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = imx_camera_module_read_reg_table( - cam_mod, - IMX323_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = imx_camera_module_read_reg_table( - cam_mod, - IMX323_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - - return 0; -err: - imx_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int imx323_auto_adjust_fps(struct imx_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - if ((exp_time + IMX323_COARSE_INTG_TIME_MAX_MARGIN) - > cam_mod->vts_min) - vts = exp_time + IMX323_COARSE_INTG_TIME_MAX_MARGIN; - else - vts = cam_mod->vts_min; - ret = imx_camera_module_write_reg(cam_mod, - IMX323_TIMING_VTS_LOW_REG, vts & 0xFF); - ret |= imx_camera_module_write_reg(cam_mod, - IMX323_TIMING_VTS_HIGH_REG, (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - imx_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - imx_camera_module_pr_info(cam_mod, - "updated vts = %d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int imx323_set_vts(struct imx_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts < cam_mod->vts_min) - return ret; - - if (vts > 0xfff) - vts = 0xfff; - - ret = imx_camera_module_write_reg(cam_mod, - IMX323_TIMING_VTS_LOW_REG, vts & 0xFF); - ret |= imx_camera_module_write_reg(cam_mod, - IMX323_TIMING_VTS_HIGH_REG, (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - imx_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - } else { - imx_camera_module_pr_info(cam_mod, "updated vts=%d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int imx323_write_aec(struct imx_camera_module *cam_mod) -{ - int ret = 0; - - imx_camera_module_pr_debug(cam_mod, - "exp_time = %d, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if ((cam_mod->state == IMX_CAMERA_MODULE_SW_STANDBY) || - (cam_mod->state == IMX_CAMERA_MODULE_STREAMING)) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time = cam_mod->exp_config.exp_time; - - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - - mutex_lock(&cam_mod->lock); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = imx323_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - - /* Gain */ - ret = imx_camera_module_write_reg(cam_mod, - IMX323_AEC_PK_GAIN_REG, a_gain); - - /* Integration Time */ - ret = imx_camera_module_write_reg(cam_mod, - IMX323_AEC_PK_EXPO_HIGH_REG, - IMX323_FETCH_HIGH_BYTE_EXP(exp_time)); - ret |= imx_camera_module_write_reg(cam_mod, - IMX323_AEC_PK_EXPO_LOW_REG, - IMX323_FETCH_LOW_BYTE_EXP(exp_time)); - - if (!cam_mod->auto_adjust_fps) - ret |= imx323_set_vts(cam_mod, cam_mod->exp_config.vts_value); - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - imx_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int imx323_g_ctrl(struct imx_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - imx_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - imx_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int imx323_filltimings(struct imx_camera_module_custom_config *custom) -{ - int i, j; - struct imx_camera_module_config *config; - struct imx_camera_module_timings *timings; - struct imx_camera_module_reg *reg_table; - int reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case IMX323_TIMING_VTS_HIGH_REG: - timings->frame_length_lines = - reg_table[j].val << 8; - break; - case IMX323_TIMING_VTS_LOW_REG: - timings->frame_length_lines |= reg_table[j].val; - break; - case IMX323_TIMING_HTS_HIGH_REG: - timings->line_length_pck = - (reg_table[j].val << 8); - break; - case IMX323_TIMING_HTS_LOW_REG: - timings->line_length_pck |= reg_table[j].val; - break; - } - } - - timings->exp_time >>= 4; - timings->line_length_pck = timings->line_length_pck * 2; - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator - * timings->frame_length_lines - * timings->line_length_pck; - - timings->coarse_integration_time_min = - IMX323_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - IMX323_COARSE_INTG_TIME_MAX_MARGIN; - - /* IMX Sensor do not use fine integration time. */ - timings->fine_integration_time_min = IMX323_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - IMX323_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -static int imx323_g_timings(struct imx_camera_module *cam_mod, - struct imx_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - - timings->frame_length_lines = vts; - - return ret; -err: - imx_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int imx323_set_flip( - struct imx_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - int i, mode = 0; - u16 orientation = 0; - - mode = imx_camera_module_get_flip_mirror(cam_mod); - if (mode == -1) { - imx_camera_module_pr_info(cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - if (PLTFRM_CAMERA_MODULE_IS_MIRROR(mode)) - orientation |= 0x01; - if (PLTFRM_CAMERA_MODULE_IS_FLIP(mode)) - orientation |= 0x02; - for (i = 0; i < len; i++) { - if (reglist[i].reg == IMX323_ORIENTATION_REG) - reglist[i].val = orientation; - } - } - - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int imx323_s_ctrl(struct imx_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - imx_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = imx323_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - imx_camera_module_pr_debug(cam_mod, - "failed with error (%d) 0x%x\n", - ret, ctrl_id); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int imx323_s_ext_ctrls(struct imx_camera_module *cam_mod, - struct imx_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = imx323_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - imx_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int imx323_start_streaming(struct imx_camera_module *cam_mod) -{ - int ret = 0; - - imx_camera_module_pr_debug(cam_mod, - "active config=%s\n", cam_mod->active_config->name); - - ret = imx323_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - - mutex_lock(&cam_mod->lock); - ret = imx_camera_module_write_reg(cam_mod, 0x0100, 1); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - imx_camera_module_pr_err(cam_mod, "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int imx323_stop_streaming(struct imx_camera_module *cam_mod) -{ - int ret = 0; - - imx_camera_module_pr_debug(cam_mod, "\n"); - - mutex_lock(&cam_mod->lock); - ret = imx_camera_module_write_reg(cam_mod, 0x0100, 0); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - imx_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int imx323_check_camera_id(struct imx_camera_module *cam_mod) -{ - u32 pid; - int ret = 0; - - imx_camera_module_pr_debug(cam_mod, "\n"); - - ret |= imx_camera_module_read_reg(cam_mod, 1, IMX323_PID_ADDR, &pid); - if (IS_ERR_VALUE(ret)) { - imx_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if (pid == IMX323_PID_MAGIC) { - imx_camera_module_pr_debug(cam_mod, - "successfully detected camera ID 0x%02x\n", - pid); - } else { - imx_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x, detected 0x%02x\n", - IMX323_PID_MAGIC, pid); - ret = -EINVAL; - goto err; - } - - return 0; -err: - imx_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops imx323_camera_module_core_ops = { - .g_ctrl = imx_camera_module_g_ctrl, - .s_ctrl = imx_camera_module_s_ctrl, - .s_ext_ctrls = imx_camera_module_s_ext_ctrls, - .s_power = imx_camera_module_s_power, - .ioctl = imx_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops imx323_camera_module_video_ops = { - .s_frame_interval = imx_camera_module_s_frame_interval, - .g_frame_interval = imx_camera_module_g_frame_interval, - .s_stream = imx_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops imx323_camera_module_pad_ops = { - .enum_frame_interval = imx_camera_module_enum_frameintervals, - .get_fmt = imx_camera_module_g_fmt, - .set_fmt = imx_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops imx323_camera_module_ops = { - .core = &imx323_camera_module_core_ops, - .video = &imx323_camera_module_video_ops, - .pad = &imx323_camera_module_pad_ops -}; - -static struct imx_camera_module_custom_config imx323_custom_config = { - .start_streaming = imx323_start_streaming, - .stop_streaming = imx323_stop_streaming, - .s_ctrl = imx323_s_ctrl, - .s_ext_ctrls = imx323_s_ext_ctrls, - .g_ctrl = imx323_g_ctrl, - .g_timings = imx323_g_timings, - .check_camera_id = imx323_check_camera_id, - .set_flip = imx323_set_flip, - .s_vts = imx323_auto_adjust_fps, - .configs = imx323_configs, - .num_configs = ARRAY_SIZE(imx323_configs), - .power_up_delays_ms = {5, 20, 0}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static int imx323_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - imx323_filltimings(&imx323_custom_config); - v4l2_i2c_subdev_init(&imx323.sd, client, &imx323_camera_module_ops); - imx323.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; - imx323.custom = imx323_custom_config; - - mutex_init(&imx323.lock); - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -static int imx323_remove(struct i2c_client *client) -{ - struct imx_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - mutex_destroy(&cam_mod->lock); - imx_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id imx323_id[] = { - { IMX323_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id imx323_of_match[] = { - {.compatible = "sony,imx323-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, imx323_id); - -static struct i2c_driver imx323_i2c_driver = { - .driver = { - .name = IMX323_DRIVER_NAME, - .owner = THIS_MODULE, - .of_match_table = imx323_of_match - }, - .probe = imx323_probe, - .remove = imx323_remove, - .id_table = imx323_id, -}; - -module_i2c_driver(imx323_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for IMX323"); -MODULE_AUTHOR("George"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/imx_camera_module.c b/drivers/media/i2c/soc_camera/rockchip/imx_camera_module.c deleted file mode 100644 index 5ff3d5f16eb4..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/imx_camera_module.c +++ /dev/null @@ -1,1315 +0,0 @@ -/* - * imx_camera_module.c - * - * Generic sony sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "imx_camera_module.h" - -static struct imx_camera_module *to_imx_camera_module(struct v4l2_subdev *sd) -{ - return container_of(sd, struct imx_camera_module, sd); -} - -/* ======================================================================== */ - -static void imx_camera_module_reset( - struct imx_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->inited = false; - cam_mod->active_config = NULL; - cam_mod->update_config = true; - cam_mod->frm_fmt_valid = false; - cam_mod->frm_intrvl_valid = false; - cam_mod->exp_config.auto_exp = false; - cam_mod->exp_config.auto_gain = false; - cam_mod->wb_config.auto_wb = false; - cam_mod->auto_adjust_fps = true; - cam_mod->rotation = 0; - cam_mod->ctrl_updt = 0; - cam_mod->state = IMX_CAMERA_MODULE_POWER_OFF; - cam_mod->state_before_suspend = IMX_CAMERA_MODULE_POWER_OFF; - cam_mod->exp_config.exp_time = 0; - cam_mod->exp_config.gain = 0; - cam_mod->vts_cur = 0; -} - -/* ======================================================================== */ - -static void imx_camera_module_set_active_config( - struct imx_camera_module *cam_mod, - struct imx_camera_module_config *new_config) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(new_config)) { - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no active config\n"); - } else { - cam_mod->ctrl_updt &= IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP | - IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN | - IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - if (new_config->auto_exp_enabled != - cam_mod->exp_config.auto_exp) { - cam_mod->ctrl_updt |= - IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = - new_config->auto_exp_enabled; - } - if (new_config->auto_gain_enabled != - cam_mod->exp_config.auto_gain) { - cam_mod->ctrl_updt |= - IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = - new_config->auto_gain_enabled; - } - if (new_config->auto_wb_enabled != - cam_mod->wb_config.auto_wb) { - cam_mod->ctrl_updt |= - IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = - new_config->auto_wb_enabled; - } - if (new_config != cam_mod->active_config) { - cam_mod->update_config = true; - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "activating config '%s'\n", - cam_mod->active_config->name); - } - } -} - -/* ======================================================================== */ - -static struct imx_camera_module_config *imx_camera_module_find_config( - struct imx_camera_module *cam_mod, - struct v4l2_mbus_framefmt *fmt, - struct v4l2_subdev_frame_interval *frm_intrvl) -{ - u32 i; - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - - if (!IS_ERR_OR_NULL(fmt)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (!IS_ERR_OR_NULL(frm_intrvl)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "frame interval %d/%d\n", - frm_intrvl->interval.numerator, - frm_intrvl->interval.denominator); - - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (!IS_ERR_OR_NULL(frm_intrvl)) { - gcdiv = gcd(cam_mod->custom.configs[i]. - frm_intrvl.interval.numerator, - cam_mod->custom.configs[i]. - frm_intrvl.interval.denominator); - norm_interval.interval.numerator = - cam_mod->custom.configs[i]. - frm_intrvl.interval.numerator / gcdiv; - norm_interval.interval.denominator = - cam_mod->custom.configs[i]. - frm_intrvl.interval.denominator / gcdiv; - if ((frm_intrvl->interval.numerator != - norm_interval.interval.numerator) || - (frm_intrvl->interval.denominator != - norm_interval.interval.denominator)) - continue; - } - if (!IS_ERR_OR_NULL(fmt)) { - if ((cam_mod->custom.configs[i].frm_fmt.width != - fmt->width) || - (cam_mod->custom.configs[i].frm_fmt.height != - fmt->height) || - (cam_mod->custom.configs[i].frm_fmt.code != - fmt->code)) { - continue; - } - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "found matching config %s\n", - cam_mod->custom.configs[i].name); - return &cam_mod->custom.configs[i]; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no matching config found\n"); - - return ERR_PTR(-EINVAL); -} - -/* ======================================================================== */ - -static int imx_camera_module_write_config( - struct imx_camera_module *cam_mod) -{ - int ret = 0; - struct imx_camera_module_reg *reg_table; - u32 reg_table_num_entries; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - - if (cam_mod->inited == false) { - cam_mod->active_config->soft_reset = true; - reg_table = cam_mod->active_config->reg_table; - reg_table_num_entries = - cam_mod->active_config->reg_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s\n", - cam_mod->active_config->name); - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.set_flip)) - cam_mod->custom.set_flip(cam_mod, - reg_table, reg_table_num_entries); - - ret = pltfrm_camera_module_write_reglist(&cam_mod->sd, - reg_table, reg_table_num_entries); - - if (IS_ERR_VALUE(ret)) - goto err; - ret = pltfrm_camera_module_patch_config(&cam_mod->sd, - &cam_mod->frm_fmt, - &cam_mod->frm_intrvl); - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -static int imx_camera_module_attach( - struct imx_camera_module *cam_mod) -{ - int ret = 0; - struct imx_camera_module_custom_config *custom; - - custom = &cam_mod->custom; - - if (custom->check_camera_id) { - imx_camera_module_s_power(&cam_mod->sd, 1); - ret = custom->check_camera_id(cam_mod); - imx_camera_module_s_power(&cam_mod->sd, 0); - if (ret != 0) - goto err; - } - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - imx_camera_module_release(cam_mod); - return ret; -} - -/* ======================================================================== */ - -int imx_camera_module_try_fmt(struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *fmt) -{ - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(imx_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "format not supported\n"); - return -EINVAL; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, "format supported\n"); - - return 0; -} - -/* ======================================================================== */ - -int imx_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(imx_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "format %dx%d, code 0x%04x, not supported\n", - fmt->width, fmt->height, fmt->code); - ret = -EINVAL; - goto err; - } - cam_mod->frm_fmt_valid = true; - cam_mod->frm_fmt = *fmt; - if (cam_mod->frm_intrvl_valid) { - imx_camera_module_set_active_config(cam_mod, - imx_camera_module_find_config(cam_mod, - fmt, &cam_mod->frm_intrvl)); - } else { - imx_camera_module_set_active_config(cam_mod, - imx_camera_module_find_config(cam_mod, - fmt, NULL)); - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int imx_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->active_config) { - fmt->code = cam_mod->active_config->frm_fmt.code; - fmt->width = cam_mod->active_config->frm_fmt.width; - fmt->height = cam_mod->active_config->frm_fmt.height; - return 0; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "no active config\n"); - - return -1; -} - -/* ======================================================================== */ - -int imx_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - struct imx_camera_module_config *config; - unsigned int vts; - int ret = 0; - - if ((interval->interval.denominator == 0) || - (interval->interval.numerator == 0)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "invalid frame interval %d/%d\n", - interval->interval.numerator, - interval->interval.denominator); - ret = -EINVAL; - goto err; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d/%d (%dfps)\n", - interval->interval.numerator, interval->interval.denominator, - (interval->interval.denominator + - (interval->interval.numerator >> 1)) / - interval->interval.numerator); - - /* normalize interval */ - gcdiv = gcd(interval->interval.numerator, - interval->interval.denominator); - norm_interval.interval.numerator = - interval->interval.numerator / gcdiv; - norm_interval.interval.denominator = - interval->interval.denominator / gcdiv; - - if (!cam_mod->frm_fmt_valid) - goto end; - config = imx_camera_module_find_config( - cam_mod, - &cam_mod->active_config->frm_fmt, - &norm_interval); - if (!IS_ERR_OR_NULL(config) && (config != cam_mod->active_config)) { - imx_camera_module_set_active_config(cam_mod, config); - if (cam_mod->state == IMX_CAMERA_MODULE_STREAMING) { - cam_mod->custom.stop_streaming(cam_mod); - imx_camera_module_write_config(cam_mod); - cam_mod->custom.start_streaming(cam_mod); - } - } else { - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - if (cam_mod->active_config->frm_intrvl.interval.denominator < - norm_interval.interval.denominator) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "%dx%d@%dfps isn't support!", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - norm_interval.interval.denominator); - ret = -EFAULT; - goto err; - } - - if (!cam_mod->custom.s_vts) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "custom.s_vts isn't support!"); - ret = -EFAULT; - goto err; - } - - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= norm_interval.interval.denominator; - cam_mod->vts_cur = vts; - - if (cam_mod->state != IMX_CAMERA_MODULE_STREAMING) - goto end; - - cam_mod->custom.s_vts(cam_mod, vts); - } - -end: - cam_mod->frm_intrvl_valid = true; - cam_mod->frm_intrvl = norm_interval; - cam_mod->auto_adjust_fps = false; - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -int imx_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - - if (cam_mod->active_config) { - if (cam_mod->state == IMX_CAMERA_MODULE_STREAMING) { - if (cam_mod->frm_intrvl_valid) { - *interval = cam_mod->frm_intrvl; - return 0; - } else { - *interval = cam_mod->active_config->frm_intrvl; - return 0; - } - } - } - - return -EFAULT; -} - -/* ======================================================================== */ - -int imx_camera_module_s_stream(struct v4l2_subdev *sd, int enable) -{ - int ret = 0; - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - unsigned int vts; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", enable); - - if (enable) { - if (cam_mod->state == IMX_CAMERA_MODULE_STREAMING) - return 0; - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration, cannot start streaming\n"); - ret = -EFAULT; - goto err; - } - if (cam_mod->state != IMX_CAMERA_MODULE_SW_STANDBY) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "sensor is not powered on (in state %d), cannot start streaming\n", - cam_mod->state); - ret = -EINVAL; - goto err; - } - if (cam_mod->update_config) { - ret = imx_camera_module_write_config(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - } - - ret = cam_mod->custom.start_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - if (cam_mod->frm_intrvl_valid) { - if ((cam_mod->frm_intrvl.interval.numerator != - cam_mod->active_config->frm_intrvl.interval.numerator) || - (cam_mod->frm_intrvl.interval.denominator != - cam_mod->active_config->frm_intrvl.interval.denominator)) { - if (cam_mod->frm_intrvl.interval.denominator > - cam_mod->active_config->frm_intrvl.interval.denominator) { - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "sensor is not support stream: %dx%d@(%d/%d)fps!\n", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - cam_mod->frm_intrvl.interval.denominator, - cam_mod->frm_intrvl.interval.numerator); - goto end; - } - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= cam_mod->frm_intrvl.interval.denominator; - cam_mod->custom.s_vts(cam_mod, vts); - } - } - - if (!cam_mod->inited && cam_mod->update_config) - cam_mod->inited = true; - cam_mod->update_config = false; - cam_mod->ctrl_updt = 0; - mdelay(cam_mod->custom.power_up_delays_ms[2]); - cam_mod->state = IMX_CAMERA_MODULE_STREAMING; - - } else { - int pclk; - int wait_ms; - struct isp_supplemental_sensor_mode_data timings; - - if (cam_mod->state != IMX_CAMERA_MODULE_STREAMING) - return 0; - ret = cam_mod->custom.stop_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = imx_camera_module_ioctl(sd, - RK_VIDIOC_SENSOR_MODE_DATA, - &timings); - - cam_mod->state = IMX_CAMERA_MODULE_SW_STANDBY; - - if (IS_ERR_VALUE(ret)) - goto err; - - pclk = timings.vt_pix_clk_freq_hz / 1000; - - if (!pclk) - goto err; - - wait_ms = - (timings.line_length_pck * - timings.frame_length_lines) / - pclk; - - /* - * wait for a frame period to make sure that there is - * no pending frame left. - */ - - msleep(wait_ms + 1); - } - -end: - cam_mod->state_before_suspend = cam_mod->state; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int imx_camera_module_s_power(struct v4l2_subdev *sd, int on) -{ - int ret = 0; - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - struct v4l2_subdev *af_ctrl; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "%d state:%d\n", on, cam_mod->state); - - if (on) { - if (cam_mod->state == IMX_CAMERA_MODULE_POWER_OFF) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 1); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[0]); - cam_mod->state = IMX_CAMERA_MODULE_HW_STANDBY; - } - } - if (cam_mod->state == IMX_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[1]); - cam_mod->state = IMX_CAMERA_MODULE_SW_STANDBY; - if (!IS_ERR_OR_NULL( - cam_mod->custom.init_common) && - cam_mod->custom.init_common( - cam_mod)) - usleep_range(1000, 1500); - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - v4l2_subdev_call(af_ctrl, - core, init, 0); - } - } - } - } else { - if (cam_mod->state == IMX_CAMERA_MODULE_STREAMING) { - ret = imx_camera_module_s_stream(sd, 0); - if (!IS_ERR_VALUE(ret)) - cam_mod->state = IMX_CAMERA_MODULE_SW_STANDBY; - } - if (cam_mod->state == IMX_CAMERA_MODULE_SW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - if (!IS_ERR_VALUE(ret)) - cam_mod->state = IMX_CAMERA_MODULE_HW_STANDBY; - } - if (cam_mod->state == IMX_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 0); - if (!IS_ERR_VALUE(ret)) { - cam_mod->state = IMX_CAMERA_MODULE_POWER_OFF; - imx_camera_module_reset(cam_mod); - } - } - } - - cam_mod->state_before_suspend = cam_mod->state; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "%s failed, camera left in state %d\n", - on ? "on" : "off", cam_mod->state); - goto err; - } else - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "camera powered %s\n", on ? "on" : "off"); - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int imx_camera_module_g_ctrl(struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - int ret; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, " id 0x%x\n", ctrl->id); - - if (ctrl->id == V4L2_CID_FLASH_LED_MODE) { - ctrl->value = cam_mod->exp_config.flash_mode; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_HFLIP) { - ctrl->value = cam_mod->hflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_HFLIP %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_VFLIP) { - ctrl->value = cam_mod->vflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_VFLIP %d\n", - ctrl->value); - return 0; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active configuration\n"); - return -EFAULT; - } - - if (ctrl->id == RK_V4L2_CID_VBLANKING) { - ctrl->value = cam_mod->active_config->v_blanking_time_us; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_VBLANKING %d\n", - ctrl->value); - return 0; - } - - if ((cam_mod->state != IMX_CAMERA_MODULE_SW_STANDBY) && - (cam_mod->state != IMX_CAMERA_MODULE_STREAMING)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cannot get controls when camera is off\n"); - return -EFAULT; - } - - if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - ret = v4l2_subdev_call(af_ctrl, core, g_ctrl, ctrl); - return ret; - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.g_ctrl)) { - ret = cam_mod->custom.g_ctrl(cam_mod, ctrl->id); - if (IS_ERR_VALUE(ret)) - return ret; - } - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl->value = cam_mod->exp_config.gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE: - ctrl->value = cam_mod->exp_config.exp_time; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl->value = cam_mod->wb_config.temperature; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.preset_id; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl->value = cam_mod->exp_config.auto_gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl->value = cam_mod->exp_config.auto_exp; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.auto_wb; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - ctrl->value = cam_mod->af_config.abs_pos; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - default: - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed, unknown ctrl %d\n", ctrl->id); - return -EINVAL; - } - - return 0; -} - -static int flash_light_ctrl( - struct v4l2_subdev *sd, - struct imx_camera_module *cam_mod, - int value) -{ - return 0; -} - -/* ======================================================================== */ - -int imx_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls) -{ - int i; - int ctrl_cnt = 0; - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - struct imx_camera_module_ext_ctrls imx_ctrls; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - if (ctrls->count == 0) - return -EINVAL; - - for (i = 0; i < ctrls->count; i++) { - struct v4l2_ext_control *ctrl; - u32 ctrl_updt = 0; - - ctrl = &ctrls->controls[i]; - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl_updt = IMX_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case RK_V4L2_CID_GAIN_PERCENT: - ctrl_updt = IMX_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain_percent = ctrl->value; - break; - case V4L2_CID_FLASH_LED_MODE: - ret = flash_light_ctrl(sd, cam_mod, ctrl->value); - if (ret == 0) { - cam_mod->exp_config.flash_mode = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - } - break; - case V4L2_CID_EXPOSURE: - ctrl_updt = IMX_CAMERA_MODULE_CTRL_UPDT_EXP_TIME; - cam_mod->exp_config.exp_time = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_VTS: - ctrl_updt = IMX_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE; - cam_mod->exp_config.vts_value = ctrl->value; - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl_updt = IMX_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE; - cam_mod->wb_config.temperature = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl_updt = IMX_CAMERA_MODULE_CTRL_UPDT_PRESET_WB; - cam_mod->wb_config.preset_id = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl_updt = IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl_updt = IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl_updt = IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_AUTO_FPS: - cam_mod->auto_adjust_fps = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_AUTO_FPS %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - struct v4l2_control single_ctrl; - - single_ctrl.id = - V4L2_CID_FOCUS_ABSOLUTE; - single_ctrl.value = ctrl->value; - ret = v4l2_subdev_call(af_ctrl, - core, s_ctrl, &single_ctrl); - return ret; - } - } - ctrl_updt = - IMX_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE; - cam_mod->af_config.abs_pos = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - case V4L2_CID_HFLIP: - if (ctrl->value) - cam_mod->hflip = true; - else - cam_mod->hflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_VFLIP: - if (ctrl->value) - cam_mod->vflip = true; - else - cam_mod->vflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_TEST_PATTERN: - imx_ctrls.ctrls = - kmalloc_array(ctrls->count, - sizeof(*imx_ctrls.ctrls), - GFP_KERNEL); - if (imx_ctrls.ctrls) { - for (i = 0; i < ctrls->count; i++) { - imx_ctrls.ctrls[i].id = - ctrls->controls[i].id; - imx_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - imx_ctrls.count = ctrls->count; - ret = cam_mod->custom.s_ext_ctrls(cam_mod, - &imx_ctrls); - } - kfree(imx_ctrls.ctrls); - break; - default: - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "ignoring unknown ctrl 0x%x\n", ctrl->id); - break; - } - - if (cam_mod->state != IMX_CAMERA_MODULE_SW_STANDBY && - cam_mod->state != IMX_CAMERA_MODULE_STREAMING) - cam_mod->ctrl_updt |= ctrl_updt; - else if (ctrl_updt) - ctrl_cnt++; - } - - /* if camera module is already streaming, write through */ - if (ctrl_cnt && - (cam_mod->state == IMX_CAMERA_MODULE_STREAMING || - cam_mod->state == IMX_CAMERA_MODULE_SW_STANDBY)) { - struct imx_camera_module_ext_ctrls imx_ctrls; - - imx_ctrls.ctrls = - (struct imx_camera_module_ext_ctrl *) - kmalloc(ctrl_cnt * sizeof(struct imx_camera_module_ext_ctrl), - GFP_KERNEL); - - if (imx_ctrls.ctrls) { - for (i = 0; i < ctrl_cnt; i++) { - imx_ctrls.ctrls[i].id = ctrls->controls[i].id; - imx_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - - imx_ctrls.count = ctrl_cnt; - - ret = cam_mod->custom.s_ext_ctrls(cam_mod, &imx_ctrls); - - kfree(imx_ctrls.ctrls); - } else { - ret = -ENOMEM; - } - - if (IS_ERR_VALUE(ret)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed with error %d\n", ret); - } - - return ret; -} - -/* ======================================================================== */ - -int imx_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - struct v4l2_ext_control ext_ctrl[1]; - struct v4l2_ext_controls ext_ctrls; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "0x%x 0x%x\n", ctrl->id, ctrl->value); - - ext_ctrl[0].id = ctrl->id; - ext_ctrl[0].value = ctrl->value; - - ext_ctrls.count = 1; - ext_ctrls.controls = ext_ctrl; - - return imx_camera_module_s_ext_ctrls(sd, &ext_ctrls); -} - -/* ======================================================================== */ - -long imx_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - int ret, i; - unsigned int flag, val; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "cmd: 0x%x\n", cmd); - - if (cmd == RK_VIDIOC_SENSOR_MODE_DATA) { - struct imx_camera_module_timings imx_timings; - struct isp_supplemental_sensor_mode_data *timings = - (struct isp_supplemental_sensor_mode_data *)arg; - - if (cam_mod->custom.g_timings) - ret = cam_mod->custom.g_timings(cam_mod, &imx_timings); - else - ret = -EPERM; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; - } - - timings->sensor_output_width = - imx_timings.sensor_output_width; - timings->sensor_output_height = - imx_timings.sensor_output_height; - timings->crop_horizontal_start = - imx_timings.crop_horizontal_start; - timings->crop_vertical_start = - imx_timings.crop_vertical_start; - timings->crop_horizontal_end = - imx_timings.crop_horizontal_end; - timings->crop_vertical_end = imx_timings.crop_vertical_end; - timings->line_length_pck = imx_timings.line_length_pck; - timings->frame_length_lines = imx_timings.frame_length_lines; - timings->vt_pix_clk_freq_hz = imx_timings.vt_pix_clk_freq_hz; - timings->binning_factor_x = imx_timings.binning_factor_x; - timings->binning_factor_y = imx_timings.binning_factor_y; - timings->coarse_integration_time_max_margin = - imx_timings.coarse_integration_time_max_margin; - timings->coarse_integration_time_min = - imx_timings.coarse_integration_time_min; - timings->fine_integration_time_max_margin = - imx_timings.fine_integration_time_max_margin; - timings->fine_integration_time_min = - imx_timings.fine_integration_time_min; - - timings->exposure_valid_frame[0] = - cam_mod->custom.exposure_valid_frame[0]; - timings->exposure_valid_frame[1] = - cam_mod->custom.exposure_valid_frame[1]; - timings->exp_time = cam_mod->exp_config.exp_time; - timings->gain = cam_mod->exp_config.gain; - - if (cam_mod->exp_config.exp_time) - timings->exp_time = cam_mod->exp_config.exp_time; - else - timings->exp_time = imx_timings.exp_time; - - if (cam_mod->exp_config.gain) - timings->gain = cam_mod->exp_config.gain; - else - timings->gain = imx_timings.gain; - - if (cam_mod->active_config) { - timings->max_exp_gain_h = cam_mod->active_config->max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->active_config->max_exp_gain_l; - } else { - timings->max_exp_gain_h = cam_mod->custom.configs[0].max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->custom.configs[0].max_exp_gain_l; - } - return ret; - } else if (cmd == RK_VIDIOC_SENSOR_CONFIGINFO) { - struct sensor_config_info_s *sensor_config = (struct sensor_config_info_s *)arg; - - sensor_config->config_num = cam_mod->custom.num_configs; - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (i >= SENSOR_CONFIG_NUM) - break; - sensor_config->sensor_fmt[i] = - pltfrm_camera_module_pix_fmt2csi2_dt(cam_mod->custom.configs[i].frm_fmt.code); - sensor_config->reso[i].width = cam_mod->custom.configs[i].frm_fmt.width; - sensor_config->reso[i].height = cam_mod->custom.configs[i].frm_fmt.height; - } - return 0; - } else if (cmd == RK_VIDIOC_SENSOR_REG_ACCESS) { - struct sensor_reg_rw_s *sensor_rw = (struct sensor_reg_rw_s *)arg; - - if (sensor_rw->reg_access_mode == SENSOR_READ_MODE) { - for (i = 0; i < cam_mod->custom.configs[0].reg_table_num_entries; i++) { - flag = cam_mod->custom.configs[0].reg_table[i].flag; - if (flag != PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) - break; - } - if (flag == PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "Can not get sensor reg type.\n"); - return -EINVAL; - } - sensor_rw->reg_addr_len = PLTFRM_CAMERA_MODULE_REG_LEN(flag); - sensor_rw->reg_data_len = PLTFRM_CAMERA_MODULE_DATA_LEN(flag); - pltfrm_camera_module_read_reg_ex(&cam_mod->sd, 1, flag, sensor_rw->addr, &val); - sensor_rw->data = val; - } else { - flag = (sensor_rw->reg_addr_len << PLTFRM_CAMERA_MODULE_REG_LEN_BIT); - flag |= (sensor_rw->reg_data_len << PLTFRM_CAMERA_MODULE_DATA_LEN_BIT); - pltfrm_camera_module_write_reg_ex(&cam_mod->sd, flag, sensor_rw->addr, sensor_rw->data); - } - return 0; - } else if (cmd == PLTFRM_CIFCAM_G_ITF_CFG) { - struct pltfrm_cam_itf *itf_cfg = (struct pltfrm_cam_itf *)arg; - struct imx_camera_module_config *config; - - if (cam_mod->custom.num_configs <= 0) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cam_mod->custom.num_configs is NULL, Get interface config failed!\n"); - return -EINVAL; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - config = &cam_mod->custom.configs[0]; - else - config = cam_mod->active_config; - - *itf_cfg = config->itf_cfg; - - pltfrm_camera_module_ioctl(sd, PLTFRM_CIFCAM_G_ITF_CFG, arg); - return 0; - } else if (cmd == PLTFRM_CIFCAM_ATTACH) { - ret = imx_camera_module_init(cam_mod, &cam_mod->custom); - if (!IS_ERR_VALUE(ret)) { - pltfrm_camera_module_ioctl(sd, cmd, arg); - return imx_camera_module_attach(cam_mod); - } else { - imx_camera_module_release(cam_mod); - return ret; - } - } - - ret = pltfrm_camera_module_ioctl(sd, cmd, arg); - return ret; -} - -/* ======================================================================== */ - -int imx_camera_module_get_flip_mirror( - struct imx_camera_module *cam_mod) -{ - int mode = 0; - - if (!cam_mod->flip_flg) - return -1; - - if (cam_mod->hflip) - mode |= IMX_MIRROR_BIT_MASK; - else - mode &= ~IMX_MIRROR_BIT_MASK; - - if (cam_mod->vflip) - mode |= IMX_FLIP_BIT_MASK; - else - mode &= ~IMX_FLIP_BIT_MASK; - - return mode; -} - -/* ======================================================================== */ - -int imx_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie) -{ - struct imx_camera_module *cam_mod = to_imx_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", fie->index); - - if (fie->index >= cam_mod->custom.num_configs) - return -EINVAL; - fie->code = - cam_mod->custom.configs[fie->index].frm_fmt.code; - fie->width = - cam_mod->custom.configs[fie->index].frm_fmt.width; - fie->height = - cam_mod->custom.configs[fie->index].frm_fmt.height; - fie->interval.numerator = cam_mod->custom. - configs[fie->index].frm_intrvl.interval.numerator; - fie->interval.denominator = cam_mod->custom. - configs[fie->index].frm_intrvl.interval.denominator; - return 0; -} - -/* ======================================================================== */ - -int imx_camera_module_write_reglist( - struct imx_camera_module *cam_mod, - const struct imx_camera_module_reg reglist[], - int len) -{ - return pltfrm_camera_module_write_reglist(&cam_mod->sd, reglist, len); -} - -/* ======================================================================== */ - -int imx_camera_module_write_reg( - struct imx_camera_module *cam_mod, - u16 reg, - u8 val) -{ - return pltfrm_camera_module_write_reg(&cam_mod->sd, reg, val); -} - -/* ======================================================================== */ - -int imx_camera_module_read_reg( - struct imx_camera_module *cam_mod, - u16 data_length, - u16 reg, - u32 *val) -{ - return pltfrm_camera_module_read_reg(&cam_mod->sd, - data_length, reg, val); -} - -/* ======================================================================== */ - -int imx_camera_module_read_reg_table( - struct imx_camera_module *cam_mod, - u16 reg, - u32 *val) -{ - int i; - - if (cam_mod->state == IMX_CAMERA_MODULE_STREAMING) - return pltfrm_camera_module_read_reg(&cam_mod->sd, - 1, reg, val); - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - for ( - i = cam_mod->active_config->reg_table_num_entries - 1; - i > 0; - i--) { - if (cam_mod->active_config->reg_table[i].reg == reg) { - *val = cam_mod->active_config->reg_table[i].val; - return 0; - } - } - } - - if (cam_mod->state == IMX_CAMERA_MODULE_SW_STANDBY) - return pltfrm_camera_module_read_reg(&cam_mod->sd, - 1, reg, val); - - return -EFAULT; -} - -/* ======================================================================== */ - -int imx_camera_module_init(struct imx_camera_module *cam_mod, - struct imx_camera_module_custom_config *custom) -{ - int ret = 0; - int mode = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->hflip = false; - cam_mod->vflip = false; - cam_mod->flip_flg = false; - imx_camera_module_reset(cam_mod); - - if (IS_ERR_OR_NULL(custom->start_streaming) || - IS_ERR_OR_NULL(custom->stop_streaming) || - IS_ERR_OR_NULL(custom->s_ctrl) || - IS_ERR_OR_NULL(custom->g_ctrl)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "mandatory callback function is missing\n"); - ret = -EINVAL; - goto err; - } - - ret = pltfrm_camera_module_init(&cam_mod->sd, &cam_mod->pltfm_data); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - if (IS_ERR_VALUE(ret)) { - imx_camera_module_release(cam_mod); - goto err; - } - - mode = pltfrm_camera_module_get_flip_mirror(&cam_mod->sd); - if (mode != -1) { - cam_mod->hflip = mode & IMX_MIRROR_BIT_MASK ? true : false; - cam_mod->vflip = mode & IMX_FLIP_BIT_MASK ? true : false; - cam_mod->flip_flg = true; - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -void imx_camera_module_release(struct imx_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->custom.configs = NULL; - - pltfrm_camera_module_release(&cam_mod->sd); - v4l2_device_unregister_subdev(&cam_mod->sd); -} diff --git a/drivers/media/i2c/soc_camera/rockchip/imx_camera_module.h b/drivers/media/i2c/soc_camera/rockchip/imx_camera_module.h deleted file mode 100644 index d0f691d8fddd..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/imx_camera_module.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - * imx_camera_module.h - * - * Generic sony sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#ifndef IMX_CAMERA_MODULE_H -#define IMX_CAMERA_MODULE_H -#include -#include -#include -/* - * TODO: references to v4l2 should be reomved from here and go into a - * platform dependent wrapper - */ - -#define IMX_CAMERA_MODULE_REG_TYPE_DATA PLTFRM_CAMERA_MODULE_REG_TYPE_DATA -#define IMX_CAMERA_MODULE_REG_TYPE_TIMEOUT PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT -#define imx_camera_module_csi_config -#define imx_camera_module_reg pltfrm_camera_module_reg - -#define IMX_FLIP_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_FLIP_BIT) -#define IMX_MIRROR_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_MIRROR_BIT) - -#define IMX_CAMERA_MODULE_CTRL_UPDT_GAIN 0x01 -#define IMX_CAMERA_MODULE_CTRL_UPDT_EXP_TIME 0x02 -#define IMX_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE 0x04 -#define IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_WB 0x08 -#define IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN 0x10 -#define IMX_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP 0x20 -#define IMX_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE 0x40 -#define IMX_CAMERA_MODULE_CTRL_UPDT_PRESET_WB 0x80 -#define IMX_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE 0x100 - -enum imx_camera_module_state { - IMX_CAMERA_MODULE_POWER_OFF = 0, - IMX_CAMERA_MODULE_HW_STANDBY = 1, - IMX_CAMERA_MODULE_SW_STANDBY = 2, - IMX_CAMERA_MODULE_STREAMING = 3 -}; - -struct imx_camera_module; - -struct imx_camera_module_timings { - u32 coarse_integration_time_min; - u32 coarse_integration_time_max_margin; - u32 fine_integration_time_min; - u32 fine_integration_time_max_margin; - u32 frame_length_lines; - u32 line_length_pck; - u32 vt_pix_clk_freq_hz; - u32 sensor_output_width; - u32 sensor_output_height; - u32 crop_horizontal_start; - u32 crop_vertical_start; - u32 crop_horizontal_end; - u32 crop_vertical_end; - u8 binning_factor_x; - u8 binning_factor_y; - u32 exp_time; - u32 gain; -}; - -struct imx_camera_module_config { - const char *name; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - bool auto_exp_enabled; - bool auto_gain_enabled; - bool auto_wb_enabled; - struct imx_camera_module_reg *reg_table; - u32 reg_table_num_entries; - u32 reg_diff_table_num_entries; - u32 v_blanking_time_us; - u32 line_length_pck; - u32 frame_length_lines; - struct imx_camera_module_timings timings; - bool soft_reset; - bool ignore_measurement_check; - u8 max_exp_gain_h; - u8 max_exp_gain_l; - struct pltfrm_cam_itf itf_cfg; -}; - -struct imx_camera_module_exp_config { - u32 exp_time; - bool auto_exp; - u16 gain; - u16 gain_percent; - bool auto_gain; - enum v4l2_flash_led_mode flash_mode; - u32 vts_value; -}; - -struct imx_camera_module_wb_config { - u32 temperature; - u32 preset_id; - bool auto_wb; -}; - -struct imx_camera_module_af_config { - u32 abs_pos; - u32 rel_pos; -}; - -struct imx_camera_module_ext_ctrl { - /* public */ - u32 id; - u32 value; - __u32 reserved2[1]; -}; - -struct imx_camera_module_ext_ctrls { - /* public */ - u32 count; - struct imx_camera_module_ext_ctrl *ctrls; -}; - -/* - * start_streaming: (mandatory) will be called when sensor should be - * put into streaming mode right after the base config has been - * written to the sensor. After a successful call of this function - * the sensor should start delivering frame data. - * - * stop_streaming: (mandatory) will be called when sensor should stop - * delivering data. After a successful call of this function the - * sensor should not deliver any more frame data. - * - * check_camera_id: (optional) will be called when the sensor is - * powered on. If provided should check the sensor ID/version - * required by the custom driver. Register access should be - * possible when this function is invoked. - * - * s_ctrl: (mandatory) will be called at the successful end of - * imx_camera_module_s_ctrl with the ctrl_id as argument. - * - * priv: (optional) for private data used by the custom driver. - */ -struct imx_camera_module_custom_config { - int (*start_streaming)(struct imx_camera_module *cam_mod); - int (*stop_streaming)(struct imx_camera_module *cam_mod); - int (*check_camera_id)(struct imx_camera_module *cam_mod); - int (*s_ctrl)(struct imx_camera_module *cam_mod, u32 ctrl_id); - int (*g_ctrl)(struct imx_camera_module *cam_mod, u32 ctrl_id); - int (*g_timings)(struct imx_camera_module *cam_mod, - struct imx_camera_module_timings *timings); - int (*s_vts)(struct imx_camera_module *cam_mod, - u32 vts); - int (*s_ext_ctrls)(struct imx_camera_module *cam_mod, - struct imx_camera_module_ext_ctrls *ctrls); - int (*set_flip)(struct imx_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len); - int (*init_common)(struct imx_camera_module *cam_mod); - struct imx_camera_module_config *configs; - u32 num_configs; - u32 power_up_delays_ms[3]; - unsigned short exposure_valid_frame[2]; - void *priv; -}; - -struct imx_camera_module_otp_work { - struct work_struct work; - struct workqueue_struct *wq; - void *cam_mod; -}; - -struct imx_camera_module { - /* public */ - struct v4l2_subdev sd; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - struct imx_camera_module_exp_config exp_config; - struct imx_camera_module_wb_config wb_config; - struct imx_camera_module_af_config af_config; - struct imx_camera_module_custom_config custom; - enum imx_camera_module_state state; - enum imx_camera_module_state state_before_suspend; - struct imx_camera_module_config *active_config; - struct imx_camera_module_otp_work otp_work; - u32 ctrl_updt; - u32 vts_cur; - u32 vts_min; - bool auto_adjust_fps; - bool update_config; - bool frm_fmt_valid; - bool frm_intrvl_valid; - bool hflip; - bool vflip; - bool flip_flg; - u32 rotation; - void *pltfm_data; - bool inited; - struct mutex lock; -}; - -#define imx_camera_module_pr_info(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_info(&cam_mod->sd, fmt, ## arg) -#define imx_camera_module_pr_debug(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_debug(&cam_mod->sd, fmt, ## arg) -#define imx_camera_module_pr_warn(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_warn(&cam_mod->sd, fmt, ## arg) -#define imx_camera_module_pr_err(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_err(&cam_mod->sd, fmt, ## arg) - -int imx_camera_module_write_reglist( - struct imx_camera_module *cam_mod, - const struct imx_camera_module_reg reglist[], - int len); - -int imx_camera_module_write_reg( - struct imx_camera_module *cam_mod, - u16 reg, - u8 val); - -int imx_camera_module_read_reg( - struct imx_camera_module *cam_mod, - u16 data_length, - u16 reg, - u32 *val); - -int imx_camera_module_read_reg_table( - struct imx_camera_module *cam_mod, - u16 reg, - u32 *val); - -int imx_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int imx_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int imx_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int imx_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int imx_camera_module_s_stream( - struct v4l2_subdev *sd, - int enable); - -int imx_camera_module_s_power( - struct v4l2_subdev *sd, - int on); - -int imx_camera_module_g_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int imx_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int imx_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls); - -int imx_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie); - -int imx_camera_module_init( - struct imx_camera_module *cam_mod, - struct imx_camera_module_custom_config *custom); - -void imx_camera_module_release( - struct imx_camera_module *cam_mod); - -long imx_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg); - -int imx_camera_module_get_flip_mirror( - struct imx_camera_module *cam_mod); -#endif diff --git a/drivers/media/i2c/soc_camera/rockchip/nt99230_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/nt99230_v4l2-i2c-subdev.c deleted file mode 100644 index cb88fb06c6f5..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/nt99230_v4l2-i2c-subdev.c +++ /dev/null @@ -1,1089 +0,0 @@ -/* - * NT99230_0 sensor driver - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - * Note: - * 09/25/2014: new implementation using v4l2-subdev - * instead of v4l2-int-device. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" - -#define NT_DRIVER_NAME "nt99230" - -#define NT99230_AEC_GAIN_REG 0x32CF -#define NT99230_AEC_EXPO_2ND_REG 0x3012 /* Exposure Bits 8-15 */ -#define NT99230_AEC_EXPO_1ST_REG 0x3013 /* Exposure Bits 0-7 */ -#define NT99230_AEC_UPDATE_ADDRESS 0x3060 -#define NT99230_AEC_UPDATE_DATA 0x02 - -#define NT99230_FETCH_2ND_BYTE_EXP(VAL) ((VAL >> 8) & 0xFF) /* 8 Bits */ -#define NT99230_FETCH_1ST_BYTE_EXP(VAL) ((VAL & 0xFF)) /* 8 Bits */ - -#define NT99230_PIDH_ADDR 0x3000 -#define NT99230_PIDL_ADDR 0x3001 -#define NT99230_PIDH_MAGIC 0x23 /* High byte of product ID */ -#define NT99230_PIDL_MAGIC 0x00 /* Low byte of product ID */ - -#define NT99230_EXT_CLK 24000000 -#define NT99230_PCLK 90000000 - -#define NT99230_LINE_LENGTH_VALUE_HIGH 0x09 -#define NT99230_LINE_LENGTH_VALUE_LOW 0x6C -#define NT99230_FRAME_LENGTH_VALUE_HIGH 0x04 -#define NT99230_FRAME_LENGTH_VALUE_LOW 0xDB -#define NT99230_LINE_LENGTH_REG_HIGH 0x300A -#define NT99230_LINE_LENGTH_REG_LOW 0x300B -#define NT99230_FRAME_LENGTH_REG_HIGH 0x300C -#define NT99230_FRAME_LENGTH_REG_LOW 0x300D - -#define NT99230_HORIZONTAL_START_HIGH_REG 0x3002 -#define NT99230_HORIZONTAL_START_LOW_REG 0x3003 -#define NT99230_VERTICAL_START_HIGH_REG 0x3004 -#define NT99230_VERTICAL_START_LOW_REG 0x3005 -#define NT99230_HORIZONTAL_END_HIGH_REG 0x3006 -#define NT99230_HORIZONTAL_END_LOW_REG 0x3007 -#define NT99230_VERTICAL_END_HIGH_REG 0x3008 -#define NT99230_VERTICAL_END_LOW_REG 0x3009 -#define NT99230_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x300E -#define NT99230_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x300F -#define NT99230_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x3010 -#define NT99230_VERTICAL_OUTPUT_SIZE_LOW_REG 0x3011 -#define NT99230_H_WIN_OFF_HIGH_REG 0x300E -#define NT99230_H_WIN_OFF_LOW_REG 0x300F -#define NT99230_V_WIN_OFF_HIGH_REG 0x3010 -#define NT99230_V_WIN_OFF_LOW_REG 0x3011 -#define NT99230_COARSE_INTG_TIME_MIN 16 -#define NT99230_COARSE_INTG_TIME_MAX_MARGIN 4 - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ -/* MCLK:24MHz 1920x1080 30fps mipi 2lane 640Mbps/lane */ -static const struct ov_camera_module_reg NT99230_init_tab_1920_1080_30fps_yuyv[] = { -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3069, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x306A, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3100, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3101, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3102, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3103, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3104, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3105, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3107, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3108, 0x50}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3109, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310A, 0x75}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310B, 0xC0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310C, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310D, 0x43}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310E, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3110, 0x88}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3111, 0xCE}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3112, 0x88}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3113, 0x66}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3114, 0x33}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3115, 0x88}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3116, 0x86}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3118, 0xAF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3119, 0xAF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x311A, 0xAF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x303F, 0x32}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3055, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3051, 0x3B}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3053, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3056, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308A, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308B, 0x2F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308C, 0x28}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308D, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308E, 0x37}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308F, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x30A0, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x30A4, 0x1F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350B, 0xFF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3514, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3515, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3518, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3519, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351A, 0xFF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3530, 0x50}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3534, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3512, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3511, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3513, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3532, 0x35}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3533, 0x20}, - -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F14, 0xFF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F03, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F04, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F05, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F06, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F07, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F09, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F0A, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F0B, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F0C, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F0D, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F0E, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F0F, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F10, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F11, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F12, 0x20}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F13, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3F00, 0x20}, - -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3210, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3211, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3212, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3213, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3214, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3215, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3216, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3217, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3218, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3219, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x321A, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x321B, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x321C, 0x0F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x321D, 0x0F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x321E, 0x0F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x321F, 0x0F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3230, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3231, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3232, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3233, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3234, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3235, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3236, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3237, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3238, 0x18}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3239, 0x18}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x323A, 0x28}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3243, 0xC3}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3244, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3245, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3241, 0x45}, - -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3270, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3271, 0x0B}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3272, 0x16}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3273, 0x2B}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3274, 0x3F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3275, 0x51}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3276, 0x72}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3277, 0x8F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3278, 0xA7}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3279, 0xBC}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x327A, 0xDC}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x327B, 0xF0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x327C, 0xFA}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x327D, 0xFE}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x327E, 0xFF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3700, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3701, 0x0F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x1A}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x32}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x42}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x51}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x6B}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x81}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x94}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0xA6}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370A, 0xC2}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370B, 0xD4}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370C, 0xE0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370D, 0xE7}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370E, 0xEF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3710, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3714, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3302, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3303, 0x4F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3304, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3305, 0xA1}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3306, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3307, 0x0F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3308, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3309, 0xCD}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330A, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330B, 0xCD}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330C, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330D, 0x67}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330E, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330F, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3310, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3311, 0xEA}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3312, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3313, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3250, 0x37}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3251, 0x1F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3252, 0x39}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3253, 0x21}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3254, 0x3B}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3255, 0x23}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3256, 0x29}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3257, 0x16}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3258, 0x4F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3259, 0x35}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x325A, 0x29}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x325B, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x325C, 0x70}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x325D, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3290, 0x50}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3292, 0x50}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3297, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32B8, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32B9, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32B0, 0x57}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32B1, 0xAC}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32B2, 0x11}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32B3, 0xA0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32B4, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32BC, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32BD, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32BE, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32CB, 0x18}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32CC, 0x70}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32CD, 0xA0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3326, 0x12}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3327, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3332, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x334A, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x334B, 0x7F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x334C, 0x1F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x335B, 0xD0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3360, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3361, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3362, 0x2F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3365, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3366, 0x0C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3367, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3368, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3369, 0x38}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x336B, 0x28}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x336D, 0x20}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x336E, 0x16}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3370, 0x0A}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3371, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3372, 0x1C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3374, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3375, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3376, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3378, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3379, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x337A, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x337C, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A0, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A1, 0x7A}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A2, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A3, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A4, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A5, 0x8C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A6, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A7, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A9, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33AA, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33AC, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33AD, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33AE, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33B0, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33B1, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33B4, 0x48}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33B5, 0xA4}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33BA, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33BB, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33C0, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33C6, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33C7, 0x43}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33C8, 0x33}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33C9, 0x0A}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3363, 0x31}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3364, 0x0B}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x333F, 0x0F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3012, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3290, 0x82}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3292, 0x7A}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x307D, 0x02}, -/* - * MCLK: 24.00MHz - * Pixel Clk: 80.00MHz - * Data Rate: 640.00bps - * Size: 1920x1080 - * FPS: 25.00~30.00 - * Line: 2412 - * Frame: 1105 - * Flicker: 50Hz -*/ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32BB, 0x67}, /* AE Start */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32BF, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C0, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C1, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C2, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C3, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C4, 0x2F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C5, 0x2F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C6, 0x2F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D3, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D4, 0x4C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D5, 0x84}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D6, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D7, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D8, 0x81}, /* AE End */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32F0, 0x01}, /* Output Format */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3200, 0x7E}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3201, 0x3F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302A, 0x80}, /* PLL Start */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302B, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302C, 0x4F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302D, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302E, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302F, 0x07}, /* PLL End */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3022, 0x24}, /* Timing Start */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3023, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3002, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3003, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3004, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3005, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3006, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3007, 0x87}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3008, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3009, 0x39}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300A, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300B, 0x6C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300C, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300D, 0x51}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300E, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300F, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3010, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x38}, /* Timing End */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x01}, /* MIPI Start */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x7C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0xE4}, /* MIPI End */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x320A, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3021, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3060, 0x01}, -}; - -#ifdef RAW_RGB -static const struct ov_camera_module_reg NT99230_init_tab_1920_1080_30fps_raw[] = { -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3069, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x306A, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3100, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3101, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3102, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3103, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3104, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3105, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3107, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3108, 0x50}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3109, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310A, 0x75}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310B, 0xC0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310C, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310D, 0x43}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x310E, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3110, 0x88}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3111, 0xCE}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3112, 0x88}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3113, 0x66}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3114, 0x33}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3115, 0x88}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3116, 0x86}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3118, 0xAF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3119, 0xAF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x311A, 0xAF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301E, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x303F, 0x32}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3052, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3055, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3056, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x30A0, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x30A4, 0x1F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308B, 0x5F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308C, 0x3F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308D, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x308F, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3262, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x333F, 0x0F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x334B, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3360, 0x20}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3361, 0x28}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3362, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3363, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3364, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x336D, 0x20}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x336E, 0x16}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3370, 0x0B}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3371, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3372, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3374, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3379, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x337A, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x337C, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33A9, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33AA, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33AC, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33AD, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33AE, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x33B0, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350B, 0xFF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3514, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3515, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3518, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3519, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351A, 0xFF}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3530, 0x50}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3534, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3512, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3511, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3513, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3532, 0x35}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3533, 0x20}, -/* - * MCLK: 24.00MHz - * Pixel Clk: 90.00MHz - * Data Rate: 450.00bps - * Size: 1920x1080 - * FPS: 30.00~30.02 - * Line: 2412 - * Frame: 1243 - * Flicker: 50Hz -*/ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32BB, 0x67}, /* AE Start */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32BF, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C0, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C1, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C2, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C3, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C4, 0x2F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C5, 0x2F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32C6, 0x2F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D3, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D4, 0x4C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D5, 0x84}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D6, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D7, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32D8, 0x81}, /* AE End */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x32F0, 0x90}, /* Output Format */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3200, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3201, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302A, 0x80}, /* PLL Start */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302B, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302C, 0x4A}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302D, 0x0C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302E, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302F, 0x04}, /* PLL End */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3022, 0x24}, /* Timing Start */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3023, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3002, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3003, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3004, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3005, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3006, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3007, 0x87}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3008, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3009, 0x39}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300A, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300B, 0x6C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300C, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300D, 0xDB}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300E, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300F, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3010, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x38}, /* Timing End */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3012, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0x5F}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x02}, /* MIPI Start */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x1C}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0xE4}, /* MIPI End */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x320A, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3021, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3060, 0x01}, -}; -#endif - -/* ======================================================================== */ -static struct ov_camera_module_config NT99230_configs[] = { - { - .name = "1920x1080_30fps_YUYV", - .frm_fmt = { - .width = 1920, - .height = 1080, - .code = MEDIA_BUS_FMT_YUYV8_2X8 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)NT99230_init_tab_1920_1080_30fps_yuyv, - .reg_table_num_entries = - sizeof(NT99230_init_tab_1920_1080_30fps_yuyv) / - sizeof(NT99230_init_tab_1920_1080_30fps_yuyv[0]), - .v_blanking_time_us = 4052, - .ignore_measurement_check = 1, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 675, 24000000) - } -#ifdef RAW_RGB - { - .name = "1920x1080_30fps_RG10", - .frm_fmt = { - .width = 1920, - .height = 1080, - .code = MEDIA_BUS_FMT_SRGGB10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)NT99230_init_tab_1920_1080_30fps_raw, - .reg_table_num_entries = - sizeof(NT99230_init_tab_1920_1080_30fps_raw) / - sizeof(NT99230_init_tab_1920_1080_30fps_raw[0]), - .v_blanking_time_us = 4052, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - .ignore_measurement_check = 1, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 450, 24000000) - } -#endif -}; - -/*--------------------------------------------------------------------------*/ -static int NT99230_g_VTS(struct ov_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = ov_camera_module_read_reg_table(cam_mod, NT99230_FRAME_LENGTH_REG_HIGH, &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_read_reg_table(cam_mod, NT99230_FRAME_LENGTH_REG_LOW, &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int NT99230_auto_adjust_fps(struct ov_camera_module *cam_mod, u32 exp_time) -{ - int ret; - - ret = 0; - - return ret; -} - -/**************************************************/ -/* calcul_agc_ratio: 100 = 1x, 150 = 1.5x, 200 = 2x, etc...*/ -/**************************************************/ -#define AGC_ISO_MIN 0 -#define AGC_GAP 16 -#define GAIN_STEP 625 - -static u32 gain_transfer(u32 a_gain) -{ - u32 gain_factor, calcul_agc_ratio, shf; - - calcul_agc_ratio = a_gain * 100; - shf = 0; - - while (calcul_agc_ratio / ((1 << (shf + 1)) * 100)) - shf++; - - gain_factor = ((calcul_agc_ratio - ((1 << shf) * 100)) * 100) / - (GAIN_STEP << shf) + AGC_ISO_MIN + AGC_GAP * shf; - - return gain_factor; -} - -static int NT99230_write_aec(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "exp_time = %d lines, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - if the sensor is already streaming, write to shadow registers, - if the sensor is in SW standby, write to active registers, - if the sensor is off/registers are not writeable, do nothing - */ - if (cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY || cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time = cam_mod->exp_config.exp_time; - - mutex_lock(&cam_mod->lock); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = NT99230_auto_adjust_fps(cam_mod, cam_mod->exp_config.exp_time); - - ret |= ov_camera_module_write_reg(cam_mod, NT99230_AEC_GAIN_REG, gain_transfer(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, NT99230_AEC_EXPO_2ND_REG, NT99230_FETCH_2ND_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, NT99230_AEC_EXPO_1ST_REG, NT99230_FETCH_1ST_BYTE_EXP(exp_time)); - - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - ret = ov_camera_module_write_reg(cam_mod, NT99230_AEC_UPDATE_ADDRESS, NT99230_AEC_UPDATE_DATA); - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - - return ret; -} - -static int NT99230_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, "failed with error (%d)\n", ret); - - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int NT99230_g_timings(struct ov_camera_module *cam_mod, struct ov_camera_module_timings *timings) -{ - int ret = 0; - u32 reg_val; - u32 win_off; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - timings->frame_length_lines = (NT99230_FRAME_LENGTH_VALUE_HIGH << 8) + NT99230_FRAME_LENGTH_VALUE_LOW; - - timings->line_length_pck |= (NT99230_LINE_LENGTH_VALUE_HIGH << 8) + NT99230_LINE_LENGTH_VALUE_LOW; - - /* Novatek Sensor do not use coarse integration time. */ - timings->coarse_integration_time_min = NT99230_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = NT99230_COARSE_INTG_TIME_MAX_MARGIN; - - /* Novatek Sensor do not use fine integration time. */ - timings->fine_integration_time_min = 0; - timings->fine_integration_time_max_margin = 0; - - timings->binning_factor_x = 0; - timings->binning_factor_y = 0; - - /* Get the cropping and output resolution to ISP for this mode. */ - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_HORIZONTAL_START_HIGH_REG, ®_val))) - goto err; - - timings->crop_horizontal_start = reg_val << 8; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_HORIZONTAL_START_LOW_REG, ®_val))) - goto err; - - timings->crop_horizontal_start |= reg_val; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_VERTICAL_START_HIGH_REG, ®_val))) - goto err; - - timings->crop_vertical_start = reg_val << 8; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_VERTICAL_START_LOW_REG, ®_val))) - goto err; - - timings->crop_vertical_start |= reg_val; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_HORIZONTAL_END_HIGH_REG, ®_val))) - goto err; - - timings->crop_horizontal_end = reg_val << 8; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_HORIZONTAL_END_LOW_REG, ®_val))) - goto err; - - timings->crop_horizontal_end |= reg_val; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_VERTICAL_END_HIGH_REG, ®_val))) - goto err; - - timings->crop_vertical_end = reg_val << 8; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_VERTICAL_END_LOW_REG, ®_val))) - goto err; - - timings->crop_vertical_end |= reg_val; - - /* - The sensor can do windowing within the cropped array. - Take this into the cropping size reported. - */ - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_H_WIN_OFF_HIGH_REG, ®_val))) - goto err; - - win_off = (reg_val & 0xF) << 8; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_H_WIN_OFF_LOW_REG, ®_val))) - goto err; - - win_off |= (reg_val & 0xFF); - - timings->crop_horizontal_start += win_off; - timings->crop_horizontal_end -= win_off; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_V_WIN_OFF_HIGH_REG, ®_val))) - goto err; - - win_off = (reg_val & 0xF) << 8; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_V_WIN_OFF_LOW_REG, ®_val))) - goto err; - - win_off |= (reg_val & 0xFF); - - timings->crop_vertical_start += win_off; - timings->crop_vertical_end -= win_off; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_HORIZONTAL_OUTPUT_SIZE_HIGH_REG, ®_val))) - goto err; - - timings->sensor_output_width = reg_val << 8; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_HORIZONTAL_OUTPUT_SIZE_LOW_REG, ®_val))) - goto err; - - timings->sensor_output_width |= reg_val; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_VERTICAL_OUTPUT_SIZE_HIGH_REG, ®_val))) - goto err; - - timings->sensor_output_height = reg_val << 8; - - if (IS_ERR_VALUE(ov_camera_module_read_reg_table(cam_mod, NT99230_VERTICAL_OUTPUT_SIZE_LOW_REG, ®_val))) - goto err; - - timings->sensor_output_height |= reg_val; - - timings->vt_pix_clk_freq_hz = cam_mod->frm_intrvl.interval.denominator - * timings->frame_length_lines - * timings->line_length_pck; - - ov_camera_module_pr_debug(cam_mod, - "vt_pix_clk_freq_hz: %d, frame_length_lines: 0x%x, line_length_pck: 0x%x\n", - timings->vt_pix_clk_freq_hz, timings->frame_length_lines, - timings->line_length_pck); - - return ret; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int NT99230_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = NT99230_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - case V4L2_CID_FOCUS_ABSOLUTE: - /* todo*/ - break; - /* - * case RK_V4L2_CID_FPS_CTRL: - * if (cam_mod->auto_adjust_fps) { - * ret = NT99230_auto_adjust_fps(cam_mod, cam_mod->exp_config.exp_time); - * } - * break; - */ - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int NT99230_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = NT99230_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, "failed with error (%d)\n", ret); - - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int NT99230_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_info(cam_mod, "active config = %s\n", cam_mod->active_config->name); - - ret = NT99230_g_VTS(cam_mod, &cam_mod->vts_min); - - if (IS_ERR_VALUE(ret)) - goto err; - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x3021, 0x02); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int NT99230_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_info(cam_mod, "\n"); - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x3021, 0x00);; - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int NT99230_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret |= ov_camera_module_read_reg(cam_mod, 1, NT99230_PIDH_ADDR, &pidh); - ret |= ov_camera_module_read_reg(cam_mod, 1, NT99230_PIDL_ADDR, &pidl); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off, while(1)\n"); - goto err; - } - - if (pidh == NT99230_PIDH_MAGIC && pidl == NT99230_PIDL_MAGIC) { - ov_camera_module_pr_info(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - } else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - NT99230_PIDH_MAGIC, NT99230_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops NT99230_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops NT99230_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .g_frame_interval = ov_camera_module_g_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops NT99230_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops NT99230_camera_module_ops = { - .core = &NT99230_camera_module_core_ops, - .video = &NT99230_camera_module_video_ops, - .pad = &NT99230_camera_module_pad_ops -}; - -static int num_cameras; - -static struct ov_camera_module_custom_config NT99230_custom_config = { - .start_streaming = NT99230_start_streaming, - .stop_streaming = NT99230_stop_streaming, - .s_ctrl = NT99230_s_ctrl, - .g_ctrl = NT99230_g_ctrl, - .s_ext_ctrls = NT99230_s_ext_ctrls, - .g_timings = NT99230_g_timings, - .check_camera_id = NT99230_check_camera_id, - .configs = NT99230_configs, - .num_configs = sizeof(NT99230_configs) / sizeof(NT99230_configs[0]), - .power_up_delays_ms = {5, 30, 0}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static int NT99230_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct ov_camera_module *tmp_NT99230 = NULL; - - dev_info(&client->dev, "probing...\n"); - - tmp_NT99230 = devm_kzalloc(&client->dev, sizeof(*tmp_NT99230), GFP_KERNEL); - dev_info(&client->dev, "tmp_NT99230 = %p\n", tmp_NT99230); - if (!tmp_NT99230) { - dev_info(&client->dev, "devm_kzalloc ov_camera_module buffer error!\n"); - return -1; - } - - v4l2_i2c_subdev_init(&tmp_NT99230->sd, client, &NT99230_camera_module_ops); - - tmp_NT99230->custom = NT99230_custom_config; - num_cameras++; - mutex_init(&tmp_NT99230->lock); - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -/* ======================================================================== */ - -static int NT99230_remove( - struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - mutex_destroy(&cam_mod->lock); - ov_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id NT99230_id[] = { - { NT_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id NT99230_of_match[] = { - {.compatible = "novatek," NT_DRIVER_NAME "-v4l2-i2c-subdev",}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, NT99230_id); - -static struct i2c_driver NT99230_i2c_driver = { - .driver = { - .name = NT_DRIVER_NAME, - .owner = THIS_MODULE, - .of_match_table = NT99230_of_match - }, - .probe = NT99230_probe, - .remove = NT99230_remove, - .id_table = NT99230_id, -}; - -module_i2c_driver(NT99230_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for NT99230_0"); -MODULE_AUTHOR("Eike Grimpe"); -MODULE_LICENSE("GPL"); - diff --git a/drivers/media/i2c/soc_camera/rockchip/ov13850_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/ov13850_v4l2-i2c-subdev.c deleted file mode 100644 index eae694b7c93f..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov13850_v4l2-i2c-subdev.c +++ /dev/null @@ -1,1998 +0,0 @@ -/* - * ov13850 sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" - -#define ov13850_DRIVER_NAME "ov13850" - -/* Bit 2-0 gain 10 -8 */ -#define ov13850_AEC_PK_LONG_GAIN_HIGH_REG 0x350A -/* Bits 7 -0 gain 7-0 */ -#define ov13850_AEC_PK_LONG_GAIN_LOW_REG 0x350B -#define ov13850_FETCH_LSB_GAIN(VAL) ((VAL) & 0x00ff) -#define ov13850_FETCH_MSB_GAIN(VAL) (((VAL) >> 8) & 0xff) - -/* Exposure Bits 16-19 */ -#define ov13850_AEC_PK_LONG_EXPO_3RD_REG 0x3500 -/* Exposure Bits 8-15 */ -#define ov13850_AEC_PK_LONG_EXPO_2ND_REG 0x3501 -/* Exposure Bits 0-7 */ -#define ov13850_AEC_PK_LONG_EXPO_1ST_REG 0x3502 -/* 4 Bits */ -#define ov13850_FETCH_3RD_BYTE_EXP(VAL) (((VAL) >> 12) & 0xF) -/* 8 Bits */ -#define ov13850_FETCH_2ND_BYTE_EXP(VAL) (((VAL) >> 4) & 0xFF) -/* 4 Bits */ -#define ov13850_FETCH_1ST_BYTE_EXP(VAL) (((VAL) & 0x0F) << 4) - -#define ov13850_AEC_GROUP_UPDATE_ADDRESS 0x3208 -#define ov13850_AEC_GROUP_UPDATE_START_DATA 0x00 -#define ov13850_AEC_GROUP_UPDATE_END_DATA 0x10 -#define ov13850_AEC_GROUP_UPDATE_END_LAUNCH 0xA0 - -#define ov13850_PIDH_ADDR 0x300A -#define ov13850_PIDL_ADDR 0x300B - -#define ov13850_PIDH_MAGIC 0xD8 -#define ov13850_PIDL_MAGIC 0x50 - -#define ov13850_TIMING_VTS_HIGH_REG 0x380e -#define ov13850_TIMING_VTS_LOW_REG 0x380f -#define ov13850_TIMING_HTS_HIGH_REG 0x380c -#define ov13850_TIMING_HTS_LOW_REG 0x380d -#define ov13850_INTEGRATION_TIME_MARGIN 8 -#define ov13850_FINE_INTG_TIME_MIN 0 -#define ov13850_FINE_INTG_TIME_MAX_MARGIN 0 -#define ov13850_COARSE_INTG_TIME_MIN 16 -#define ov13850_COARSE_INTG_TIME_MAX_MARGIN 4 -#define ov13850_TIMING_X_INC 0x3814 -#define ov13850_TIMING_Y_INC 0x3815 -#define ov13850_HORIZONTAL_START_HIGH_REG 0x3800 -#define ov13850_HORIZONTAL_START_LOW_REG 0x3801 -#define ov13850_VERTICAL_START_HIGH_REG 0x3802 -#define ov13850_VERTICAL_START_LOW_REG 0x3803 -#define ov13850_HORIZONTAL_END_HIGH_REG 0x3804 -#define ov13850_HORIZONTAL_END_LOW_REG 0x3805 -#define ov13850_VERTICAL_END_HIGH_REG 0x3806 -#define ov13850_VERTICAL_END_LOW_REG 0x3807 -#define ov13850_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3808 -#define ov13850_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3809 -#define ov13850_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x380a -#define ov13850_VERTICAL_OUTPUT_SIZE_LOW_REG 0x380b -#define ov13850_FLIP_REG 0x3820 -#define ov13850_MIRROR_REG 0x3821 - -#define ov13850_EXT_CLK 24000000 - -#define ov13850_FULL_SIZE_RESOLUTION_WIDTH 4224 -#define ov13850_BINING_SIZE_RESOLUTION_WIDTH 2112 - -//#define OV13850_ONE_LANE - -//#define OV13850_COLORBAR_TEST - -static struct ov_camera_module ov13850; -static struct ov_camera_module_custom_config ov13850_custom_config; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ - -#ifndef OV13850_ONE_LANE -#ifdef OV13850_SENSOR_R1A -/* MCLK:24MHz 4224x3136 7fps mipi 2lane 600 Mbps/ 2lane */ -static struct ov_camera_module_reg -ov13850_init_tab_4224_3136_7fps_twolane_r1a[] = { -/* global setting */ - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0300, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3010, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x76}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3012, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3014, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3015, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301f, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3210, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3506, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3507, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350b, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350f, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0x48}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0xa5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0x9f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3607, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360a, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360b, 0x91}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360c, 0x49}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0x8a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3615, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3641, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3660, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3668, 0x54}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3669, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3667, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x50}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x1f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3720, 0x66}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3722, 0x84}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3728, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3710, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3716, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3718, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3719, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371c, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3760, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3761, 0x34}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3767, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3769, 0x45}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376c, 0x23}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d84, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x17}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8c, 0x73}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8d, 0xbf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x97}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x4b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3834, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3835, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400b, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4011, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0xE4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0x5F}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4028, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4029, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402c, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403d, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403f, 0x7f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4501, 0x38}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4602, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x1b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d00, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d01, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d02, 0xd1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d03, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d04, 0x66}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d05, 0x65}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5002, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5013, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501d, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5242, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5243, 0xb8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5244, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5245, 0xf9}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5246, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5247, 0xf6}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5248, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5249, 0xa6}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5300, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5301, 0xdf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5302, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5303, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5304, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5305, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5306, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5307, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5308, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5309, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530a, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530b, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530c, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530d, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530e, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530f, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5310, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5400, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5401, 0x61}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5402, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5403, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5404, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5405, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x540c, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b01, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b02, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b03, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b04, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b05, 0x6c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b09, 0x02}, -#ifndef OV13850_COLORBAR_TEST - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, -#else - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x80}, -#endif - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e10, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x2f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x0C}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x93}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x4B}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x87}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0x4C}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x0E}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0x37}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x0F}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x1C}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x0F}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x1F}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5401, 0x71}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5405, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4800, 0x24} -}; - -/* MCLK:24MHz 2112x1568 30fps mipi 2lane Mbps/lane */ -static struct ov_camera_module_reg -ov13850_regs_2112_1568_30fps_twolane_r1a[] = { - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0103, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0300, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3010, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x76}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3012, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3014, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3015, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301f, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3210, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3506, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3507, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350b, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350f, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0x48}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0xa5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0x9f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3607, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360a, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360b, 0x91}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360c, 0x49}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0x8a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3615, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3641, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3660, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3668, 0x54}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3669, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3667, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x50}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x1f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3720, 0x66}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3722, 0x84}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3728, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3710, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3716, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3718, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3719, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371c, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3760, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3761, 0x34}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3767, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3769, 0x45}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376c, 0x23}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d84, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x17}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8c, 0x73}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8d, 0xbf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x97}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x4b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3834, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3835, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400b, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4011, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0xE4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0x5F}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4028, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4029, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402c, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403d, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403f, 0x7f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4501, 0x38}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4602, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x1b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d00, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d01, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d02, 0xd1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d03, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d04, 0x66}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d05, 0x65}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5002, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5013, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501d, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5242, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5243, 0xb8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5244, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5245, 0xf9}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5246, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5247, 0xf6}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5248, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5249, 0xa6}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5300, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5301, 0xdf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5302, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5303, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5304, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5305, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5306, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5307, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5308, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5309, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530a, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530b, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530c, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530d, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530e, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530f, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5310, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5400, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5401, 0x61}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5402, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5403, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5404, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5405, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x540c, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b01, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b02, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b03, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b04, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b05, 0x6c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b09, 0x02}, -#ifndef OV13850_COLORBAR_TEST - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, -#else - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x80}, -#endif - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e10, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x97}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x4b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0xE4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0x5F}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5401, 0x61}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5405, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4800, 0x24} -}; -#endif -static struct ov_camera_module_reg -ov13850_regs_2112_1568_30fps_twolane_r2a[] = { - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0300, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3010, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x76}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3012, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3014, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301f, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3210, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3506, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3507, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350b, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350f, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351b, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351d, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351f, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3520, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3521, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0x78}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0xb1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0xb5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3606, 0x73}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3607, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3609, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360a, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360b, 0x91}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360c, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3615, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3616, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3641, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3660, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3668, 0x54}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3669, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366a, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3667, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x15}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x1f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3720, 0x55}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3722, 0x84}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3728, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372b, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372e, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3730, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3731, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3732, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3733, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3710, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3716, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3718, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3719, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371a, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371c, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3748, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3760, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3761, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3762, 0x86}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3763, 0x16}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3767, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3769, 0x45}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376c, 0x23}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376f, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3773, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d84, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x17}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8c, 0x73}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8d, 0xbf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x97}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x4b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3823, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3826, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3827, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3834, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3835, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4006, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4007, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400b, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4011, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0xe4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0xd7}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0xbc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0xbf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4028, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4029, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402c, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403d, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403f, 0x7f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4041, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4501, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x458b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x459c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x459d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x459e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x83}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4602, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d00, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d01, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d02, 0xd1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d03, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d04, 0x66}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d05, 0x65}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d0b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5002, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5013, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501d, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x510f, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5110, 0xf0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5111, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x536d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x536e, 0x67}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x536f, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5370, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5400, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5400, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5401, 0x61}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5402, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5403, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5404, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5405, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x540c, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5501, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b01, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b02, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b03, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b04, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b05, 0x6c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b09, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e10, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x97}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x4b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0xE4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0x5F}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5401, 0x61}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5405, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x80}, -}; - -static struct ov_camera_module_reg -ov13850_regs_4224_3136_7fps_twolane_r2a[] = { - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0300, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3010, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x76}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3012, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3014, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301f, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3210, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3506, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3507, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350b, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350f, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351b, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351d, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351f, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3520, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3521, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0x78}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0xb1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0xb5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3606, 0x73}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3607, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3609, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360a, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360b, 0x91}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360c, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3615, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3616, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3641, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3660, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3668, 0x54}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3669, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366a, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3667, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x15}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x1f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3720, 0x55}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3722, 0x84}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3728, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372b, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372e, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3730, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3731, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3732, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3733, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3710, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3716, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3718, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3719, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371a, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371c, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3748, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3760, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3761, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3762, 0x86}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3763, 0x16}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3767, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3769, 0x45}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376c, 0x23}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376f, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3773, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d84, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x17}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8c, 0x73}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8d, 0xbf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x97}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x4b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3823, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3826, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3827, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3834, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3835, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4006, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4007, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400b, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4011, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0xe4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0xd7}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0xbc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0xbf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4028, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4029, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402c, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403d, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403f, 0x7f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4041, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4501, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x458b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x459c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x459d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x459e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x83}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4602, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d00, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d01, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d02, 0xd1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d03, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d04, 0x66}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d05, 0x65}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d0b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5002, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5013, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501d, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x510f, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5110, 0xf0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5111, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x536d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x536e, 0x67}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x536f, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5370, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5400, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5400, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5401, 0x61}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5402, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5403, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5404, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5405, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x540c, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5501, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b01, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b02, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b03, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b04, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b05, 0x6c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b09, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e10, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x97}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x4b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0xE4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0x5F}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5401, 0x61}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5405, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x00}, -}; - -#else -/* RES_2112x1568_15fps_digital_bin_1lane - * ;sclk=60Mhz, Mipiclk=640Mbps. - * ;HTS=0x11a0, VTS=0xd00. - */ -static struct ov_camera_module_reg ov13850_init_tab_2112_1568_15fps[] = { - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0103, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0300, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3010, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x76}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3012, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3014, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301f, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3210, 0x47}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3506, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3507, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350b, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350f, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351b, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351d, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351f, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3520, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3521, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0x78}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0xb1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0x95}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3606, 0x73}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3607, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3609, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360a, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360b, 0x91}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360C, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3615, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3616, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3641, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3660, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3668, 0x54}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3669, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366a, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3667, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x15}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x1f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3720, 0x55}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3722, 0x84}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3728, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372b, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372e, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3730, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3731, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3732, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3733, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3710, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3716, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3718, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3719, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371a, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371c, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3748, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3760, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3761, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3762, 0x86}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3763, 0x16}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3767, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3769, 0x45}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376c, 0x23}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376f, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3773, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d84, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x17}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8c, 0x73}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8d, 0xbf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x9f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x4b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3823, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3826, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3827, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3834, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3835, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400b, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4011, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0xe4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0xd7}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0xbc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0xbf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4028, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4029, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402c, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403d, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403f, 0x7F}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4041, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4501, 0x3c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x458b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x459c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x459d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x459e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x83}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4602, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d00, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d01, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d02, 0xd1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d03, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d04, 0x66}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d05, 0x65}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d0b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5002, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5003, 0x4f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5013, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501d, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5100, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5101, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5102, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5103, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5104, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5105, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5106, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5107, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5108, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5109, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x510f, 0xfc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5110, 0xf0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5111, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x536d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x536e, 0x67}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x536f, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5370, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5400, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5400, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5401, 0x61}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5402, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5403, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5404, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5405, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x540c, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5501, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b01, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b02, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b03, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b04, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b05, 0x6c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b09, 0x02}, -#ifndef OV13850_COLORBAR_TEST - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, -#else - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x80}, -#endif - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e10, 0x1c} -}; - -#endif - -#ifndef OV13850_ONE_LANE -static struct ov_camera_module_config ov13850_configs[] = { - { - .name = "2112x1568_30fps", - .frm_fmt = { - .width = 2112, - .height = 1568, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov13850_regs_2112_1568_30fps_twolane_r2a, - .reg_table_num_entries = - sizeof(ov13850_regs_2112_1568_30fps_twolane_r2a) / - sizeof(ov13850_regs_2112_1568_30fps_twolane_r2a[0]), - .v_blanking_time_us = 5000, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 600, ov13850_EXT_CLK) - }, - - { - .name = "4224x3136_7fps", - .frm_fmt = { - .width = 4224, - .height = 3136, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 7 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov13850_regs_4224_3136_7fps_twolane_r2a, - .reg_table_num_entries = - sizeof(ov13850_regs_4224_3136_7fps_twolane_r2a) / - sizeof(ov13850_regs_4224_3136_7fps_twolane_r2a[0]), - .v_blanking_time_us = 5000, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 600, ov13850_EXT_CLK) - } -}; -#else -static struct ov_camera_module_config ov13850_onelane_configs[] = { - { - .name = "2112x1568_15fps", - .frm_fmt = { - .width = 2112, - .height = 1568, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 15 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov13850_init_tab_2112_1568_15fps, - .reg_table_num_entries = - sizeof(ov13850_init_tab_2112_1568_15fps) / - sizeof(ov13850_init_tab_2112_1568_15fps[0]), - .v_blanking_time_us = 5000, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 1, 640, ov13850_EXT_CLK) - } -}; -#endif - -static int ov13850_g_VTS(struct ov_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = ov_camera_module_read_reg_table(cam_mod, - ov13850_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_read_reg_table(cam_mod, - ov13850_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -static int ov13850_auto_adjust_fps(struct ov_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - if ((exp_time + ov13850_COARSE_INTG_TIME_MAX_MARGIN) - > cam_mod->vts_min) - vts = exp_time + ov13850_COARSE_INTG_TIME_MAX_MARGIN; - else - vts = cam_mod->vts_min; - ret = ov_camera_module_write_reg(cam_mod, - ov13850_TIMING_VTS_LOW_REG, vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov13850_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, - "updated vts = %d,vts_min=%d\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int ov13850_set_vts(struct ov_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts < cam_mod->vts_min) - return ret; - - if (vts > 0xfff) - vts = 0xfff; - - ret = ov_camera_module_write_reg(cam_mod, - ov13850_TIMING_VTS_LOW_REG, vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov13850_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, "updated vts=%d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - return ret; -} - -static int ov13850_write_aec(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - //return ret; //xhh test - - ov_camera_module_pr_debug(cam_mod, - "exp_time = %d, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if (cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY || - cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time = cam_mod->exp_config.exp_time; - - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - - mutex_lock(&cam_mod->lock); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - ret = ov_camera_module_write_reg(cam_mod, - ov13850_AEC_GROUP_UPDATE_ADDRESS, - ov13850_AEC_GROUP_UPDATE_START_DATA); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = ov13850_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - ret |= ov_camera_module_write_reg(cam_mod, - ov13850_AEC_PK_LONG_GAIN_HIGH_REG, - ov13850_FETCH_MSB_GAIN(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, - ov13850_AEC_PK_LONG_GAIN_LOW_REG, - ov13850_FETCH_LSB_GAIN(a_gain)); - ret = ov_camera_module_write_reg(cam_mod, - ov13850_AEC_PK_LONG_EXPO_3RD_REG, - ov13850_FETCH_3RD_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov13850_AEC_PK_LONG_EXPO_2ND_REG, - ov13850_FETCH_2ND_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov13850_AEC_PK_LONG_EXPO_1ST_REG, - ov13850_FETCH_1ST_BYTE_EXP(exp_time)); - if (!cam_mod->auto_adjust_fps) - ret |= ov13850_set_vts(cam_mod, cam_mod->exp_config.vts_value); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - ret = ov_camera_module_write_reg(cam_mod, - ov13850_AEC_GROUP_UPDATE_ADDRESS, - ov13850_AEC_GROUP_UPDATE_END_DATA); - ret = ov_camera_module_write_reg(cam_mod, - ov13850_AEC_GROUP_UPDATE_ADDRESS, - ov13850_AEC_GROUP_UPDATE_END_LAUNCH); - } - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov13850_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov13850_filltimings(struct ov_camera_module_custom_config *custom) -{ - int i, j; - struct ov_camera_module_config *config; - struct ov_camera_module_timings *timings; - struct ov_camera_module_reg *reg_table; - int reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case ov13850_TIMING_VTS_HIGH_REG: - timings->frame_length_lines = - reg_table[j].val << 8; - break; - case ov13850_TIMING_VTS_LOW_REG: - timings->frame_length_lines |= reg_table[j].val; - break; - case ov13850_TIMING_HTS_HIGH_REG: - timings->line_length_pck = - (reg_table[j].val << 8); - break; - case ov13850_TIMING_HTS_LOW_REG: - timings->line_length_pck |= reg_table[j].val; - break; - case ov13850_TIMING_X_INC: - timings->binning_factor_x = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_x == 0) - timings->binning_factor_x = 1; - break; - case ov13850_TIMING_Y_INC: - timings->binning_factor_y = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_y == 0) - timings->binning_factor_y = 1; - break; - case ov13850_HORIZONTAL_START_HIGH_REG: - timings->crop_horizontal_start = - reg_table[j].val << 8; - break; - case ov13850_HORIZONTAL_START_LOW_REG: - timings->crop_horizontal_start |= - reg_table[j].val; - break; - case ov13850_VERTICAL_START_HIGH_REG: - timings->crop_vertical_start = - reg_table[j].val << 8; - break; - case ov13850_VERTICAL_START_LOW_REG: - timings->crop_vertical_start |= - reg_table[j].val; - break; - case ov13850_HORIZONTAL_END_HIGH_REG: - timings->crop_horizontal_end = - reg_table[j].val << 8; - break; - case ov13850_HORIZONTAL_END_LOW_REG: - timings->crop_horizontal_end |= - reg_table[j].val; - break; - case ov13850_VERTICAL_END_HIGH_REG: - timings->crop_vertical_end = - reg_table[j].val << 8; - break; - case ov13850_VERTICAL_END_LOW_REG: - timings->crop_vertical_end |= reg_table[j].val; - break; - case ov13850_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - reg_table[j].val << 8; - break; - case ov13850_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width |= - reg_table[j].val; - break; - case ov13850_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - reg_table[j].val << 8; - break; - case ov13850_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height |= - reg_table[j].val; - break; - } - } - - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator * - timings->frame_length_lines * - timings->line_length_pck; - - timings->coarse_integration_time_min = - ov13850_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - ov13850_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = ov13850_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - ov13850_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -static int ov13850_g_timings(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - - timings->frame_length_lines = vts; - return ret; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov13850_set_flip(struct ov_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - int i, mode = 0; - u16 match_reg[2]; - - mode = ov_camera_module_get_flip_mirror(cam_mod); - if (mode == -1) { - ov_camera_module_pr_info(cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - switch (cam_mod->active_config->frm_fmt.width) { - case ov13850_FULL_SIZE_RESOLUTION_WIDTH: - if (mode == OV_FLIP_BIT_MASK) { - match_reg[0] = 0x06; - match_reg[1] = 0x00; - } else if (mode == OV_MIRROR_BIT_MASK) { - match_reg[0] = 0x00; - match_reg[1] = 0x06; - } else if (mode == (OV_MIRROR_BIT_MASK | - OV_FLIP_BIT_MASK)) { - match_reg[0] = 0x06; - match_reg[1] = 0x06; - } else { - match_reg[0] = 0x00; - match_reg[1] = 0x00; - } - break; - case ov13850_BINING_SIZE_RESOLUTION_WIDTH: - if (mode == OV_FLIP_BIT_MASK) { - match_reg[0] = 0x16; - match_reg[1] = 0x01; - } else if (mode == OV_MIRROR_BIT_MASK) { - match_reg[0] = 0x16; - match_reg[1] = 0x07; - } else if (mode == (OV_MIRROR_BIT_MASK | - OV_FLIP_BIT_MASK)) { - match_reg[0] = 0x16; - match_reg[1] = 0x07; - } else { - match_reg[0] = 0x10; - match_reg[1] = 0x01; - } - break; - default: - return 0; - } - - for (i = len; i > 0; i--) { - if (reglist[i].reg == ov13850_FLIP_REG) - reglist[i].val = match_reg[0]; - else if (reglist[i].reg == ov13850_MIRROR_REG) - reglist[i].val = match_reg[1]; - } - } - - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int ov13850_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = ov13850_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d) 0x%x\n", ret, ctrl_id); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov13850_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - /* Handles only exposure and gain together special case. */ - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = ov13850_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov13850_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "active config=%s\n", cam_mod->active_config->name); - - ret = ov13850_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 1); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov13850_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 0); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int ov13850_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret |= ov_camera_module_read_reg(cam_mod, 1, ov13850_PIDH_ADDR, &pidh); - ret |= ov_camera_module_read_reg(cam_mod, 1, ov13850_PIDL_ADDR, &pidl); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if (pidh == ov13850_PIDH_MAGIC && pidl == ov13850_PIDL_MAGIC) { - ov_camera_module_pr_err(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - } else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - ov13850_PIDH_MAGIC, ov13850_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops ov13850_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops ov13850_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .g_frame_interval = ov_camera_module_g_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops ov13850_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops ov13850_camera_module_ops = { - .core = &ov13850_camera_module_core_ops, - .video = &ov13850_camera_module_video_ops, - .pad = &ov13850_camera_module_pad_ops -}; - -static struct ov_camera_module_custom_config ov13850_custom_config = { - .start_streaming = ov13850_start_streaming, - .stop_streaming = ov13850_stop_streaming, - .s_ctrl = ov13850_s_ctrl, - .s_ext_ctrls = ov13850_s_ext_ctrls, - .g_ctrl = ov13850_g_ctrl, - .g_timings = ov13850_g_timings, - .check_camera_id = ov13850_check_camera_id, - .s_vts = ov13850_auto_adjust_fps, - .set_flip = ov13850_set_flip, -#ifdef OV13850_ONE_LANE - .configs = ov13850_onelane_configs, - .num_configs = ARRAY_SIZE(ov13850_onelane_configs), - -#else - .configs = ov13850_configs, - .num_configs = ARRAY_SIZE(ov13850_configs), -#endif - .power_up_delays_ms = {5, 20, 0}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static int ov13850_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - ov13850_filltimings(&ov13850_custom_config); - v4l2_i2c_subdev_init(&ov13850.sd, client, &ov13850_camera_module_ops); - ov13850.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; - ov13850.custom = ov13850_custom_config; - - mutex_init(&ov13850.lock); - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -static int ov13850_remove(struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - mutex_destroy(&cam_mod->lock); - ov_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id ov13850_id[] = { - { ov13850_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id ov13850_of_match[] = { - {.compatible = "omnivision,ov13850-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, ov13850_id); - -static struct i2c_driver ov13850_i2c_driver = { - .driver = { - .name = ov13850_DRIVER_NAME, - .owner = THIS_MODULE, - .of_match_table = ov13850_of_match - }, - .probe = ov13850_probe, - .remove = ov13850_remove, - .id_table = ov13850_id, -}; - -module_i2c_driver(ov13850_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for ov13850"); -MODULE_AUTHOR("George"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/ov2710_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/ov2710_v4l2-i2c-subdev.c deleted file mode 100644 index 0b600a95b4c7..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov2710_v4l2-i2c-subdev.c +++ /dev/null @@ -1,955 +0,0 @@ -/* - * drivers/media/i2c/soc_camera/xgold/ov2710.c - * - * ov2710 sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - * Note: - * - * v0.1.0: - * 1. Initialize version; - * 2. Stream on sensor in configuration, - * and stream off sensor after 1frame; - * 3. Stream delay time is define in power_up_delays_ms[2]; - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" - -#define OV2710_DRIVER_NAME "ov2710" - -#define OV2710_FETCH_LSB_GAIN(VAL) (VAL & 0x00FF) /* gain[7:0] */ -#define OV2710_FETCH_MSB_GAIN(VAL) ((VAL >> 8) & 0x1) /* gain[10:8] */ -#define OV2710_AEC_PK_LONG_GAIN_HIGH_REG 0x350a /* Bit 8 */ -#define OV2710_AEC_PK_LONG_GAIN_LOW_REG 0x350b /* Bits 0 -7 */ - -#define OV2710_AEC_PK_LONG_EXPO_3RD_REG 0x3500 /* Exposure Bits 16-19 */ -#define OV2710_AEC_PK_LONG_EXPO_2ND_REG 0x3501 /* Exposure Bits 8-15 */ -#define OV2710_AEC_PK_LONG_EXPO_1ST_REG 0x3502 /* Exposure Bits 0-7 */ - -#define OV2710_AEC_GROUP_UPDATE_ADDRESS 0x3212 -#define OV2710_AEC_GROUP_UPDATE_START_DATA 0x00 -#define OV2710_AEC_GROUP_UPDATE_END_DATA 0x10 -#define OV2710_AEC_GROUP_UPDATE_END_LAUNCH 0xA0 - -#define OV2710_FETCH_3RD_BYTE_EXP(VAL) (((VAL) >> 12) & 0xF) /* 4 Bits */ -#define OV2710_FETCH_2ND_BYTE_EXP(VAL) (((VAL) >> 4) & 0xFF) /* 8 Bits */ -#define OV2710_FETCH_1ST_BYTE_EXP(VAL) (((VAL) & 0x0F) << 4) /* 4 Bits */ - -#define OV2710_PIDH_ADDR 0x300A -#define OV2710_PIDL_ADDR 0x300B - -/* High byte of product ID */ -#define OV2710_PIDH_MAGIC 0x27 -/* Low byte of product ID */ -#define OV2710_PIDL_MAGIC 0x10 - -#define OV2710_EXT_CLK 24000000 -#define OV2710_PLL_PREDIV0_REG 0x3088 -#define OV2710_PLL_PREDIV_REG 0x3080 -#define OV2710_PLL_MUL_HIGH_REG 0x3081 -#define OV2710_PLL_MUL_LOW_REG 0x3082 -#define OV2710_PLL_SPDIV_REG 0x3086 -#define OV2710_PLL_DIVSYS_REG 0x3084 -#define OV2710_TIMING_VTS_HIGH_REG 0x380e -#define OV2710_TIMING_VTS_LOW_REG 0x380f -#define OV2710_TIMING_HTS_HIGH_REG 0x380c -#define OV2710_TIMING_HTS_LOW_REG 0x380d -#define OV2710_FINE_INTG_TIME_MIN 0 -#define OV2710_FINE_INTG_TIME_MAX_MARGIN 0 -#define OV2710_COARSE_INTG_TIME_MIN 1 -#define OV2710_COARSE_INTG_TIME_MAX_MARGIN 4 -#define OV2710_TIMING_X_INC 0x3814 -#define OV2710_TIMING_Y_INC 0x3815 -#define OV2710_HORIZONTAL_START_HIGH_REG 0x3800 -#define OV2710_HORIZONTAL_START_LOW_REG 0x3801 -#define OV2710_VERTICAL_START_HIGH_REG 0x3802 -#define OV2710_VERTICAL_START_LOW_REG 0x3803 -#define OV2710_HORIZONTAL_END_HIGH_REG 0x3804 -#define OV2710_HORIZONTAL_END_LOW_REG 0x3805 -#define OV2710_VERTICAL_END_HIGH_REG 0x3806 -#define OV2710_VERTICAL_END_LOW_REG 0x3807 -#define OV2710_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3808 -#define OV2710_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3809 -#define OV2710_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x380a -#define OV2710_VERTICAL_OUTPUT_SIZE_LOW_REG 0x380b -#define OV2710_H_WIN_OFF_HIGH_REG 0x3810 -#define OV2710_H_WIN_OFF_LOW_REG 0x3811 -#define OV2710_V_WIN_OFF_HIGH_REG 0x3812 -#define OV2710_V_WIN_OFF_LOW_REG 0x3813 - -#define OV2710_ANA_ARRAR01 0x3621 -#define OV2710_TIMING_CONCTROL_VH 0x3803 -#define OV2710_TIMING_CONCTROL18 0x3818 - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ -/* MCLK:24MHz 1920x1080 30fps mipi 1lane 800Mbps/lane */ -static struct ov_camera_module_reg ov2710_init_tab_1920_1080_30fps[] = { -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3008, 0x82}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3008, 0x42}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4201, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4202, 0x0f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3103, 0x93}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3017, 0x7f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0xfc}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x61}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3712, 0x0c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3630, 0x6d}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0xb4}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x0a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3818, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x38}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x38}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3621, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0xa7}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3631, 0x26}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3620, 0x37}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3623, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x9e}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x5c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370d, 0x0f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3713, 0x9f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3714, 0x4c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3710, 0x9e}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0xc4}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3606, 0x3f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302d, 0x90}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3716, 0x31}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x52}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x74}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5181, 0x20}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x518f, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4301, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4303, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a00, 0x78}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0x88}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x28}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a1a, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a18, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a19, 0x7a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a13, 0x54}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382e, 0x0f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x381a, 0x1a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5688, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5684, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5685, 0xa0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5686, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5687, 0x43}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x0a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0x8a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3017, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300e, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4801, 0x0f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0xc3}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0f, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a10, 0x38}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a1b, 0x48}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a1e, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a11, 0x90}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a1f, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x09},/* HTS H */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x74},/* HTS L */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x04},/* VTS H */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x50},/* VTS L */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x28}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x90}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350a, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350b, 0x1f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x5f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x4e}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3406, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3400, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3401, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3402, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3403, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3404, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3405, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4800, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4201, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4202, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3008, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_TIMEOUT, 0x0000, 40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3008, 0x42}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4201, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4202, 0x0f} -}; - -/* ======================================================================== */ -static struct ov_camera_module_config ov2710_configs[] = { - { - .name = "1920x1080_30fps", - .frm_fmt = { - .width = 1920, - .height = 1080, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov2710_init_tab_1920_1080_30fps, - .reg_table_num_entries = - sizeof(ov2710_init_tab_1920_1080_30fps) / - sizeof(ov2710_init_tab_1920_1080_30fps[0]), - .v_blanking_time_us = 3078, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - .ignore_measurement_check = 1, - PLTFRM_CAM_ITF_MIPI_CFG(0, 1, 800, 24000000) - } -}; - -/*--------------------------------------------------------------------------*/ -static int ov2710_set_flip( - struct ov_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - int i, mode = 0; - u16 match_reg[3]; - - mode = ov_camera_module_get_flip_mirror(cam_mod); - - if (mode == -1) { - ov_camera_module_pr_debug( - cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - if (mode == OV_FLIP_BIT_MASK) { - match_reg[0] = 0x04; - match_reg[1] = 0x09; - match_reg[2] = 0xa0; - } else if (mode == OV_MIRROR_BIT_MASK) { - match_reg[0] = 0x14; - match_reg[1] = 0x0a; - match_reg[2] = 0xc0; - } else if (mode == (OV_MIRROR_BIT_MASK | - OV_FLIP_BIT_MASK)) { - match_reg[0] = 0x14; - match_reg[1] = 0x09; - match_reg[2] = 0xe0; - } else { - match_reg[0] = 0x04; - match_reg[1] = 0x0a; - match_reg[2] = 0x80; - } - - for (i = len; i > 0; i--) { - if (reglist[i].reg == OV2710_ANA_ARRAR01) - reglist[i].val = match_reg[0]; - else if (reglist[i].reg == OV2710_TIMING_CONCTROL_VH) - reglist[i].val = match_reg[1]; - else if (reglist[i].reg == OV2710_TIMING_CONCTROL18) - reglist[i].val = match_reg[2]; - } - - return 0; -} - -/*--------------------------------------------------------------------------*/ -static int OV2710_g_VTS(struct ov_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = ov_camera_module_read_reg_table( - cam_mod, - OV2710_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_read_reg_table( - cam_mod, - OV2710_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int OV2710_auto_adjust_fps(struct ov_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - if ((exp_time + OV2710_COARSE_INTG_TIME_MAX_MARGIN) - > cam_mod->vts_min) - vts = exp_time + OV2710_COARSE_INTG_TIME_MAX_MARGIN; - else - vts = cam_mod->vts_min; - - if (vts > 0xfff) - vts = 0xfff; - else - vts = vts;/* VTS value is 0x380e[3:0]/380f[7:0] */ - - ret = ov_camera_module_write_reg(cam_mod, - OV2710_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - OV2710_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0x0F); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, - "updated vts = 0x%x,vts_min=0x%x\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int ov2710_set_vts(struct ov_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts < cam_mod->vts_min) - return ret; - - if (vts > 0xfff) - vts = 0xfff; - - ret = ov_camera_module_write_reg(cam_mod, - OV2710_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - OV2710_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0x0F); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, "updated vts=%d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - return ret; -} - -static int ov2710_write_aec(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "exp_time = %d lines, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if ((cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY) || - (cam_mod->state == OV_CAMERA_MODULE_STREAMING)) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time = cam_mod->exp_config.exp_time; - - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - - mutex_lock(&cam_mod->lock); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - ret = ov_camera_module_write_reg(cam_mod, - OV2710_AEC_GROUP_UPDATE_ADDRESS, - OV2710_AEC_GROUP_UPDATE_START_DATA); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = OV2710_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - ret |= ov_camera_module_write_reg(cam_mod, - OV2710_AEC_PK_LONG_GAIN_HIGH_REG, - OV2710_FETCH_MSB_GAIN(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, - OV2710_AEC_PK_LONG_GAIN_LOW_REG, - OV2710_FETCH_LSB_GAIN(a_gain)); - ret = ov_camera_module_write_reg(cam_mod, - OV2710_AEC_PK_LONG_EXPO_3RD_REG, - OV2710_FETCH_3RD_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - OV2710_AEC_PK_LONG_EXPO_2ND_REG, - OV2710_FETCH_2ND_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - OV2710_AEC_PK_LONG_EXPO_1ST_REG, - OV2710_FETCH_1ST_BYTE_EXP(exp_time)); - if (!cam_mod->auto_adjust_fps) - ret |= ov2710_set_vts(cam_mod, cam_mod->exp_config.vts_value); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - ret = ov_camera_module_write_reg(cam_mod, - OV2710_AEC_GROUP_UPDATE_ADDRESS, - OV2710_AEC_GROUP_UPDATE_END_DATA); - ret = ov_camera_module_write_reg(cam_mod, - OV2710_AEC_GROUP_UPDATE_ADDRESS, - OV2710_AEC_GROUP_UPDATE_END_LAUNCH); - } - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov2710_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov2710_filltimings(struct ov_camera_module_custom_config *custom) -{ - int i, j; - u32 win_h_off = 0, win_v_off = 0; - struct ov_camera_module_config *config; - struct ov_camera_module_timings *timings; - struct ov_camera_module_reg *reg_table; - int reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - memset(timings, 0x00, sizeof(*timings)); - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case OV2710_TIMING_VTS_HIGH_REG: - timings->frame_length_lines = - ((reg_table[j].val << 8) | - (timings->frame_length_lines & 0xff)); - break; - case OV2710_TIMING_VTS_LOW_REG: - timings->frame_length_lines = - (reg_table[j].val | - (timings->frame_length_lines & 0xff00)); - break; - case OV2710_TIMING_HTS_HIGH_REG: - timings->line_length_pck = - ((reg_table[j].val << 8) | - timings->line_length_pck); - break; - case OV2710_TIMING_HTS_LOW_REG: - timings->line_length_pck = - (reg_table[j].val | - (timings->line_length_pck & 0xff00)); - break; - case OV2710_TIMING_X_INC: - timings->binning_factor_x = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_x == 0) - timings->binning_factor_x = 1; - break; - case OV2710_TIMING_Y_INC: - timings->binning_factor_y = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_y == 0) - timings->binning_factor_y = 1; - break; - case OV2710_HORIZONTAL_START_HIGH_REG: - timings->crop_horizontal_start = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_start & - 0xff)); - break; - case OV2710_HORIZONTAL_START_LOW_REG: - timings->crop_horizontal_start = - (reg_table[j].val | - (timings->crop_horizontal_start & - 0xff00)); - break; - case OV2710_VERTICAL_START_HIGH_REG: - timings->crop_vertical_start = - ((reg_table[j].val << 8) | - (timings->crop_vertical_start & 0xff)); - break; - case OV2710_VERTICAL_START_LOW_REG: - timings->crop_vertical_start = - ((reg_table[j].val) | - (timings->crop_vertical_start & - 0xff00)); - break; - case OV2710_HORIZONTAL_END_HIGH_REG: - timings->crop_horizontal_end = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_end & 0xff)); - break; - case OV2710_HORIZONTAL_END_LOW_REG: - timings->crop_horizontal_end = - (reg_table[j].val | - (timings->crop_horizontal_end & - 0xff00)); - break; - case OV2710_VERTICAL_END_HIGH_REG: - timings->crop_vertical_end = - ((reg_table[j].val << 8) | - (timings->crop_vertical_end & 0xff)); - break; - case OV2710_VERTICAL_END_LOW_REG: - timings->crop_vertical_end = - (reg_table[j].val | - (timings->crop_vertical_end & 0xff00)); - break; - case OV2710_H_WIN_OFF_HIGH_REG: - win_h_off = (reg_table[j].val & 0xf) << 8; - break; - case OV2710_H_WIN_OFF_LOW_REG: - win_h_off |= (reg_table[j].val & 0xff); - break; - case OV2710_V_WIN_OFF_HIGH_REG: - win_v_off = (reg_table[j].val & 0xf) << 8; - break; - case OV2710_V_WIN_OFF_LOW_REG: - win_v_off |= (reg_table[j].val & 0xff); - break; - case OV2710_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - ((reg_table[j].val << 8) | - (timings->sensor_output_width & 0xff)); - break; - case OV2710_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width = - (reg_table[j].val | - (timings->sensor_output_width & - 0xff00)); - break; - case OV2710_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - ((reg_table[j].val << 8) | - (timings->sensor_output_height & 0xff)); - break; - case OV2710_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height = - (reg_table[j].val | - (timings->sensor_output_height & - 0xff00)); - break; - } - } - - timings->crop_horizontal_start += win_h_off; - timings->crop_horizontal_end -= win_h_off; - timings->crop_vertical_start += win_v_off; - timings->crop_vertical_end -= win_v_off; - - timings->exp_time >>= 4; - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator * - timings->frame_length_lines * - timings->line_length_pck; - - timings->coarse_integration_time_min = - OV2710_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - OV2710_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = - OV2710_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - OV2710_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int ov2710_g_timings(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - - timings->frame_length_lines = vts; - return ret; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov2710_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = ov2710_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - case V4L2_CID_FOCUS_ABSOLUTE: - /* todo*/ - break; - /* - * case RK_V4L2_CID_FPS_CTRL: - * if (cam_mod->auto_adjust_fps) - * ret = OV2710_auto_adjust_fps( - * cam_mod, - * cam_mod->exp_config.exp_time); - * break; - */ - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov2710_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = ov2710_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov2710_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "active config=%s\n", cam_mod->active_config->name); - - ret = OV2710_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - ov_camera_module_pr_debug(cam_mod, "=====streaming on ===\n"); - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x3008, 0x02); - ret |= ov_camera_module_write_reg(cam_mod, 0x4201, 0x00); - ret |= ov_camera_module_write_reg(cam_mod, 0x4202, 0x00); - mutex_unlock(&cam_mod->lock); - - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov2710_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x3008, 0x42); - ret |= ov_camera_module_write_reg(cam_mod, 0x4201, 0x00); - ret |= ov_camera_module_write_reg(cam_mod, 0x4202, 0x0f); - mutex_unlock(&cam_mod->lock); - - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov2710_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret |= ov_camera_module_read_reg(cam_mod, 1, OV2710_PIDH_ADDR, &pidh); - ret |= ov_camera_module_read_reg(cam_mod, 1, OV2710_PIDL_ADDR, &pidl); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if ((pidh == OV2710_PIDH_MAGIC) && (pidl == OV2710_PIDL_MAGIC)) - ov_camera_module_pr_debug(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - OV2710_PIDH_MAGIC, OV2710_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -int ov_camera_2710_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - return 0; -} - -/* ======================================================================== */ - -int ov_camera_2710_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls) -{ - return 0; -} - -long ov_camera_2710_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - return 0; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops ov2710_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops ov2710_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .g_frame_interval = ov_camera_module_g_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops ov2710_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops ov2710_camera_module_ops = { - .core = &ov2710_camera_module_core_ops, - .video = &ov2710_camera_module_video_ops, - .pad = &ov2710_camera_module_pad_ops -}; - -static struct ov_camera_module ov2710; - -static struct ov_camera_module_custom_config ov2710_custom_config = { - .start_streaming = ov2710_start_streaming, - .stop_streaming = ov2710_stop_streaming, - .s_ctrl = ov2710_s_ctrl, - .g_ctrl = ov2710_g_ctrl, - .s_ext_ctrls = ov2710_s_ext_ctrls, - .g_timings = ov2710_g_timings, - .set_flip = ov2710_set_flip, - .check_camera_id = ov2710_check_camera_id, - .s_vts = OV2710_auto_adjust_fps, - .configs = ov2710_configs, - .num_configs = ARRAY_SIZE(ov2710_configs), - .power_up_delays_ms = {5, 30, 30}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 2} -}; - -static int ov2710_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - ov2710_filltimings(&ov2710_custom_config); - v4l2_i2c_subdev_init(&ov2710.sd, client, - &ov2710_camera_module_ops); - - ov2710.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; - ov2710.custom = ov2710_custom_config; - - mutex_init(&ov2710.lock); - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -/* ======================================================================== */ - -static int ov2710_remove( - struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - mutex_destroy(&cam_mod->lock); - ov_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id ov2710_id[] = { - { OV2710_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id ov2710_of_match[] = { - {.compatible = "omnivision,ov2710-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, ov2710_id); - -static struct i2c_driver ov2710_i2c_driver = { - .driver = { - .name = OV2710_DRIVER_NAME, - .owner = THIS_MODULE, - .of_match_table = ov2710_of_match - }, - .probe = ov2710_probe, - .remove = ov2710_remove, - .id_table = ov2710_id, -}; - -module_i2c_driver(ov2710_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for ov2710"); -MODULE_AUTHOR("Eike Grimpe"); -MODULE_LICENSE("GPL"); - diff --git a/drivers/media/i2c/soc_camera/rockchip/ov4689_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/ov4689_v4l2-i2c-subdev.c deleted file mode 100644 index f327446ccd45..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov4689_v4l2-i2c-subdev.c +++ /dev/null @@ -1,994 +0,0 @@ -/* - * ov4689 sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" - -#define ov4689_DRIVER_NAME "ov4689" - -#define ov4689_AEC_PK_LONG_GAIN_HIGH_REG 0x3508 /* Bit 6-13 */ -#define ov4689_AEC_PK_LONG_GAIN_LOW_REG 0x3509 /* Bits 0 -5 */ -#define ov4689_FETCH_LSB_GAIN(VAL) ((VAL) & 0x00ff) -#define ov4689_FETCH_MSB_GAIN(VAL) (((VAL) >> 8) & 0xff) - -#define ov4689_AEC_PK_LONG_EXPO_3RD_REG 0x3500 /* Exposure Bits 16-19 */ -#define ov4689_AEC_PK_LONG_EXPO_2ND_REG 0x3501 /* Exposure Bits 8-15 */ -#define ov4689_AEC_PK_LONG_EXPO_1ST_REG 0x3502 /* Exposure Bits 0-7 */ -#define ov4689_FETCH_3RD_BYTE_EXP(VAL) (((VAL) >> 12) & 0xF) /* 4 Bits */ -#define ov4689_FETCH_2ND_BYTE_EXP(VAL) (((VAL) >> 4) & 0xFF) /* 8 Bits */ -#define ov4689_FETCH_1ST_BYTE_EXP(VAL) (((VAL) & 0x0F) << 4) /* 4 Bits */ - -#define ov4689_AEC_GROUP_UPDATE_ADDRESS 0x3208 -#define ov4689_AEC_GROUP_UPDATE_START_DATA 0x00 -#define ov4689_AEC_GROUP_UPDATE_END_DATA 0x10 -#define ov4689_AEC_GROUP_UPDATE_END_LAUNCH 0xA0 - -#define ov4689_PIDH_ADDR 0x300A -#define ov4689_PIDL_ADDR 0x300B - -#define ov4689_PIDH_MAGIC 0x46 -#define ov4689_PIDL_MAGIC 0x88 - -#define ov4689_TIMING_VTS_HIGH_REG 0x380e -#define ov4689_TIMING_VTS_LOW_REG 0x380f -#define ov4689_TIMING_HTS_HIGH_REG 0x380c -#define ov4689_TIMING_HTS_LOW_REG 0x380d -#define ov4689_INTEGRATION_TIME_MARGIN 8 -#define ov4689_FINE_INTG_TIME_MIN 0 -#define ov4689_FINE_INTG_TIME_MAX_MARGIN 0 -#define ov4689_COARSE_INTG_TIME_MIN 16 -#define ov4689_COARSE_INTG_TIME_MAX_MARGIN 4 -#define ov4689_TIMING_X_INC 0x3814 -#define ov4689_TIMING_Y_INC 0x3815 -#define ov4689_HORIZONTAL_START_HIGH_REG 0x3800 -#define ov4689_HORIZONTAL_START_LOW_REG 0x3801 -#define ov4689_VERTICAL_START_HIGH_REG 0x3802 -#define ov4689_VERTICAL_START_LOW_REG 0x3803 -#define ov4689_HORIZONTAL_END_HIGH_REG 0x3804 -#define ov4689_HORIZONTAL_END_LOW_REG 0x3805 -#define ov4689_VERTICAL_END_HIGH_REG 0x3806 -#define ov4689_VERTICAL_END_LOW_REG 0x3807 -#define ov4689_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3808 -#define ov4689_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3809 -#define ov4689_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x380a -#define ov4689_VERTICAL_OUTPUT_SIZE_LOW_REG 0x380b -#define ov4689_FLIP_REG 0x3820 -#define ov4689_MIRROR_REG 0x3821 - -#define ov4689_EXT_CLK 24000000 - -#define ov4689_FULL_SIZE_RESOLUTION_WIDTH 2688 -#define ov4689_BINING_SIZE_RESOLUTION_WIDTH 1280 - -static struct ov_camera_module ov4689; -static struct ov_camera_module_custom_config ov4689_custom_config; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ - -/* MCLK:24MHz 2688x1520 30fps mipi 4lane 1008Mbps/lane */ -static struct ov_camera_module_reg ov4689_init_tab_2688_1520_30fps[] = { -/* global setting */ -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0103, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3638, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0300, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x2a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0304, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030b, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030d, 0x1e}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030e, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030f, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0312, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x031e, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3000, 0x20}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3002, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0x32}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3020, 0x93}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3021, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3022, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3031, 0x0a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x303f, 0x0c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3305, 0xf1}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3307, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3309, 0x29}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3504, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3505, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3506, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3507, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350a, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350b, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350c, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350d, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350e, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350f, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3510, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3511, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3512, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3513, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3514, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3515, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3516, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3517, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3518, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3519, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351a, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351b, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351c, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351d, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351e, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x351f, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3520, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3521, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3522, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3524, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3526, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3528, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x352a, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3606, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3607, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3609, 0x12}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360a, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360c, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0xe5}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3608, 0x8f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0xf7}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3616, 0x58}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3619, 0x99}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361b, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361c, 0x7a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361e, 0x79}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361f, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3632, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3633, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3634, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3635, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x15}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3646, 0x86}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x364a, 0x0b}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3700, 0x17}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3701, 0x22}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x37}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x63}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x3c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370c, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3710, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3711, 0x0c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3716, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3720, 0x28}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3729, 0x7b}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x84}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372b, 0xbd}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372c, 0xbc}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372e, 0x52}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373c, 0x0e}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373e, 0x33}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3743, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3744, 0x88}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3745, 0xc0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x374a, 0x43}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x374c, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x374e, 0x23}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3751, 0x7b}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3752, 0x84}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3753, 0xbd}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3754, 0xbc}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3756, 0x52}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375c, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3760, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3761, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3762, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3763, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3764, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3767, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3769, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376a, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376b, 0x20}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376c, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376d, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376e, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3773, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3774, 0x51}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3776, 0xbd}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3777, 0xbd}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3781, 0x18}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3783, 0x25}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3798, 0x1b}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x0a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x97}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0xfb}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x0a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x0a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x18}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x12}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3819, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3829, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382a, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382b, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382d, 0x7f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3830, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3841, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3846, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3847, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x36}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8c, 0x71}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8d, 0xcb}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f0a, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xf1}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4002, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4003, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400e, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4011, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401a, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401b, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401c, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401f, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0xcf}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x6f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4028, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4029, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402a, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402c, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402d, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x0e}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4302, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4303, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4304, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4305, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4306, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4308, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x6c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4501, 0xc4}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4502, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4503, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0xa7}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4800, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4813, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x481f, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4829, 0x78}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4b00, 0x2a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4b0d, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d00, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d01, 0x42}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d02, 0xd1}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d03, 0x93}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d04, 0xf5}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d05, 0xc1}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0xf3}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x11}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5004, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x500a, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x500b, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5032, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5040, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5050, 0x0c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5500, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5501, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5502, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5503, 0x0f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x8000, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x8001, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x8002, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x8003, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x8004, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x8005, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x8006, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x8007, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x8008, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3638, 0x00}, -/* {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x01} */ -}; - -static struct ov_camera_module_config ov4689_configs[] = { - { - .name = "2688x1520_30fps", - .frm_fmt = { - .width = 2688, - .height = 1520, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov4689_init_tab_2688_1520_30fps, - .reg_table_num_entries = - sizeof(ov4689_init_tab_2688_1520_30fps) / - sizeof(ov4689_init_tab_2688_1520_30fps[0]), - .v_blanking_time_us = 5000, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 999, ov4689_EXT_CLK) - } -}; - -static int ov4689_g_VTS(struct ov_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = ov_camera_module_read_reg_table( - cam_mod, - ov4689_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_read_reg_table( - cam_mod, - ov4689_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -static int ov4689_auto_adjust_fps(struct ov_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - if ((exp_time + ov4689_COARSE_INTG_TIME_MAX_MARGIN) - > cam_mod->vts_min) - vts = exp_time + ov4689_COARSE_INTG_TIME_MAX_MARGIN; - else - vts = cam_mod->vts_min; - ret = ov_camera_module_write_reg(cam_mod, - ov4689_TIMING_VTS_LOW_REG, vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov4689_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, - "updated vts = %d,vts_min=%d\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int ov4689_set_vts(struct ov_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts < cam_mod->vts_min) - return ret; - - if (vts > 0xfff) - vts = 0xfff; - - ret = ov_camera_module_write_reg(cam_mod, - ov4689_TIMING_VTS_LOW_REG, vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov4689_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, "updated vts=%d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - return ret; -} - -static int ov4689_write_aec(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "exp_time = %d, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if ((cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY) || - (cam_mod->state == OV_CAMERA_MODULE_STREAMING)) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time = cam_mod->exp_config.exp_time; - - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - - mutex_lock(&cam_mod->lock); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - ret = ov_camera_module_write_reg(cam_mod, - ov4689_AEC_GROUP_UPDATE_ADDRESS, - ov4689_AEC_GROUP_UPDATE_START_DATA); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = ov4689_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - ret |= ov_camera_module_write_reg(cam_mod, - ov4689_AEC_PK_LONG_GAIN_HIGH_REG, - ov4689_FETCH_MSB_GAIN(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, - ov4689_AEC_PK_LONG_GAIN_LOW_REG, - ov4689_FETCH_LSB_GAIN(a_gain)); - ret = ov_camera_module_write_reg(cam_mod, - ov4689_AEC_PK_LONG_EXPO_3RD_REG, - ov4689_FETCH_3RD_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov4689_AEC_PK_LONG_EXPO_2ND_REG, - ov4689_FETCH_2ND_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov4689_AEC_PK_LONG_EXPO_1ST_REG, - ov4689_FETCH_1ST_BYTE_EXP(exp_time)); - if (!cam_mod->auto_adjust_fps) - ret |= ov4689_set_vts(cam_mod, cam_mod->exp_config.vts_value); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - ret = ov_camera_module_write_reg(cam_mod, - ov4689_AEC_GROUP_UPDATE_ADDRESS, - ov4689_AEC_GROUP_UPDATE_END_DATA); - ret = ov_camera_module_write_reg(cam_mod, - ov4689_AEC_GROUP_UPDATE_ADDRESS, - ov4689_AEC_GROUP_UPDATE_END_LAUNCH); - } - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov4689_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov4689_filltimings(struct ov_camera_module_custom_config *custom) -{ - int i, j; - struct ov_camera_module_config *config; - struct ov_camera_module_timings *timings; - struct ov_camera_module_reg *reg_table; - int reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case ov4689_TIMING_VTS_HIGH_REG: - timings->frame_length_lines = - reg_table[j].val << 8; - break; - case ov4689_TIMING_VTS_LOW_REG: - timings->frame_length_lines |= reg_table[j].val; - break; - case ov4689_TIMING_HTS_HIGH_REG: - timings->line_length_pck = - (reg_table[j].val << 8); - break; - case ov4689_TIMING_HTS_LOW_REG: - timings->line_length_pck |= reg_table[j].val; - break; - case ov4689_TIMING_X_INC: - timings->binning_factor_x = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_x == 0) - timings->binning_factor_x = 1; - break; - case ov4689_TIMING_Y_INC: - timings->binning_factor_y = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_y == 0) - timings->binning_factor_y = 1; - break; - case ov4689_HORIZONTAL_START_HIGH_REG: - timings->crop_horizontal_start = - reg_table[j].val << 8; - break; - case ov4689_HORIZONTAL_START_LOW_REG: - timings->crop_horizontal_start |= - reg_table[j].val; - break; - case ov4689_VERTICAL_START_HIGH_REG: - timings->crop_vertical_start = - reg_table[j].val << 8; - break; - case ov4689_VERTICAL_START_LOW_REG: - timings->crop_vertical_start |= - reg_table[j].val; - break; - case ov4689_HORIZONTAL_END_HIGH_REG: - timings->crop_horizontal_end = - reg_table[j].val << 8; - break; - case ov4689_HORIZONTAL_END_LOW_REG: - timings->crop_horizontal_end |= - reg_table[j].val; - break; - case ov4689_VERTICAL_END_HIGH_REG: - timings->crop_vertical_end = - reg_table[j].val << 8; - break; - case ov4689_VERTICAL_END_LOW_REG: - timings->crop_vertical_end |= reg_table[j].val; - break; - case ov4689_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - reg_table[j].val << 8; - break; - case ov4689_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width |= - reg_table[j].val; - break; - case ov4689_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - reg_table[j].val << 8; - break; - case ov4689_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height |= - reg_table[j].val; - break; - } - } - - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator * - timings->frame_length_lines * - timings->line_length_pck; - - timings->coarse_integration_time_min = - ov4689_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - ov4689_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = ov4689_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - ov4689_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -static int ov4689_g_timings(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - - timings->frame_length_lines = vts; - return ret; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov4689_set_flip( - struct ov_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - int i, mode = 0; - u16 match_reg[2]; - - mode = ov_camera_module_get_flip_mirror(cam_mod); - if (mode == -1) { - ov_camera_module_pr_info(cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - switch (cam_mod->active_config->frm_fmt.width) { - case ov4689_FULL_SIZE_RESOLUTION_WIDTH: - if (mode == OV_FLIP_BIT_MASK) { - match_reg[0] = 0x06; - match_reg[1] = 0x00; - } else if (mode == OV_MIRROR_BIT_MASK) { - match_reg[0] = 0x00; - match_reg[1] = 0x06; - } else if (mode == (OV_MIRROR_BIT_MASK | - OV_FLIP_BIT_MASK)) { - match_reg[0] = 0x06; - match_reg[1] = 0x06; - } else { - match_reg[0] = 0x00; - match_reg[1] = 0x00; - } - break; - case ov4689_BINING_SIZE_RESOLUTION_WIDTH: - if (mode == OV_FLIP_BIT_MASK) { - match_reg[0] = 0x16; - match_reg[1] = 0x01; - } else if (mode == OV_MIRROR_BIT_MASK) { - match_reg[0] = 0x16; - match_reg[1] = 0x07; - } else if (mode == (OV_MIRROR_BIT_MASK | - OV_FLIP_BIT_MASK)) { - match_reg[0] = 0x16; - match_reg[1] = 0x07; - } else { - match_reg[0] = 0x10; - match_reg[1] = 0x01; - } - break; - default: - return 0; - } - - for (i = len; i > 0; i--) { - if (reglist[i].reg == ov4689_FLIP_REG) - reglist[i].val = match_reg[0]; - else if (reglist[i].reg == ov4689_MIRROR_REG) - reglist[i].val = match_reg[1]; - } - } - - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int ov4689_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = ov4689_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d) 0x%x\n", ret, ctrl_id); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov4689_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = ov4689_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov4689_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "active config=%s\n", cam_mod->active_config->name); - - ret = ov4689_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 1); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov4689_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 0); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int ov4689_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret |= ov_camera_module_read_reg(cam_mod, 1, ov4689_PIDH_ADDR, &pidh); - ret |= ov_camera_module_read_reg(cam_mod, 1, ov4689_PIDL_ADDR, &pidl); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if ((pidh == ov4689_PIDH_MAGIC) && (pidl == ov4689_PIDL_MAGIC)) - ov_camera_module_pr_debug(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - ov4689_PIDH_MAGIC, ov4689_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops ov4689_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops ov4689_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .g_frame_interval = ov_camera_module_g_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops ov4689_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops ov4689_camera_module_ops = { - .core = &ov4689_camera_module_core_ops, - .video = &ov4689_camera_module_video_ops, - .pad = &ov4689_camera_module_pad_ops -}; - -static struct ov_camera_module_custom_config ov4689_custom_config = { - .start_streaming = ov4689_start_streaming, - .stop_streaming = ov4689_stop_streaming, - .s_ctrl = ov4689_s_ctrl, - .s_ext_ctrls = ov4689_s_ext_ctrls, - .g_ctrl = ov4689_g_ctrl, - .g_timings = ov4689_g_timings, - .check_camera_id = ov4689_check_camera_id, - .set_flip = ov4689_set_flip, - .s_vts = ov4689_auto_adjust_fps, - .configs = ov4689_configs, - .num_configs = ARRAY_SIZE(ov4689_configs), - .power_up_delays_ms = {5, 20, 0}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static int ov4689_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - ov4689_filltimings(&ov4689_custom_config); - v4l2_i2c_subdev_init(&ov4689.sd, client, &ov4689_camera_module_ops); - ov4689.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; - ov4689.custom = ov4689_custom_config; - - mutex_init(&ov4689.lock); - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -static int ov4689_remove(struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - mutex_destroy(&cam_mod->lock); - ov_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id ov4689_id[] = { - { ov4689_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id ov4689_of_match[] = { - {.compatible = "omnivision,ov4689-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, ov4689_id); - -static struct i2c_driver ov4689_i2c_driver = { - .driver = { - .name = ov4689_DRIVER_NAME, - .of_match_table = ov4689_of_match - }, - .probe = ov4689_probe, - .remove = ov4689_remove, - .id_table = ov4689_id, -}; - -module_i2c_driver(ov4689_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for ov4689"); -MODULE_AUTHOR("George"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/ov5640_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/ov5640_v4l2-i2c-subdev.c deleted file mode 100644 index f8d5c303f08c..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov5640_v4l2-i2c-subdev.c +++ /dev/null @@ -1,1083 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * ov5640 sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" - -#define ov5640_DRIVER_NAME "ov5640" - -#define ov5640_FETCH_LSB_GAIN(VAL) ((VAL) & 0x00ff) -#define ov5640_FETCH_MSB_GAIN(VAL) (((VAL) >> 8) & 0xff) -#define ov5640_AEC_PK_LONG_GAIN_HIGH_REG 0x350a /* Real gain Bits 6-13 */ -#define ov5640_AEC_PK_LONG_GAIN_LOW_REG 0x350b /* Real gain Bits 0-5 */ - -#define ov5640_AEC_PK_LONG_EXPO_3RD_REG 0x3500 /* Exposure Bits 16-19 */ -#define ov5640_AEC_PK_LONG_EXPO_2ND_REG 0x3501 /* Exposure Bits 8-15 */ -#define ov5640_AEC_PK_LONG_EXPO_1ST_REG 0x3502 /* Exposure Bits 0-7 */ - -#define ov5640_AEC_GROUP_UPDATE_ADDRESS 0x3212 -#define ov5640_AEC_GROUP_UPDATE_START_DATA 0x00 -#define ov5640_AEC_GROUP_UPDATE_END_DATA 0x10 -#define ov5640_AEC_GROUP_UPDATE_END_LAUNCH 0xA0 - -#define ov5640_FETCH_3RD_BYTE_EXP(VAL) (((VAL) >> 16) & 0xF) /* 4 Bits */ -#define ov5640_FETCH_2ND_BYTE_EXP(VAL) (((VAL) >> 8) & 0xFF) /* 8 Bits */ -#define ov5640_FETCH_1ST_BYTE_EXP(VAL) ((VAL) & 0xFF) /* 8 Bits */ - -#define ov5640_PIDH_ADDR 0x300a -#define ov5640_PIDL_ADDR 0x300b - -#define ov5640_TIMING_VTS_HIGH_REG 0x380e -#define ov5640_TIMING_VTS_LOW_REG 0x380f -#define ov5640_TIMING_HTS_HIGH_REG 0x380c -#define ov5640_TIMING_HTS_LOW_REG 0x380d -#define ov5640_INTEGRATION_TIME_MARGIN 8 -#define ov5640_FINE_INTG_TIME_MIN 0 -#define ov5640_FINE_INTG_TIME_MAX_MARGIN 0 -#define ov5640_COARSE_INTG_TIME_MIN 16 -#define ov5640_COARSE_INTG_TIME_MAX_MARGIN 4 -#define ov5640_TIMING_X_INC 0x3814 -#define ov5640_TIMING_Y_INC 0x3815 -#define ov5640_HORIZONTAL_START_HIGH_REG 0x3800 -#define ov5640_HORIZONTAL_START_LOW_REG 0x3801 -#define ov5640_VERTICAL_START_HIGH_REG 0x3802 -#define ov5640_VERTICAL_START_LOW_REG 0x3803 -#define ov5640_HORIZONTAL_END_HIGH_REG 0x3804 -#define ov5640_HORIZONTAL_END_LOW_REG 0x3805 -#define ov5640_VERTICAL_END_HIGH_REG 0x3806 -#define ov5640_VERTICAL_END_LOW_REG 0x3807 -#define ov5640_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3808 -#define ov5640_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3809 -#define ov5640_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x380a -#define ov5640_VERTICAL_OUTPUT_SIZE_LOW_REG 0x380b -#define ov5640_FLIP_REG 0x3820 -#define ov5640_MIRROR_REG 0x3821 - -#define ov5640_EXT_CLK 24000000 -#define ov5640_FULL_SIZE_RESOLUTION_WIDTH 2592 -/* High byte of product ID */ -#define ov5640_PIDH_MAGIC 0x56 -/* Low byte of product ID */ -#define ov5640_PIDL_MAGIC 0x40 - -static struct ov_camera_module ov5640; -static struct ov_camera_module_custom_config ov5640_custom_config; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ -static struct ov_camera_module_reg ov5640_init_tab_800_600_30fps[] = { - /* OV5640_g_aRegDescription */ - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3103, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3008, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3008, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3103, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3017, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3034, 0x1a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3035, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3036, 0x46}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3037, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3108, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3630, 0x36}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3631, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3632, 0xe2}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3633, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3621, 0xe0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x5a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3715, 0x78}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3717, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x1a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3905, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3906, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3901, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3731, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302d, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3620, 0x52}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x471c, 0x50}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a13, 0x43}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a18, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a19, 0x78}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3635, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3634, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3622, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c01, 0x34}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c04, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c05, 0x98}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c06, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c07, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c08, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c09, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0a, 0x9c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0b, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x41}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x9b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x68}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0xd8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3618, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x29}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x64}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x52}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370c, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a02, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a03, 0xd8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a08, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a09, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0b, 0xf6}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0e, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0d, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a14, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a15, 0xd8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4004, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3000, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3002, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3004, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3006, 0xc3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300e, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4740, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4300, 0x32},/* uyvy:0x32,yuyv:0x30 */ - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x501f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4713, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4407, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x440e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x460b, 0x35}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x460c, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3824, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0xa7}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0xa3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5180, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5181, 0xf2}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5182, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5183, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5184, 0x25}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5185, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5186, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5187, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5188, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5189, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x518a, 0x5d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x518b, 0xe3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x518c, 0xa7}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x518d, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x518e, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x518f, 0x5e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5190, 0x4e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5191, 0xf8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5192, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5193, 0x70}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5194, 0xf0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5195, 0xf0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5196, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5197, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5198, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5199, 0xd0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x519a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x519b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x519c, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x519d, 0x87}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x519e, 0x38}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5381, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5382, 0x41}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5383, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5384, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5385, 0x59}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5386, 0x66}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5387, 0x63}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5388, 0x55}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5389, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x538a, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x538b, 0x98}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5300, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5301, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5302, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5303, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5304, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5305, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5306, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5307, 0x16}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5309, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530a, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530b, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x530c, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5480, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5481, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5482, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5483, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5484, 0x51}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5485, 0x65}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5486, 0x71}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5487, 0x7d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5488, 0x87}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5489, 0x91}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x548a, 0x9a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x548b, 0xaa}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x548c, 0xb8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x548d, 0xcd}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x548e, 0xdd}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x548f, 0xea}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5490, 0x1d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5580, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5583, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5584, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5589, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x558a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x558b, 0xf8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5800, 0x23}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5801, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5802, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5803, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5804, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5805, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5806, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5807, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5808, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5809, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x580a, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x580b, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x580c, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x580d, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x580e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x580f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5810, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5811, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5812, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5813, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5814, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5815, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5816, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5817, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5818, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5819, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x581a, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x581b, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x581c, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x581d, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x581e, 0x29}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x581f, 0x17}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5820, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5821, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5822, 0x15}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5823, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5824, 0x46}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5825, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5826, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5827, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5828, 0x64}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5829, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x582a, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x582b, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x582c, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x582d, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x582e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x582f, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5830, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5831, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5832, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5833, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5834, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5835, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5836, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5837, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5838, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5839, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x583a, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x583b, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x583c, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x583d, 0xce}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5025, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0f, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a10, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a1b, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a1e, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a11, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a1f, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3008, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c07, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x41}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x9b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x68}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3618, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x29}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x52}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370c, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a02, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a03, 0xd8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a08, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a09, 0x94}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0b, 0x7b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0d, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a14, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a15, 0xd8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4004, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3002, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4713, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3035, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3036, 0x46}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3824, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0xa3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4005, 0x1a}, - /* OV5640_g_svga */ - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a00, 0x7c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c07, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x41}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x9b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x68}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3618, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x29}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x52}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370c, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a02, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a03, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a08, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a09, 0x94}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0b, 0x7b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a0d, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a14, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3a15, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4004, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3002, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4713, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3035, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3036, 0x46}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3824, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0xa3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x503d, 0x80}, -}; - -/* ======================================================================== */ - -static struct ov_camera_module_config ov5640_configs[] = { - { - .name = "800x600_30fps", - .frm_fmt = { - .width = 800, - .height = 600, - .code = MEDIA_BUS_FMT_UYVY8_2X8 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov5640_init_tab_800_600_30fps, - .reg_table_num_entries = - sizeof(ov5640_init_tab_800_600_30fps) / - sizeof(ov5640_init_tab_800_600_30fps[0]), - .v_blanking_time_us = 1000, - PLTFRM_CAM_ITF_DVP_CFG( - PLTFRM_CAM_ITF_BT601_8, - PLTFRM_CAM_SIGNAL_LOW_LEVEL, - PLTFRM_CAM_SIGNAL_HIGH_LEVEL, - PLTFRM_CAM_SDR_NEG_EDG, - ov5640_EXT_CLK) - } -}; - -/*--------------------------------------------------------------------------*/ - -static int ov5640_g_VTS(struct ov_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ov_camera_module_pr_debug(cam_mod, "\n"); - ret = ov_camera_module_read_reg_table( - cam_mod, - ov5640_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_read_reg_table( - cam_mod, - ov5640_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - cam_mod->vts_cur = *vts; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov5640_auto_adjust_fps(struct ov_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - ov_camera_module_pr_debug(cam_mod, "\n"); - if ((cam_mod->exp_config.exp_time + ov5640_COARSE_INTG_TIME_MAX_MARGIN) - > cam_mod->vts_min) - vts = cam_mod->exp_config.exp_time + - ov5640_COARSE_INTG_TIME_MAX_MARGIN; - else - vts = cam_mod->vts_min; - ret = ov_camera_module_write_reg(cam_mod, - ov5640_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov5640_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_debug(cam_mod, - "updated vts = %d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov5640_write_aec(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "exp_time = %d, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if (cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY || - cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time; - - a_gain = a_gain > 0x7ff ? 0x7ff : a_gain; - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - exp_time = cam_mod->exp_config.exp_time << 4; - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - ret = ov_camera_module_write_reg(cam_mod, - ov5640_AEC_GROUP_UPDATE_ADDRESS, - ov5640_AEC_GROUP_UPDATE_START_DATA); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = ov5640_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - ret |= ov_camera_module_write_reg(cam_mod, - ov5640_AEC_PK_LONG_GAIN_HIGH_REG, - ov5640_FETCH_MSB_GAIN(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, - ov5640_AEC_PK_LONG_GAIN_LOW_REG, - ov5640_FETCH_LSB_GAIN(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, - ov5640_AEC_PK_LONG_EXPO_3RD_REG, - ov5640_FETCH_3RD_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov5640_AEC_PK_LONG_EXPO_2ND_REG, - ov5640_FETCH_2ND_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov5640_AEC_PK_LONG_EXPO_1ST_REG, - ov5640_FETCH_1ST_BYTE_EXP(exp_time)); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - ret = ov_camera_module_write_reg(cam_mod, - ov5640_AEC_GROUP_UPDATE_ADDRESS, - ov5640_AEC_GROUP_UPDATE_END_DATA); - ret |= ov_camera_module_write_reg(cam_mod, - ov5640_AEC_GROUP_UPDATE_ADDRESS, - ov5640_AEC_GROUP_UPDATE_END_LAUNCH); - } - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov5640_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov5640_filltimings(struct ov_camera_module_custom_config *custom) -{ - int i, j; - struct ov_camera_module_config *config; - struct ov_camera_module_timings *timings; - struct ov_camera_module_reg *reg_table; - int reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - memset(timings, 0x00, sizeof(*timings)); - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case ov5640_TIMING_VTS_HIGH_REG: - timings->frame_length_lines = - ((reg_table[j].val << 8) | - (timings->frame_length_lines & 0xff)); - break; - case ov5640_TIMING_VTS_LOW_REG: - timings->frame_length_lines = - (reg_table[j].val | - (timings->frame_length_lines & 0xff00)); - break; - case ov5640_TIMING_HTS_HIGH_REG: - timings->line_length_pck = - ((reg_table[j].val << 8) | - timings->line_length_pck); - break; - case ov5640_TIMING_HTS_LOW_REG: - timings->line_length_pck = - (reg_table[j].val | - (timings->line_length_pck & 0xff00)); - break; - case ov5640_TIMING_X_INC: - timings->binning_factor_x = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_x == 0) - timings->binning_factor_x = 1; - break; - case ov5640_TIMING_Y_INC: - timings->binning_factor_y = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_y == 0) - timings->binning_factor_y = 1; - break; - case ov5640_HORIZONTAL_START_HIGH_REG: - timings->crop_horizontal_start = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_start & - 0xff)); - break; - case ov5640_HORIZONTAL_START_LOW_REG: - timings->crop_horizontal_start = - (reg_table[j].val | - (timings->crop_horizontal_start & - 0xff00)); - break; - case ov5640_VERTICAL_START_HIGH_REG: - timings->crop_vertical_start = - ((reg_table[j].val << 8) | - (timings->crop_vertical_start & 0xff)); - break; - case ov5640_VERTICAL_START_LOW_REG: - timings->crop_vertical_start = - ((reg_table[j].val) | - (timings->crop_vertical_start & - 0xff00)); - break; - case ov5640_HORIZONTAL_END_HIGH_REG: - timings->crop_horizontal_end = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_end & 0xff)); - break; - case ov5640_HORIZONTAL_END_LOW_REG: - timings->crop_horizontal_end = - (reg_table[j].val | - (timings->crop_horizontal_end & - 0xff00)); - break; - case ov5640_VERTICAL_END_HIGH_REG: - timings->crop_vertical_end = - ((reg_table[j].val << 8) | - (timings->crop_vertical_end & 0xff)); - break; - case ov5640_VERTICAL_END_LOW_REG: - timings->crop_vertical_end = - (reg_table[j].val | - (timings->crop_vertical_end & 0xff00)); - break; - case ov5640_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - ((reg_table[j].val << 8) | - (timings->sensor_output_width & 0xff)); - break; - case ov5640_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width = - (reg_table[j].val | - (timings->sensor_output_width & - 0xff00)); - break; - case ov5640_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - ((reg_table[j].val << 8) | - (timings->sensor_output_height & 0xff)); - break; - case ov5640_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height = - (reg_table[j].val | - (timings->sensor_output_height & - 0xff00)); - break; - case ov5640_AEC_PK_LONG_EXPO_1ST_REG: - timings->exp_time = - ((reg_table[j].val) | - (timings->exp_time & 0xffff00)); - break; - case ov5640_AEC_PK_LONG_EXPO_2ND_REG: - timings->exp_time = - ((reg_table[j].val << 8) | - (timings->exp_time & 0x00ff00)); - break; - case ov5640_AEC_PK_LONG_EXPO_3RD_REG: - timings->exp_time = - (((reg_table[j].val & 0x0f) << 16) | - (timings->exp_time & 0xff0000)); - break; - case ov5640_AEC_PK_LONG_GAIN_LOW_REG: - timings->gain = - (reg_table[j].val | - (timings->gain & 0x0700)); - break; - case ov5640_AEC_PK_LONG_GAIN_HIGH_REG: - timings->gain = - (((reg_table[j].val & 0x07) << 8) | - (timings->gain & 0xff)); - break; - } - } - - timings->exp_time >>= 4; - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator - * timings->frame_length_lines - * timings->line_length_pck; - - timings->coarse_integration_time_min = - ov5640_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - ov5640_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = - ov5640_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - ov5640_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -static int ov5640_g_timings(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - ov_camera_module_pr_debug(cam_mod, "\n"); - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - - return ret; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov5640_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = ov5640_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d) 0x%x\n", ret, ctrl_id); - return ret; -} - -static int ov5640_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - /* Handles only exposure and gain together special case. */ - if (ctrls->count == 1) - ret = ov5640_s_ctrl(cam_mod, ctrls->ctrls[0].id); - else if ((ctrls->count == 3) && - ((ctrls->ctrls[0].id == V4L2_CID_GAIN && - ctrls->ctrls[1].id == V4L2_CID_EXPOSURE) || - (ctrls->ctrls[1].id == V4L2_CID_GAIN && - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE))) - ret = ov5640_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov5640_set_flip( - struct ov_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - int i, mode = 0; - u16 match_reg[2]; - - ov_camera_module_pr_debug(cam_mod, "\n"); - mode = ov_camera_module_get_flip_mirror(cam_mod); - if (mode == -1) { - ov_camera_module_pr_info(cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - switch (cam_mod->active_config->frm_fmt.width) { - case ov5640_FULL_SIZE_RESOLUTION_WIDTH: - if (mode == OV_FLIP_BIT_MASK) { - match_reg[0] = 0x06; - match_reg[1] = 0x00; - } else if (mode == OV_MIRROR_BIT_MASK) { - match_reg[0] = 0x00; - match_reg[1] = 0x06; - } else if (mode == (OV_MIRROR_BIT_MASK | - OV_FLIP_BIT_MASK)) { - match_reg[0] = 0x06; - match_reg[1] = 0x06; - } else { - match_reg[0] = 0x00; - match_reg[1] = 0x00; - } - break; - default: - return 0; - } - - for (i = len; i > 0; i--) { - if (reglist[i].reg == ov5640_FLIP_REG) - reglist[i].val = match_reg[0]; - else if (reglist[i].reg == ov5640_MIRROR_REG) - reglist[i].val = match_reg[1]; - } - } - - return 0; -} - -static int ov5640_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret |= ov_camera_module_read_reg(cam_mod, 1, ov5640_PIDH_ADDR, &pidh); - ret |= ov_camera_module_read_reg(cam_mod, 1, ov5640_PIDL_ADDR, &pidl); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if (pidh == ov5640_PIDH_MAGIC && pidl == ov5640_PIDL_MAGIC) { - ov_camera_module_pr_debug(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - } else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - ov5640_PIDH_MAGIC, ov5640_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -static int ov5640_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret = ov5640_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -static int ov5640_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 0x00); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ -static struct v4l2_subdev_core_ops ov5640_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops ov5640_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops ov5640_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops ov5640_camera_module_ops = { - .core = &ov5640_camera_module_core_ops, - .video = &ov5640_camera_module_video_ops, - .pad = &ov5640_camera_module_pad_ops -}; - -static struct ov_camera_module_custom_config ov5640_custom_config = { - .start_streaming = ov5640_start_streaming, - .stop_streaming = ov5640_stop_streaming, - .s_ctrl = ov5640_s_ctrl, - .s_ext_ctrls = ov5640_s_ext_ctrls, - .g_ctrl = ov5640_g_ctrl, - .s_vts = ov5640_auto_adjust_fps, - .g_timings = ov5640_g_timings, - .check_camera_id = ov5640_check_camera_id, - .set_flip = ov5640_set_flip, - .configs = ov5640_configs, - .num_configs = ARRAY_SIZE(ov5640_configs), - .power_up_delays_ms = {20, 20, 0} - -}; - -static int ov5640_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - ov5640_filltimings(&ov5640_custom_config); - v4l2_i2c_subdev_init(&ov5640.sd, client, &ov5640_camera_module_ops); - - ov5640.custom = ov5640_custom_config; - - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -static int ov5640_remove(struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - ov_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id ov5640_id[] = { - { ov5640_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id ov5640_of_match[] = { - {.compatible = "omnivision,ov5640-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, ov5640_id); - -static struct i2c_driver ov5640_i2c_driver = { - .driver = { - .name = ov5640_DRIVER_NAME, - .of_match_table = ov5640_of_match - }, - .probe = ov5640_probe, - .remove = ov5640_remove, - .id_table = ov5640_id, -}; - -module_i2c_driver(ov5640_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for ov5640"); -MODULE_AUTHOR("George"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/ov7675_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/ov7675_v4l2-i2c-subdev.c deleted file mode 100644 index b4559fe4f198..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov7675_v4l2-i2c-subdev.c +++ /dev/null @@ -1,574 +0,0 @@ -/* - * ov7675 sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" - -#define OV7675_CAMERA_MODULE_DATA (PLTFRM_CAMERA_MODULE_WR_SINGLE | \ -PLTFRM_CAMERA_MODULE_RD_CONTINUE | PLTFRM_CAMERA_MODULE_REG1_TYPE_DATA1) - -#define ov7675_DRIVER_NAME "ov7675" - -#define ov7675_PIDH_ADDR 0x0a -#define ov7675_PIDL_ADDR 0x0b - -#define ov7675_EXT_CLK 24000000 -/* High byte of product ID */ -#define ov7675_PIDH_MAGIC 0x76 -/* Low byte of product ID */ -#define ov7675_PIDL_MAGIC 0x73 - -static struct ov_camera_module ov7675; -static struct ov_camera_module_custom_config ov7675_custom_config; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ -static struct ov_camera_module_reg ov7675_init_tab_640_480_30fps[] = { - {OV7675_CAMERA_MODULE_DATA, 0x12, 0x80}, - {OV7675_CAMERA_MODULE_DATA, 0x09, 0x10}, - {OV7675_CAMERA_MODULE_DATA, 0xc1, 0x7f}, - {OV7675_CAMERA_MODULE_DATA, 0x11, 0x80}, - {OV7675_CAMERA_MODULE_DATA, 0x3a, 0x0c}, - {OV7675_CAMERA_MODULE_DATA, 0x3d, 0xc0}, - {OV7675_CAMERA_MODULE_DATA, 0x12, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x15, 0x40}, - {OV7675_CAMERA_MODULE_DATA, 0x17, 0x13}, - {OV7675_CAMERA_MODULE_DATA, 0x18, 0x01}, - {OV7675_CAMERA_MODULE_DATA, 0x32, 0xbf}, - {OV7675_CAMERA_MODULE_DATA, 0x19, 0x02}, - {OV7675_CAMERA_MODULE_DATA, 0x1a, 0x7a}, - {OV7675_CAMERA_MODULE_DATA, 0x03, 0x0a}, - {OV7675_CAMERA_MODULE_DATA, 0x0c, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x3e, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x70, 0x3a}, - {OV7675_CAMERA_MODULE_DATA, 0x71, 0x35}, - {OV7675_CAMERA_MODULE_DATA, 0x72, 0x11}, - {OV7675_CAMERA_MODULE_DATA, 0x73, 0xf0}, - {OV7675_CAMERA_MODULE_DATA, 0xa2, 0x02}, - {OV7675_CAMERA_MODULE_DATA, 0x7a, 0x20}, - {OV7675_CAMERA_MODULE_DATA, 0x7b, 0x03}, - {OV7675_CAMERA_MODULE_DATA, 0x7c, 0x0a}, - {OV7675_CAMERA_MODULE_DATA, 0x7d, 0x1a}, - {OV7675_CAMERA_MODULE_DATA, 0x7e, 0x3f}, - {OV7675_CAMERA_MODULE_DATA, 0x7f, 0x4e}, - {OV7675_CAMERA_MODULE_DATA, 0x80, 0x5b}, - {OV7675_CAMERA_MODULE_DATA, 0x81, 0x68}, - {OV7675_CAMERA_MODULE_DATA, 0x82, 0x75}, - {OV7675_CAMERA_MODULE_DATA, 0x83, 0x7f}, - {OV7675_CAMERA_MODULE_DATA, 0x84, 0x89}, - {OV7675_CAMERA_MODULE_DATA, 0x85, 0x9a}, - {OV7675_CAMERA_MODULE_DATA, 0x86, 0xa6}, - {OV7675_CAMERA_MODULE_DATA, 0x87, 0xbd}, - {OV7675_CAMERA_MODULE_DATA, 0x88, 0xd3}, - {OV7675_CAMERA_MODULE_DATA, 0x89, 0xe8}, - {OV7675_CAMERA_MODULE_DATA, 0x13, 0xe0}, - {OV7675_CAMERA_MODULE_DATA, 0x00, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x10, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x0d, 0x40}, - {OV7675_CAMERA_MODULE_DATA, 0x14, 0x28}, - {OV7675_CAMERA_MODULE_DATA, 0xa5, 0x02}, - {OV7675_CAMERA_MODULE_DATA, 0xab, 0x02}, - {OV7675_CAMERA_MODULE_DATA, 0x24, 0x68}, - {OV7675_CAMERA_MODULE_DATA, 0x25, 0x58}, - {OV7675_CAMERA_MODULE_DATA, 0x26, 0xc2}, - {OV7675_CAMERA_MODULE_DATA, 0x9f, 0x78}, - {OV7675_CAMERA_MODULE_DATA, 0xa0, 0x68}, - {OV7675_CAMERA_MODULE_DATA, 0xa1, 0x03}, - {OV7675_CAMERA_MODULE_DATA, 0xa6, 0xd8}, - {OV7675_CAMERA_MODULE_DATA, 0xa7, 0xd8}, - {OV7675_CAMERA_MODULE_DATA, 0xa8, 0xf0}, - {OV7675_CAMERA_MODULE_DATA, 0xa9, 0x90}, - {OV7675_CAMERA_MODULE_DATA, 0xaa, 0x14}, - {OV7675_CAMERA_MODULE_DATA, 0x13, 0xe5}, - {OV7675_CAMERA_MODULE_DATA, 0x0e, 0x61}, - {OV7675_CAMERA_MODULE_DATA, 0x0f, 0x4b}, - {OV7675_CAMERA_MODULE_DATA, 0x16, 0x02}, - {OV7675_CAMERA_MODULE_DATA, 0x1e, 0x07}, - {OV7675_CAMERA_MODULE_DATA, 0x21, 0x02}, - {OV7675_CAMERA_MODULE_DATA, 0x22, 0x91}, - {OV7675_CAMERA_MODULE_DATA, 0x29, 0x07}, - {OV7675_CAMERA_MODULE_DATA, 0x33, 0x0b}, - {OV7675_CAMERA_MODULE_DATA, 0x35, 0x0b}, - {OV7675_CAMERA_MODULE_DATA, 0x37, 0x1d}, - {OV7675_CAMERA_MODULE_DATA, 0x38, 0x71}, - {OV7675_CAMERA_MODULE_DATA, 0x39, 0x2a}, - {OV7675_CAMERA_MODULE_DATA, 0x3c, 0x78}, - {OV7675_CAMERA_MODULE_DATA, 0x4d, 0x40}, - {OV7675_CAMERA_MODULE_DATA, 0x4e, 0x20}, - {OV7675_CAMERA_MODULE_DATA, 0x69, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x6b, 0x0a}, - {OV7675_CAMERA_MODULE_DATA, 0x74, 0x10}, - {OV7675_CAMERA_MODULE_DATA, 0x8d, 0x4f}, - {OV7675_CAMERA_MODULE_DATA, 0x8e, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x8f, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x90, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x91, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x96, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x9a, 0x80}, - {OV7675_CAMERA_MODULE_DATA, 0xb0, 0x84}, - {OV7675_CAMERA_MODULE_DATA, 0xb1, 0x0c}, - {OV7675_CAMERA_MODULE_DATA, 0xb2, 0x0e}, - {OV7675_CAMERA_MODULE_DATA, 0xb3, 0x82}, - {OV7675_CAMERA_MODULE_DATA, 0xb8, 0x0a}, - {OV7675_CAMERA_MODULE_DATA, 0x43, 0x0a}, - {OV7675_CAMERA_MODULE_DATA, 0x44, 0xf2}, - {OV7675_CAMERA_MODULE_DATA, 0x45, 0x39}, - {OV7675_CAMERA_MODULE_DATA, 0x46, 0x62}, - {OV7675_CAMERA_MODULE_DATA, 0x47, 0x3d}, - {OV7675_CAMERA_MODULE_DATA, 0x48, 0x55}, - {OV7675_CAMERA_MODULE_DATA, 0x59, 0x83}, - {OV7675_CAMERA_MODULE_DATA, 0x5a, 0x0d}, - {OV7675_CAMERA_MODULE_DATA, 0x5b, 0xcd}, - {OV7675_CAMERA_MODULE_DATA, 0x5c, 0x8c}, - {OV7675_CAMERA_MODULE_DATA, 0x5d, 0x77}, - {OV7675_CAMERA_MODULE_DATA, 0x5e, 0x16}, - {OV7675_CAMERA_MODULE_DATA, 0x6c, 0x0a}, - {OV7675_CAMERA_MODULE_DATA, 0x6d, 0x65}, - {OV7675_CAMERA_MODULE_DATA, 0x6e, 0x11}, - {OV7675_CAMERA_MODULE_DATA, 0x6f, 0x9e}, - {OV7675_CAMERA_MODULE_DATA, 0x6a, 0x40}, - {OV7675_CAMERA_MODULE_DATA, 0x01, 0x56}, - {OV7675_CAMERA_MODULE_DATA, 0x02, 0x44}, - {OV7675_CAMERA_MODULE_DATA, 0x13, 0xe7}, - {OV7675_CAMERA_MODULE_DATA, 0x4f, 0x88}, - {OV7675_CAMERA_MODULE_DATA, 0x50, 0x8b}, - {OV7675_CAMERA_MODULE_DATA, 0x51, 0x04}, - {OV7675_CAMERA_MODULE_DATA, 0x52, 0x11}, - {OV7675_CAMERA_MODULE_DATA, 0x53, 0x8c}, - {OV7675_CAMERA_MODULE_DATA, 0x54, 0x9d}, - {OV7675_CAMERA_MODULE_DATA, 0x55, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x56, 0x40}, - {OV7675_CAMERA_MODULE_DATA, 0x57, 0x80}, - {OV7675_CAMERA_MODULE_DATA, 0x58, 0x9a}, - {OV7675_CAMERA_MODULE_DATA, 0x41, 0x08}, - {OV7675_CAMERA_MODULE_DATA, 0x3f, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x75, 0x04}, - {OV7675_CAMERA_MODULE_DATA, 0x76, 0x60}, - {OV7675_CAMERA_MODULE_DATA, 0x4c, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x77, 0x01}, - {OV7675_CAMERA_MODULE_DATA, 0x3d, 0xc2}, - {OV7675_CAMERA_MODULE_DATA, 0x4b, 0x09}, - {OV7675_CAMERA_MODULE_DATA, 0xc9, 0x30}, - {OV7675_CAMERA_MODULE_DATA, 0x41, 0x38}, - {OV7675_CAMERA_MODULE_DATA, 0x56, 0x40}, - {OV7675_CAMERA_MODULE_DATA, 0x34, 0x11}, - {OV7675_CAMERA_MODULE_DATA, 0x3b, 0x12}, - {OV7675_CAMERA_MODULE_DATA, 0xa4, 0x88}, - {OV7675_CAMERA_MODULE_DATA, 0x96, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x97, 0x30}, - {OV7675_CAMERA_MODULE_DATA, 0x98, 0x20}, - {OV7675_CAMERA_MODULE_DATA, 0x99, 0x30}, - {OV7675_CAMERA_MODULE_DATA, 0x9a, 0x84}, - {OV7675_CAMERA_MODULE_DATA, 0x9b, 0x29}, - {OV7675_CAMERA_MODULE_DATA, 0x9c, 0x03}, - {OV7675_CAMERA_MODULE_DATA, 0x9d, 0x99}, - {OV7675_CAMERA_MODULE_DATA, 0x9e, 0x7f}, - {OV7675_CAMERA_MODULE_DATA, 0x78, 0x04}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x01}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0xf0}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x0f}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x10}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0x7e}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x0a}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0x80}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x0b}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0x01}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x0c}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0x0f}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x0d}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0x20}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x09}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0x80}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x02}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0xc0}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x03}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0x40}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x05}, - {OV7675_CAMERA_MODULE_DATA, 0xc8, 0x30}, - {OV7675_CAMERA_MODULE_DATA, 0x79, 0x26}, - {OV7675_CAMERA_MODULE_DATA, 0x62, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x63, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x64, 0x06}, - {OV7675_CAMERA_MODULE_DATA, 0x65, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x66, 0x05}, - {OV7675_CAMERA_MODULE_DATA, 0x94, 0x05}, - {OV7675_CAMERA_MODULE_DATA, 0x95, 0x09}, - {OV7675_CAMERA_MODULE_DATA, 0x2a, 0x10}, - {OV7675_CAMERA_MODULE_DATA, 0x2b, 0xc2}, - {OV7675_CAMERA_MODULE_DATA, 0x15, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x3a, 0x04}, - {OV7675_CAMERA_MODULE_DATA, 0x3d, 0xc3}, - {OV7675_CAMERA_MODULE_DATA, 0x19, 0x03}, - {OV7675_CAMERA_MODULE_DATA, 0x1a, 0x7b}, - {OV7675_CAMERA_MODULE_DATA, 0x2a, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x2b, 0x00}, - {OV7675_CAMERA_MODULE_DATA, 0x18, 0x01}, - {OV7675_CAMERA_MODULE_DATA, 0x66, 0x05}, - {OV7675_CAMERA_MODULE_DATA, 0x62, 0x10}, - {OV7675_CAMERA_MODULE_DATA, 0x63, 0x0b}, - {OV7675_CAMERA_MODULE_DATA, 0x65, 0x07}, - {OV7675_CAMERA_MODULE_DATA, 0x64, 0x0f}, - {OV7675_CAMERA_MODULE_DATA, 0x94, 0x0e}, - {OV7675_CAMERA_MODULE_DATA, 0x95, 0x10}, - {OV7675_CAMERA_MODULE_DATA, 0x4f, 0x87}, - {OV7675_CAMERA_MODULE_DATA, 0x50, 0x68}, - {OV7675_CAMERA_MODULE_DATA, 0x51, 0x1e}, - {OV7675_CAMERA_MODULE_DATA, 0x52, 0x15}, - {OV7675_CAMERA_MODULE_DATA, 0x53, 0x7c}, - {OV7675_CAMERA_MODULE_DATA, 0x54, 0x91}, - {OV7675_CAMERA_MODULE_DATA, 0x58, 0x1e}, - {OV7675_CAMERA_MODULE_DATA, 0x41, 0x38}, - {OV7675_CAMERA_MODULE_DATA, 0x76, 0xe0}, - {OV7675_CAMERA_MODULE_DATA, 0x24, 0x40}, - {OV7675_CAMERA_MODULE_DATA, 0x25, 0x38}, - {OV7675_CAMERA_MODULE_DATA, 0x26, 0x91}, - {OV7675_CAMERA_MODULE_DATA, 0x7a, 0x09}, - {OV7675_CAMERA_MODULE_DATA, 0x7b, 0x0c}, - {OV7675_CAMERA_MODULE_DATA, 0x7c, 0x16}, - {OV7675_CAMERA_MODULE_DATA, 0x7d, 0x28}, - {OV7675_CAMERA_MODULE_DATA, 0x7e, 0x48}, - {OV7675_CAMERA_MODULE_DATA, 0x7f, 0x57}, - {OV7675_CAMERA_MODULE_DATA, 0x80, 0x64}, - {OV7675_CAMERA_MODULE_DATA, 0x81, 0x71}, - {OV7675_CAMERA_MODULE_DATA, 0x82, 0x7e}, - {OV7675_CAMERA_MODULE_DATA, 0x83, 0x89}, - {OV7675_CAMERA_MODULE_DATA, 0x84, 0x94}, - {OV7675_CAMERA_MODULE_DATA, 0x85, 0xa8}, - {OV7675_CAMERA_MODULE_DATA, 0x86, 0xba}, - {OV7675_CAMERA_MODULE_DATA, 0x87, 0xd7}, - {OV7675_CAMERA_MODULE_DATA, 0x88, 0xec}, - {OV7675_CAMERA_MODULE_DATA, 0x89, 0xf9}, - {OV7675_CAMERA_MODULE_DATA, 0x09, 0x00}, -}; - -/* ======================================================================== */ - -static struct ov_camera_module_config ov7675_configs[] = { - { - .name = "640x480_30fps", - .frm_fmt = { - .width = 640, - .height = 480, - .code = MEDIA_BUS_FMT_YVYU8_2X8 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov7675_init_tab_640_480_30fps, - .reg_table_num_entries = - sizeof(ov7675_init_tab_640_480_30fps) / - sizeof(ov7675_init_tab_640_480_30fps[0]), - .v_blanking_time_us = 1000, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_DVP_CFG( - PLTFRM_CAM_ITF_BT601_8, - PLTFRM_CAM_SIGNAL_HIGH_LEVEL, - PLTFRM_CAM_SIGNAL_HIGH_LEVEL, - PLTFRM_CAM_SDR_POS_EDG, - ov7675_EXT_CLK) - } -}; - -/*--------------------------------------------------------------------------*/ - -static int ov7675_write_aec(struct ov_camera_module *cam_mod) -{ - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int ov7675_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_info(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov7675_filltimings(struct ov_camera_module_custom_config *custom) -{ - return 0; -} - -static int ov7675_g_timings(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings) -{ - return 0; -} - -static int ov7675_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_info(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = ov7675_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d) 0x%x\n", ret, ctrl_id); - return ret; -} - -static int ov7675_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - ov_camera_module_pr_info(cam_mod, "\n"); - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = ov7675_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov7675_set_flip( - struct ov_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - return 0; -} - -static int ov7675_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - ov_camera_module_pr_info(cam_mod, "\n"); - ret |= pltfrm_camera_module_read_reg_ex(&cam_mod->sd, 1, - OV7675_CAMERA_MODULE_DATA, ov7675_PIDH_ADDR, &pidh); - ret |= pltfrm_camera_module_read_reg_ex(&cam_mod->sd, 1, - OV7675_CAMERA_MODULE_DATA, ov7675_PIDL_ADDR, &pidl); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if ((pidh == ov7675_PIDH_MAGIC) && (pidl == ov7675_PIDL_MAGIC)) { - ov_camera_module_pr_info(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - } else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - ov7675_PIDH_MAGIC, ov7675_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -static int ov7675_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret = pltfrm_camera_module_write_reg_ex(&cam_mod->sd, - OV7675_CAMERA_MODULE_DATA, 0x09, 0); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -static int ov7675_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret = pltfrm_camera_module_write_reg_ex(&cam_mod->sd, - OV7675_CAMERA_MODULE_DATA, 0x09, 10); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ -static struct v4l2_subdev_core_ops ov7675_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops ov7675_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .g_frame_interval = ov_camera_module_g_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops ov7675_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops ov7675_camera_module_ops = { - .core = &ov7675_camera_module_core_ops, - .video = &ov7675_camera_module_video_ops, - .pad = &ov7675_camera_module_pad_ops -}; - -static struct ov_camera_module_custom_config ov7675_custom_config = { - .start_streaming = ov7675_start_streaming, - .stop_streaming = ov7675_stop_streaming, - .s_ctrl = ov7675_s_ctrl, - .s_ext_ctrls = ov7675_s_ext_ctrls, - .g_ctrl = ov7675_g_ctrl, - .g_timings = ov7675_g_timings, - .check_camera_id = ov7675_check_camera_id, - .set_flip = ov7675_set_flip, - .configs = ov7675_configs, - .num_configs = ARRAY_SIZE(ov7675_configs), - .power_up_delays_ms = {20, 20, 0}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static int ov7675_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - ov7675_filltimings(&ov7675_custom_config); - v4l2_i2c_subdev_init(&ov7675.sd, client, &ov7675_camera_module_ops); - - ov7675.custom = ov7675_custom_config; - - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -static int ov7675_remove(struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - ov_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id ov7675_id[] = { - { ov7675_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id ov7675_of_match[] = { - {.compatible = "omnivision,ov7675-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, ov7675_id); - -static struct i2c_driver ov7675_i2c_driver = { - .driver = { - .name = ov7675_DRIVER_NAME, - .of_match_table = ov7675_of_match - }, - .probe = ov7675_probe, - .remove = ov7675_remove, - .id_table = ov7675_id, -}; - -module_i2c_driver(ov7675_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for ov7675"); -MODULE_AUTHOR("George"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/ov7750_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/ov7750_v4l2-i2c-subdev.c deleted file mode 100644 index 6d396bbf3efe..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov7750_v4l2-i2c-subdev.c +++ /dev/null @@ -1,1007 +0,0 @@ -/* - * drivers/media/i2c/soc_camera/rockchip/ov7750_v4l2-i2c-subdev.c - * - * ov7750 sensor driver - * - * Copyright (C) 2017 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" - -/***************************************************************************** - * DEFINES - *****************************************************************************/ -#define ov7750_DRIVER_NAME "ov7750" - -#define ov7750_FETCH_LSB_GAIN(VAL) ((VAL) & 0x00ff) -#define ov7750_FETCH_MSB_GAIN(VAL) (((VAL) >> 8) & 0xff) -#define ov7750_AEC_PK_LONG_GAIN_HIGH_REG 0x3508 /* Bit 6-13 */ -#define ov7750_AEC_PK_LONG_GAIN_LOW_REG 0x3509 /* Bits 0 -5 */ - -#define ov7750_AEC_PK_LONG_EXPO_3RD_REG 0x3500 /* Exposure Bits 16-19 */ -#define ov7750_AEC_PK_LONG_EXPO_2ND_REG 0x3501 /* Exposure Bits 8-15 */ -#define ov7750_AEC_PK_LONG_EXPO_1ST_REG 0x3502 /* Exposure Bits 0-7 */ - -#define ov7750_AEC_GROUP_UPDATE_ADDRESS 0x3208 -#define ov7750_AEC_GROUP_UPDATE_START_DATA 0x00 -#define ov7750_AEC_GROUP_UPDATE_END_DATA 0x10 -#define ov7750_AEC_GROUP_UPDATE_END_LAUNCH 0xA0 - -#define ov7750_FETCH_3RD_BYTE_EXP(VAL) (((VAL) >> 16) & 0xF) /* 4 Bits */ -#define ov7750_FETCH_2ND_BYTE_EXP(VAL) (((VAL) >> 8) & 0xFF) /* 8 Bits */ -#define ov7750_FETCH_1ST_BYTE_EXP(VAL) ((VAL) & 0xFF) /* 8 Bits */ - -#define ov7750_PIDH_ADDR 0x300A -#define ov7750_PIDL_ADDR 0x300B - -#define ov7750_TIMING_VTS_HIGH_REG 0x380e -#define ov7750_TIMING_VTS_LOW_REG 0x380f -#define ov7750_TIMING_HTS_HIGH_REG 0x380c -#define ov7750_TIMING_HTS_LOW_REG 0x380d -#define ov7750_INTEGRATION_TIME_MARGIN 8 -#define ov7750_FINE_INTG_TIME_MIN 0 -#define ov7750_FINE_INTG_TIME_MAX_MARGIN 0 -#define ov7750_COARSE_INTG_TIME_MIN 16 -#define ov7750_COARSE_INTG_TIME_MAX_MARGIN 4 -#define ov7750_TIMING_X_INC 0x3814 -#define ov7750_TIMING_Y_INC 0x3815 -#define ov7750_HORIZONTAL_START_HIGH_REG 0x3800 -#define ov7750_HORIZONTAL_START_LOW_REG 0x3801 -#define ov7750_VERTICAL_START_HIGH_REG 0x3802 -#define ov7750_VERTICAL_START_LOW_REG 0x3803 -#define ov7750_HORIZONTAL_END_HIGH_REG 0x3804 -#define ov7750_HORIZONTAL_END_LOW_REG 0x3805 -#define ov7750_VERTICAL_END_HIGH_REG 0x3806 -#define ov7750_VERTICAL_END_LOW_REG 0x3807 -#define ov7750_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3808 -#define ov7750_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3809 -#define ov7750_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x380a -#define ov7750_VERTICAL_OUTPUT_SIZE_LOW_REG 0x380b -#define ov7750_FLIP_REG 0x3820 -#define ov7750_MIRROR_REG 0x3821 - -#define ov7750_EXT_CLK 26000000 -#define ov7750_FULL_SIZE_RESOLUTION_WIDTH 3264 -#define ov7750_BINING_SIZE_RESOLUTION_WIDTH 1632 -#define ov7750_VIDEO_SIZE_RESOLUTION_WIDTH 3200 - -#define ov7750_EXP_VALID_FRAMES 4 -/* High byte of product ID */ -#define ov7750_PIDH_MAGIC 0x77 -/* Low byte of product ID */ -#define ov7750_PIDL_MAGIC 0x50 - -#define BG_RATIO_TYPICAL 0x129 -#define RG_RATIO_TYPICAL 0x11f - -static struct ov_camera_module ov7750; -static struct ov_camera_module_custom_config ov7750_custom_config; - -/***************************************************************************** - * GLOBALS - *****************************************************************************/ - -// Image sensor register settings default values taken from -// data sheet OV7750A_DS_1.1_SiliconImage.pdf. - -// The settings may be altered by the code in IsiSetupSensor. -static struct ov_camera_module_reg ov7750_init_tab_640_480_60fps[] = { - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0103, 0x01},// enable soft reset - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00},// stream off - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3005, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3012, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0xd2}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3014, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3016, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3017, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3023, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3037, 0xf0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3098, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3099, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x309a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x309b, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x30b0, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x30b1, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x30b3, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x30b4, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x30b5, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0xda}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x1f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350b, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x62}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3620, 0xb7}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3622, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3626, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3627, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3630, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3631, 0x35}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3634, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3662, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3663, 0x70}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3664, 0xf0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3666, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3669, 0x1a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366b, 0x50}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3673, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3674, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3675, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0xc1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373c, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3742, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3757, 0xb3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3788, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a8, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a9, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x8b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0xeb}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0xe0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x1a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382f, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3832, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3833, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3834, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3835, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x38b1, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b80, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b81, 0xa5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b82, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b83, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b84, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b85, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b86, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b87, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b88, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b89, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b8a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b8b, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b8c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b8d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b8e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b8f, 0x1a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b94, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b95, 0xf2}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b96, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c00, 0x89}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c01, 0x63}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c02, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c03, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c04, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c05, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c06, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c07, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0c, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0d, 0xd0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0e, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0f, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4004, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4005, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x404e, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4241, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4242, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4300, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4501, 0x48}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4600, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x4e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4801, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4806, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4819, 0xaa}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4823, 0x3e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4a0d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4a47, 0x7f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4a49, 0xf0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4a4b, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x85}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x1f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350b, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x1c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x62}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3620, 0xb7}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3622, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3626, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3627, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3630, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3631, 0x35}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3634, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3662, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3663, 0x70}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3664, 0xf0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3666, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3669, 0x1a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366b, 0x50}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3673, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3674, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3675, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0xc1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373c, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3742, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3757, 0xb3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3788, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a8, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a9, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x8b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0xeb}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0xe0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x1a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382f, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3832, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3833, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3834, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3835, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x00}, -}; - -static struct ov_camera_module_config ov7750_configs[] = { - { - .name = "640x480_60fps", - .frm_fmt = { - .width = 640, - .height = 480, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 60 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov7750_init_tab_640_480_60fps, - .reg_table_num_entries = - sizeof(ov7750_init_tab_640_480_60fps) / - sizeof(ov7750_init_tab_640_480_60fps[0]), - .reg_diff_table = NULL, - .reg_diff_table_num_entries = 0, - .v_blanking_time_us = 7251, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 1, 800, 24000000) - } -}; - -static int ov7750_g_VTS(struct ov_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = ov_camera_module_read_reg_table( - cam_mod, - ov7750_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_read_reg_table( - cam_mod, - ov7750_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - cam_mod->vts_cur = *vts; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov7750_auto_adjust_fps(struct ov_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - if ((exp_time + ov7750_COARSE_INTG_TIME_MAX_MARGIN) - > cam_mod->vts_min) - vts = exp_time + ov7750_COARSE_INTG_TIME_MAX_MARGIN; - else - vts = cam_mod->vts_min; - ret = ov_camera_module_write_reg(cam_mod, - ov7750_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov7750_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, - "updated vts = %d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int ov7750_set_vts(struct ov_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts < cam_mod->vts_min) - return ret; - - if (vts > 0xfff) - vts = 0xfff; - - ret = ov_camera_module_write_reg(cam_mod, - ov7750_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov7750_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, "updated vts=%d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - return ret; -} - -static int ov7750_write_aec(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "exp_time = %d, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if ((cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY) || - (cam_mod->state == OV_CAMERA_MODULE_STREAMING)) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time; - - a_gain = a_gain > 0x7ff ? 0x7ff : a_gain; - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - exp_time = cam_mod->exp_config.exp_time << 4; - - mutex_lock(&cam_mod->lock); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - ret = ov_camera_module_write_reg(cam_mod, - ov7750_AEC_GROUP_UPDATE_ADDRESS, - ov7750_AEC_GROUP_UPDATE_START_DATA); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = ov7750_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - ret |= ov_camera_module_write_reg(cam_mod, - ov7750_AEC_PK_LONG_GAIN_HIGH_REG, - ov7750_FETCH_MSB_GAIN(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, - ov7750_AEC_PK_LONG_GAIN_LOW_REG, - ov7750_FETCH_LSB_GAIN(a_gain)); - ret = ov_camera_module_write_reg(cam_mod, - ov7750_AEC_PK_LONG_EXPO_3RD_REG, - ov7750_FETCH_3RD_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov7750_AEC_PK_LONG_EXPO_2ND_REG, - ov7750_FETCH_2ND_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov7750_AEC_PK_LONG_EXPO_1ST_REG, - ov7750_FETCH_1ST_BYTE_EXP(exp_time)); - if (!cam_mod->auto_adjust_fps) - ret |= ov7750_set_vts(cam_mod, cam_mod->exp_config.vts_value); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - ret = ov_camera_module_write_reg(cam_mod, - ov7750_AEC_GROUP_UPDATE_ADDRESS, - ov7750_AEC_GROUP_UPDATE_END_DATA); - ret = ov_camera_module_write_reg(cam_mod, - ov7750_AEC_GROUP_UPDATE_ADDRESS, - ov7750_AEC_GROUP_UPDATE_END_LAUNCH); - } - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov7750_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov7750_filltimings(struct ov_camera_module_custom_config *custom) -{ - int i, j; - struct ov_camera_module_config *config; - struct ov_camera_module_timings *timings; - struct ov_camera_module_reg *reg_table; - int reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - memset(timings, 0x00, sizeof(*timings)); - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case ov7750_TIMING_VTS_HIGH_REG: - timings->frame_length_lines = - ((reg_table[j].val << 8) | - (timings->frame_length_lines & 0xff)); - break; - case ov7750_TIMING_VTS_LOW_REG: - timings->frame_length_lines = - (reg_table[j].val | - (timings->frame_length_lines & 0xff00)); - break; - case ov7750_TIMING_HTS_HIGH_REG: - timings->line_length_pck = - ((reg_table[j].val << 8) | - timings->line_length_pck); - break; - case ov7750_TIMING_HTS_LOW_REG: - timings->line_length_pck = - (reg_table[j].val | - (timings->line_length_pck & 0xff00)); - break; - case ov7750_TIMING_X_INC: - timings->binning_factor_x = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_x == 0) - timings->binning_factor_x = 1; - break; - case ov7750_TIMING_Y_INC: - timings->binning_factor_y = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_y == 0) - timings->binning_factor_y = 1; - break; - case ov7750_HORIZONTAL_START_HIGH_REG: - timings->crop_horizontal_start = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_start & - 0xff)); - break; - case ov7750_HORIZONTAL_START_LOW_REG: - timings->crop_horizontal_start = - (reg_table[j].val | - (timings->crop_horizontal_start & - 0xff00)); - break; - case ov7750_VERTICAL_START_HIGH_REG: - timings->crop_vertical_start = - ((reg_table[j].val << 8) | - (timings->crop_vertical_start & 0xff)); - break; - case ov7750_VERTICAL_START_LOW_REG: - timings->crop_vertical_start = - ((reg_table[j].val) | - (timings->crop_vertical_start & - 0xff00)); - break; - case ov7750_HORIZONTAL_END_HIGH_REG: - timings->crop_horizontal_end = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_end & 0xff)); - break; - case ov7750_HORIZONTAL_END_LOW_REG: - timings->crop_horizontal_end = - (reg_table[j].val | - (timings->crop_horizontal_end & - 0xff00)); - break; - case ov7750_VERTICAL_END_HIGH_REG: - timings->crop_vertical_end = - ((reg_table[j].val << 8) | - (timings->crop_vertical_end & 0xff)); - break; - case ov7750_VERTICAL_END_LOW_REG: - timings->crop_vertical_end = - (reg_table[j].val | - (timings->crop_vertical_end & 0xff00)); - break; - case ov7750_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - ((reg_table[j].val << 8) | - (timings->sensor_output_width & 0xff)); - break; - case ov7750_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width = - (reg_table[j].val | - (timings->sensor_output_width & - 0xff00)); - break; - case ov7750_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - ((reg_table[j].val << 8) | - (timings->sensor_output_height & 0xff)); - break; - case ov7750_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height = - (reg_table[j].val | - (timings->sensor_output_height & - 0xff00)); - break; - case ov7750_AEC_PK_LONG_EXPO_1ST_REG: - timings->exp_time = - ((reg_table[j].val) | - (timings->exp_time & 0xffff00)); - break; - case ov7750_AEC_PK_LONG_EXPO_2ND_REG: - timings->exp_time = - ((reg_table[j].val << 8) | - (timings->exp_time & 0x00ff00)); - break; - case ov7750_AEC_PK_LONG_EXPO_3RD_REG: - timings->exp_time = - (((reg_table[j].val & 0x0f) << 16) | - (timings->exp_time & 0xff0000)); - break; - case ov7750_AEC_PK_LONG_GAIN_LOW_REG: - timings->gain = - (reg_table[j].val | - (timings->gain & 0x0700)); - break; - case ov7750_AEC_PK_LONG_GAIN_HIGH_REG: - timings->gain = - (((reg_table[j].val & 0x07) << 8) | - (timings->gain & 0xff)); - break; - } - } - - timings->exp_time >>= 4; - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator - * timings->frame_length_lines - * timings->line_length_pck; - - timings->coarse_integration_time_min = - ov7750_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - ov7750_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = - ov7750_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - ov7750_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -static int ov7750_g_timings(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - - timings->frame_length_lines = vts; - return ret; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov7750_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = ov7750_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d) 0x%x\n", ret, ctrl_id); - return ret; -} - -static int ov7750_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = ov7750_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov7750_set_flip( - struct ov_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - int i, mode = 0; - u16 match_reg[2]; - - mode = ov_camera_module_get_flip_mirror(cam_mod); - if (mode == -1) { - ov_camera_module_pr_info(cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - switch (cam_mod->active_config->frm_fmt.width) { - case ov7750_FULL_SIZE_RESOLUTION_WIDTH: - if (mode == OV_FLIP_BIT_MASK) { - match_reg[0] = 0x06; - match_reg[1] = 0x00; - } else if (mode == OV_MIRROR_BIT_MASK) { - match_reg[0] = 0x00; - match_reg[1] = 0x06; - } else if (mode == (OV_MIRROR_BIT_MASK | - OV_FLIP_BIT_MASK)) { - match_reg[0] = 0x06; - match_reg[1] = 0x06; - } else { - match_reg[0] = 0x00; - match_reg[1] = 0x00; - } - break; - case ov7750_BINING_SIZE_RESOLUTION_WIDTH: - if (mode == OV_FLIP_BIT_MASK) { - match_reg[0] = 0x16; - match_reg[1] = 0x01; - } else if (mode == OV_MIRROR_BIT_MASK) { - match_reg[0] = 0x16; - match_reg[1] = 0x07; - } else if (mode == (OV_MIRROR_BIT_MASK | - OV_FLIP_BIT_MASK)) { - match_reg[0] = 0x16; - match_reg[1] = 0x07; - } else { - match_reg[0] = 0x10; - match_reg[1] = 0x01; - } - break; - default: - return 0; - } - - for (i = len; i > 0; i--) { - if (reglist[i].reg == ov7750_FLIP_REG) - reglist[i].val = match_reg[0]; - else if (reglist[i].reg == ov7750_MIRROR_REG) - reglist[i].val = match_reg[1]; - } - } - - return 0; -} - -static int ov7750_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "active config=%s\n", cam_mod->active_config->name); - - ret = ov7750_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 1); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", - ret); - return ret; -} - -static int ov7750_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 0); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -static int ov7750_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret |= ov_camera_module_read_reg(cam_mod, 1, ov7750_PIDH_ADDR, &pidh); - ret |= ov_camera_module_read_reg(cam_mod, 1, ov7750_PIDL_ADDR, &pidl); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if ((pidh == ov7750_PIDH_MAGIC) && (pidl == ov7750_PIDL_MAGIC)) { - ov_camera_module_pr_err(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - } else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - ov7750_PIDH_MAGIC, ov7750_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops ov7750_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops ov7750_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .g_frame_interval = ov_camera_module_g_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops ov7750_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops ov7750_camera_module_ops = { - .core = &ov7750_camera_module_core_ops, - .video = &ov7750_camera_module_video_ops, - .pad = &ov7750_camera_module_pad_ops -}; - -static struct ov_camera_module_custom_config ov7750_custom_config = { - .start_streaming = ov7750_start_streaming, - .stop_streaming = ov7750_stop_streaming, - .s_ctrl = ov7750_s_ctrl, - .s_ext_ctrls = ov7750_s_ext_ctrls, - .g_ctrl = ov7750_g_ctrl, - .g_timings = ov7750_g_timings, - .check_camera_id = ov7750_check_camera_id, - .s_vts = ov7750_auto_adjust_fps, - .set_flip = ov7750_set_flip, - .configs = ov7750_configs, - .num_configs = ARRAY_SIZE(ov7750_configs), - .power_up_delays_ms = {5, 20, 0}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static int ov7750_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - ov7750_filltimings(&ov7750_custom_config); - v4l2_i2c_subdev_init(&ov7750.sd, client, &ov7750_camera_module_ops); - ov7750.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; - ov7750.custom = ov7750_custom_config; - - mutex_init(&ov7750.lock); - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -static int ov7750_remove(struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - mutex_destroy(&cam_mod->lock); - ov_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id ov7750_id[] = { - { ov7750_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id ov7750_of_match[] = { - {.compatible = "ovti,ov7750-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, ov7750_id); - -static struct i2c_driver ov7750_i2c_driver = { - .driver = { - .name = ov7750_DRIVER_NAME, - .of_match_table = ov7750_of_match - }, - .probe = ov7750_probe, - .remove = ov7750_remove, - .id_table = ov7750_id, -}; - -module_i2c_driver(ov7750_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for ov7750"); -MODULE_AUTHOR("Jacob"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/ov8858_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/ov8858_v4l2-i2c-subdev.c deleted file mode 100644 index 3c3a9a520e20..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov8858_v4l2-i2c-subdev.c +++ /dev/null @@ -1,2240 +0,0 @@ -/* - * drivers/media/i2c/soc_camera/xgold/ov8858.c - * - * ov8858 sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - * Note: - * 07/01/2014: new implementation using v4l2-subdev - * instead of v4l2-int-device. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" - -#define ov8858_DRIVER_NAME "ov8858" - -#define ov8858_FETCH_LSB_GAIN(VAL) ((VAL) & 0x00ff) -#define ov8858_FETCH_MSB_GAIN(VAL) (((VAL) >> 8) & 0xff) -#define ov8858_AEC_PK_LONG_GAIN_HIGH_REG 0x3508 /* Bit 6-13 */ -#define ov8858_AEC_PK_LONG_GAIN_LOW_REG 0x3509 /* Bits 0 -5 */ - -#define ov8858_AEC_PK_LONG_EXPO_3RD_REG 0x3500 /* Exposure Bits 16-19 */ -#define ov8858_AEC_PK_LONG_EXPO_2ND_REG 0x3501 /* Exposure Bits 8-15 */ -#define ov8858_AEC_PK_LONG_EXPO_1ST_REG 0x3502 /* Exposure Bits 0-7 */ - -#define ov8858_AEC_GROUP_UPDATE_ADDRESS 0x3208 -#define ov8858_AEC_GROUP_UPDATE_START_DATA 0x00 -#define ov8858_AEC_GROUP_UPDATE_END_DATA 0x10 -#define ov8858_AEC_GROUP_UPDATE_END_LAUNCH 0xA0 - -#define ov8858_FETCH_3RD_BYTE_EXP(VAL) (((VAL) >> 16) & 0xF) /* 4 Bits */ -#define ov8858_FETCH_2ND_BYTE_EXP(VAL) (((VAL) >> 8) & 0xFF) /* 8 Bits */ -#define ov8858_FETCH_1ST_BYTE_EXP(VAL) ((VAL) & 0xFF) /* 8 Bits */ - -#define ov8858_PIDH_ADDR 0x300B -#define ov8858_PIDL_ADDR 0x300C - -#define ov8858_TIMING_VTS_HIGH_REG 0x380e -#define ov8858_TIMING_VTS_LOW_REG 0x380f -#define ov8858_TIMING_HTS_HIGH_REG 0x380c -#define ov8858_TIMING_HTS_LOW_REG 0x380d -#define ov8858_INTEGRATION_TIME_MARGIN 8 -#define ov8858_FINE_INTG_TIME_MIN 0 -#define ov8858_FINE_INTG_TIME_MAX_MARGIN 0 -#define ov8858_COARSE_INTG_TIME_MIN 16 -#define ov8858_COARSE_INTG_TIME_MAX_MARGIN 4 -#define ov8858_TIMING_X_INC 0x3814 -#define ov8858_TIMING_Y_INC 0x3815 -#define ov8858_HORIZONTAL_START_HIGH_REG 0x3800 -#define ov8858_HORIZONTAL_START_LOW_REG 0x3801 -#define ov8858_VERTICAL_START_HIGH_REG 0x3802 -#define ov8858_VERTICAL_START_LOW_REG 0x3803 -#define ov8858_HORIZONTAL_END_HIGH_REG 0x3804 -#define ov8858_HORIZONTAL_END_LOW_REG 0x3805 -#define ov8858_VERTICAL_END_HIGH_REG 0x3806 -#define ov8858_VERTICAL_END_LOW_REG 0x3807 -#define ov8858_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3808 -#define ov8858_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3809 -#define ov8858_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x380a -#define ov8858_VERTICAL_OUTPUT_SIZE_LOW_REG 0x380b -#define ov8858_FLIP_REG 0x3820 -#define ov8858_MIRROR_REG 0x3821 - -#define ov8858_EXT_CLK 26000000 - -#define ov8858_FULL_SIZE_RESOLUTION_WIDTH 3264 -#define ov8858_BINING_SIZE_RESOLUTION_WIDTH 1632 -#define ov8858_VIDEO_SIZE_RESOLUTION_WIDTH 3200 - -#define ov8858_EXP_VALID_FRAMES 4 -/* High byte of product ID */ -#define ov8858_PIDH_MAGIC 0x88 -/* Low byte of product ID */ -#define ov8858_PIDL_MAGIC 0x58 - -bool is_R1A_module; - -#define BG_RATIO_TYPICAL 0x129 -#define RG_RATIO_TYPICAL 0x11f - -#define OV8858_REG_TEST_PATTERN 0x5e00 -#define OV8858_TEST_PATTERN_ENABLE 0x80 -#define OV8858_TEST_PATTERN_DISABLE 0x0 - -struct ov8858_otp_struct { - int otp_en; - int flag; - int module_integrator_id; - int lens_id; - int production_year; - int production_month; - int production_day; - int rg_ratio; - int bg_ratio; - int lenc[240]; - int checksum; - int VCM_start; - int VCM_end; - int VCM_dir; - int R_gain; - int G_gain; - int B_gain; -}; - -static struct ov8858_otp_struct *otp_ptr; -static struct ov_camera_module ov8858; -static struct ov_camera_module_custom_config ov8858_custom_config; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ - -/* MCLK:26MHz 3264x2448 18fps mipi 4lane 481Mbps/lane */ -static struct ov_camera_module_reg - ov8858_init_tab_3264_2448_18fps[] = { - /* global setting */ - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0103, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0300, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x94}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0304, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0305, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0306, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030b, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030d, 0x6f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030f, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0312, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x031e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3033, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3606, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3607, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3608, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3609, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360b, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360c, 0xd4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360d, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3610, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x88}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3614, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3615, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3616, 0x4a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3617, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3618, 0x5a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3619, 0x70}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361a, 0x99}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361b, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3638, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3633, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3634, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3635, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3645, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3646, 0x83}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x364a, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3015, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0x72}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3020, 0x93}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3022, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3031, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3034, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3305, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3308, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3309, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330f, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3307, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x4d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3505, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350d, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3510, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3511, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3512, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3700, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3701, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x50}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x48}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x66}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x82}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3718, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3719, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3712, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3714, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371e, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371f, 0x7f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3720, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3721, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3724, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3725, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3726, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3728, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3729, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372b, 0xa6}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372c, 0xa6}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372d, 0xa6}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3730, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3731, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3732, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3733, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3734, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3736, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373a, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373b, 0x0b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373c, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3750, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3751, 0x0e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3755, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3758, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3759, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375a, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375b, 0x26}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375c, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375d, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375f, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3769, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376a, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3761, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3762, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3763, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3766, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3772, 0x46}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3773, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3774, 0x2c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3775, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3776, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3777, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3778, 0x17}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a0, 0x88}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a1, 0x7a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a2, 0x7a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a3, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a4, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a5, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a6, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a7, 0x88}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a8, 0x98}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a9, 0x98}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3760, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376f, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37aa, 0x88}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ab, 0x5c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ac, 0x5c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ad, 0x55}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ae, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37af, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b0, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b1, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b2, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b3, 0x84}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b4, 0x84}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b5, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b6, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b7, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b8, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b9, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0xd3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0xa3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0xc8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x0b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x64}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0xdc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382a, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382b, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3830, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3841, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3846, 0x48}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x16}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8c, 0x73}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d8d, 0xde}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f08, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f0a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4005, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4002, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4009, 0x81}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400b, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4011, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x2a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x2b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4028, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4029, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4034, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403d, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4300, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4302, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4316, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4503, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4600, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0xcb}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x481f, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4821, 0x5f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x21}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4850, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4851, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4b00, 0x2a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4b0d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d00, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d01, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d02, 0xc3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d03, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d04, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d05, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0xfe}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5002, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5003, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5046, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5780, 0x3e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5781, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5782, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5783, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5784, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5785, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5786, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5787, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5788, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5789, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x578a, 0xfd}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x578b, 0xf5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x578c, 0xf5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x578d, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x578e, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x578f, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5790, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5791, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5792, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5793, 0x52}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5794, 0xa3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5871, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5870, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x586e, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x586f, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x58f8, 0x3d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5901, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b00, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b01, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b02, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b03, 0xcf}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5b05, 0x6c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e01, 0x41}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382d, 0x7f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4825, 0x3a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4826, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4808, 0x25}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3763, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0xcc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x470b, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4202, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400d, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4040, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403e, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4041, 0xc6}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3007, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400a, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3021, 0x23}, - /* @@ SIZE_3264X2448_15FPS_MIPI_4LANE based on R2A_EN_AM22 version db */ - /* ;;pll2_VCO= 721.5, SYSclk=144.3, Dac_clk =360.75 */ - /* ;;pll1_VCO= 962, pll_MIPIclk=481Mbps */ - /* mipi_Pclk =60.125, Sclk1=120.25 */ - /* ;;fps=15, 10bit,4lane, Vblanking=7.251ms */ - /* update on 2015/06/25.*/ - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0xbc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x46}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382a, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382d, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3830, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f0a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x36}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x37}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4600, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x97} -}; - -static const struct ov_camera_module_reg - ov8858_init_tab_1632_1224_30fps_R1A[] = { - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0103, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x1e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0304, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030f, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0312, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x031e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3606, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3607, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3608, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3609, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360b, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360c, 0xdc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360d, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3610, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x88}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3614, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3615, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3616, 0x4a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3617, 0xb0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3618, 0x56}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3619, 0x70}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361a, 0x99}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3638, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3633, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3634, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3635, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3645, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3646, 0x83}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x364a, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3015, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3020, 0x93}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3022, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3031, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3034, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3305, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3308, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3309, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330f, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3307, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x4d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3505, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350d, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3510, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3511, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3512, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3700, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3701, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x35}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0xb5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370c, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3718, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3719, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3712, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3714, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371e, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371f, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3720, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3721, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3724, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3725, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3726, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3728, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3729, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372b, 0x53}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372c, 0xa3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372d, 0x53}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3730, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3731, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3732, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3733, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3734, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3736, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373a, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373b, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373c, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373e, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3755, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3758, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3759, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375b, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375c, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375f, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3769, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376a, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3761, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3762, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3763, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3766, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3772, 0x23}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3773, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3774, 0x16}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3775, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3776, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3777, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3778, 0x1b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a0, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a1, 0x3d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a2, 0x3d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a3, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a4, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a5, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a6, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a7, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a8, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a9, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3760, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376f, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37aa, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ab, 0x2e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ac, 0x2e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ad, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ae, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37af, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b0, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b1, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b2, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b3, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b4, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b5, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b6, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b7, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b8, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b9, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0xd3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0xa3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0xc8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x88}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0xdc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x67}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382a, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382b, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3830, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3841, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3846, 0x48}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f08, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f0a, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4005, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4002, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4009, 0x81}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400b, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0xb9}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x2a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x2b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4028, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4029, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402c, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4034, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403d, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4300, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4302, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4316, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x38}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4503, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4600, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0xcb}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x481f, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x16}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4850, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4851, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4b00, 0x2a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4b0d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d00, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d01, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d02, 0xc3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d03, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d04, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d05, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x7e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5002, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5003, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5046, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5901, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e01, 0x41}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382d, 0x7f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4825, 0x3a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4826, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4808, 0x25}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030f, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0312, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3015, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x4d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x40}, - /* {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x04}, */ - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x35}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0xb5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3778, 0x1b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0xc8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x88}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0xdc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x67}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382a, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3830, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f0a, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0xb9}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x2a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x2b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x38}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4600, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0xcb}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382d, 0x7f} -}; - -static const struct ov_camera_module_reg - ov8858_init_tab_3264_2448_15fps_R1A[] = { - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0103, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x1e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0304, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030f, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0312, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x031e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3603, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3604, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3605, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3606, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3607, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3608, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3609, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360b, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360c, 0xdc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360d, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3610, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x88}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3614, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3615, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3616, 0x4a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3617, 0xb0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3618, 0x56}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3619, 0x70}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361a, 0x99}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x361f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3638, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3633, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3634, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3635, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3645, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3646, 0x83}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x364a, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3015, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3020, 0x93}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3022, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3031, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3034, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3305, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3308, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3309, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x330f, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3307, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x4d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3505, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x350d, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3510, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3511, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3512, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3700, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3701, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x28}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x35}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3707, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3708, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0xb5}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370c, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3718, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3719, 0x31}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3712, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3714, 0x24}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371e, 0x19}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371f, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3720, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3721, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3724, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3725, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3726, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3728, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3729, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372a, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372b, 0x53}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372c, 0xa3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372d, 0x53}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372e, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372f, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3730, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3731, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3732, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3733, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3734, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3736, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373a, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373b, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373c, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373e, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3755, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3758, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3759, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375a, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375b, 0x13}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375c, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375e, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375f, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3768, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3769, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376a, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3761, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3762, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3763, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3766, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3772, 0x23}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3773, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3774, 0x16}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3775, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3776, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3777, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3778, 0x1b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a0, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a1, 0x3d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a2, 0x3d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a3, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a4, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a5, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a6, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a7, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a8, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a9, 0x4c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3760, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x376f, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37aa, 0x44}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ab, 0x2e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ac, 0x2e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ad, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37ae, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37af, 0x0d}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b0, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b1, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b2, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b3, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b4, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b5, 0x33}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b6, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b7, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b8, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b9, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0xd3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0xa3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x60}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0xc8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x88}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0xdc}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x67}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382a, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382b, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3830, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3837, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3841, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3846, 0x48}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x14}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f08, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f0a, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xf1}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4005, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4002, 0x27}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4009, 0x81}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400b, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401b, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4020, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4021, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0xb9}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x2a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x2b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4028, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4029, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402a, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402c, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402d, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402f, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x401f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4034, 0x3f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x403d, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4300, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4301, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4302, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4316, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x38}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4503, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4600, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0xcb}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x481f, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x16}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4850, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4851, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4b00, 0x2a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4b0d, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d00, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d01, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d02, 0xc3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d03, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d04, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4d05, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x7e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5002, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5003, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5046, 0x12}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5901, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e01, 0x41}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382d, 0x7f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4825, 0x3a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4826, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4808, 0x25}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030e, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030f, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0312, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3015, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x9a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x6a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x6a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3778, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0xc0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x94}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x09}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0xaa}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x46}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382a, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3830, 0x06}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f0a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4001, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4022, 0x0b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4023, 0xc3}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4024, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4025, 0x36}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4026, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4027, 0x37}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402b, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x402e, 0x0c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x58}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4600, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x97}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382d, 0xff} -}; - -/* ======================================================================== */ -static struct ov_camera_module_config ov8858_configs[] = { -{ - .name = "3264x2448_18fps", - .frm_fmt = { - .width = 3264, - .height = 2448, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 18 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov8858_init_tab_3264_2448_18fps, - .reg_table_num_entries = - sizeof(ov8858_init_tab_3264_2448_18fps) / - sizeof(ov8858_init_tab_3264_2448_18fps[0]), - .reg_diff_table = NULL, - .reg_diff_table_num_entries = 0, - .v_blanking_time_us = 7251, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 4, 481, 24000000) - } -}; - -static struct ov_camera_module_config ov8858_configs_R1A[] = { - { - .name = "1632x1224_30fps", - .frm_fmt = { - .width = 1632, - .height = 1224, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov8858_init_tab_1632_1224_30fps_R1A, - .reg_table_num_entries = - sizeof(ov8858_init_tab_1632_1224_30fps_R1A) / - sizeof(ov8858_init_tab_1632_1224_30fps_R1A[0]), - .v_blanking_time_us = 6579, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 720, 24000000) - }, - { - .name = "3264x2448_15fps", - .frm_fmt = { - .width = 3264, - .height = 2448, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 15 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov8858_init_tab_3264_2448_15fps_R1A, - .reg_table_num_entries = - sizeof(ov8858_init_tab_3264_2448_15fps_R1A) / - sizeof(ov8858_init_tab_3264_2448_15fps_R1A[0]), - .v_blanking_time_us = 6579, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 720, 24000000) - } -}; - -/*--------------------------------------------------------------------------*/ - -static int ov8858_g_VTS(struct ov_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = ov_camera_module_read_reg_table( - cam_mod, - ov8858_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_read_reg_table( - cam_mod, - ov8858_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - cam_mod->vts_cur = *vts; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov8858_auto_adjust_fps(struct ov_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - if ((exp_time + ov8858_COARSE_INTG_TIME_MAX_MARGIN) - > cam_mod->vts_min) - vts = exp_time + ov8858_COARSE_INTG_TIME_MAX_MARGIN; - else - vts = cam_mod->vts_min; - ret = ov_camera_module_write_reg(cam_mod, - ov8858_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov8858_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, - "updated vts = %d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int ov8858_set_vts(struct ov_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts < cam_mod->vts_min) - return ret; - - if (vts > 0xfff) - vts = 0xfff; - - ret = ov_camera_module_write_reg(cam_mod, - ov8858_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov8858_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, "updated vts=%d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int ov8858_write_aec(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "exp_time = %d, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if ((cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY) || - (cam_mod->state == OV_CAMERA_MODULE_STREAMING)) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time; - - a_gain = a_gain > 0x7ff ? 0x7ff : a_gain; - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - exp_time = cam_mod->exp_config.exp_time << 4; - - mutex_lock(&cam_mod->lock); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - ret = ov_camera_module_write_reg(cam_mod, - ov8858_AEC_GROUP_UPDATE_ADDRESS, - ov8858_AEC_GROUP_UPDATE_START_DATA); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = ov8858_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - ret |= ov_camera_module_write_reg(cam_mod, - ov8858_AEC_PK_LONG_GAIN_HIGH_REG, - ov8858_FETCH_MSB_GAIN(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, - ov8858_AEC_PK_LONG_GAIN_LOW_REG, - ov8858_FETCH_LSB_GAIN(a_gain)); - ret = ov_camera_module_write_reg(cam_mod, - ov8858_AEC_PK_LONG_EXPO_3RD_REG, - ov8858_FETCH_3RD_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov8858_AEC_PK_LONG_EXPO_2ND_REG, - ov8858_FETCH_2ND_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov8858_AEC_PK_LONG_EXPO_1ST_REG, - ov8858_FETCH_1ST_BYTE_EXP(exp_time)); - if (!cam_mod->auto_adjust_fps) - ret |= ov8858_set_vts(cam_mod, cam_mod->exp_config.vts_value); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - ret = ov_camera_module_write_reg(cam_mod, - ov8858_AEC_GROUP_UPDATE_ADDRESS, - ov8858_AEC_GROUP_UPDATE_END_DATA); - ret = ov_camera_module_write_reg(cam_mod, - ov8858_AEC_GROUP_UPDATE_ADDRESS, - ov8858_AEC_GROUP_UPDATE_END_LAUNCH); - } - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov8858_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int ov8858_filltimings(struct ov_camera_module_custom_config *custom) -{ - int i, j; - struct ov_camera_module_config *config; - struct ov_camera_module_timings *timings; - struct ov_camera_module_reg *reg_table; - int reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - memset(timings, 0x00, sizeof(*timings)); - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case ov8858_TIMING_VTS_HIGH_REG: - timings->frame_length_lines = - ((reg_table[j].val << 8) | - (timings->frame_length_lines & 0xff)); - break; - case ov8858_TIMING_VTS_LOW_REG: - timings->frame_length_lines = - (reg_table[j].val | - (timings->frame_length_lines & 0xff00)); - break; - case ov8858_TIMING_HTS_HIGH_REG: - timings->line_length_pck = - ((reg_table[j].val << 8) | - timings->line_length_pck); - break; - case ov8858_TIMING_HTS_LOW_REG: - timings->line_length_pck = - (reg_table[j].val | - (timings->line_length_pck & 0xff00)); - break; - case ov8858_TIMING_X_INC: - timings->binning_factor_x = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_x == 0) - timings->binning_factor_x = 1; - break; - case ov8858_TIMING_Y_INC: - timings->binning_factor_y = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_y == 0) - timings->binning_factor_y = 1; - break; - case ov8858_HORIZONTAL_START_HIGH_REG: - timings->crop_horizontal_start = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_start & - 0xff)); - break; - case ov8858_HORIZONTAL_START_LOW_REG: - timings->crop_horizontal_start = - (reg_table[j].val | - (timings->crop_horizontal_start & - 0xff00)); - break; - case ov8858_VERTICAL_START_HIGH_REG: - timings->crop_vertical_start = - ((reg_table[j].val << 8) | - (timings->crop_vertical_start & 0xff)); - break; - case ov8858_VERTICAL_START_LOW_REG: - timings->crop_vertical_start = - ((reg_table[j].val) | - (timings->crop_vertical_start & - 0xff00)); - break; - case ov8858_HORIZONTAL_END_HIGH_REG: - timings->crop_horizontal_end = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_end & 0xff)); - break; - case ov8858_HORIZONTAL_END_LOW_REG: - timings->crop_horizontal_end = - (reg_table[j].val | - (timings->crop_horizontal_end & - 0xff00)); - break; - case ov8858_VERTICAL_END_HIGH_REG: - timings->crop_vertical_end = - ((reg_table[j].val << 8) | - (timings->crop_vertical_end & 0xff)); - break; - case ov8858_VERTICAL_END_LOW_REG: - timings->crop_vertical_end = - (reg_table[j].val | - (timings->crop_vertical_end & 0xff00)); - break; - case ov8858_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - ((reg_table[j].val << 8) | - (timings->sensor_output_width & 0xff)); - break; - case ov8858_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width = - (reg_table[j].val | - (timings->sensor_output_width & - 0xff00)); - break; - case ov8858_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - ((reg_table[j].val << 8) | - (timings->sensor_output_height & 0xff)); - break; - case ov8858_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height = - (reg_table[j].val | - (timings->sensor_output_height & - 0xff00)); - break; - case ov8858_AEC_PK_LONG_EXPO_1ST_REG: - timings->exp_time = - ((reg_table[j].val) | - (timings->exp_time & 0xffff00)); - break; - case ov8858_AEC_PK_LONG_EXPO_2ND_REG: - timings->exp_time = - ((reg_table[j].val << 8) | - (timings->exp_time & 0x00ff00)); - break; - case ov8858_AEC_PK_LONG_EXPO_3RD_REG: - timings->exp_time = - (((reg_table[j].val & 0x0f) << 16) | - (timings->exp_time & 0xff0000)); - break; - case ov8858_AEC_PK_LONG_GAIN_LOW_REG: - timings->gain = - (reg_table[j].val | - (timings->gain & 0x0700)); - break; - case ov8858_AEC_PK_LONG_GAIN_HIGH_REG: - timings->gain = - (((reg_table[j].val & 0x07) << 8) | - (timings->gain & 0xff)); - break; - } - } - - timings->exp_time >>= 4; - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator - * timings->frame_length_lines - * timings->line_length_pck; - - timings->coarse_integration_time_min = - ov8858_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - ov8858_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = - ov8858_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - ov8858_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -static int ov8858_g_timings(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - - timings->frame_length_lines = vts; - - return ret; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov8858_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = ov8858_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d) 0x%x\n", ret, ctrl_id); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov8858_enable_test_pattern(struct ov_camera_module *cam_mod, - u32 pattern) -{ - u32 val; - - if (pattern) - val = (pattern - 1) | OV8858_TEST_PATTERN_ENABLE; - else - val = OV8858_TEST_PATTERN_DISABLE; - - return ov_camera_module_write_reg(cam_mod, - OV8858_REG_TEST_PATTERN, val); -} - -static int ov8858_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = ov8858_write_aec(cam_mod); - else - ret = -EINVAL; - - if (ctrls->ctrls[0].id == V4L2_CID_TEST_PATTERN) - ret = ov8858_enable_test_pattern(cam_mod, - ctrls->ctrls[0].value); - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -int update_awb_gain(struct ov_camera_module *cam_mod) -{ - int R_gain = otp_ptr->R_gain; - int G_gain = otp_ptr->G_gain; - int B_gain = otp_ptr->B_gain; - int ret = 0; - - if (R_gain > 0x400) { - ret |= ov_camera_module_write_reg(cam_mod, 0x5032, - R_gain >> 8); - ret |= ov_camera_module_write_reg(cam_mod, 0x5033, - R_gain & 0x00ff); - } - if (G_gain > 0x400) { - ret |= ov_camera_module_write_reg(cam_mod, 0x5034, - G_gain >> 8); - ret |= ov_camera_module_write_reg(cam_mod, 0x5035, - G_gain & 0x00ff); - } - if (B_gain > 0x400) { - ret |= ov_camera_module_write_reg(cam_mod, 0x5036, - B_gain >> 8); - ret |= ov_camera_module_write_reg(cam_mod, 0x5037, - B_gain & 0x00ff); - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, "otp awb gain apply failed\n"); - else - ov_camera_module_pr_debug(cam_mod, - "ov8858_update:%s, rgain:%x ggain %x bgain %x\n", - __func__, R_gain, G_gain, B_gain); - - return ret; -} - -int update_lenc(struct ov_camera_module *cam_mod) -{ - int i, temp = 0, ret = 0; - - ret |= ov_camera_module_read_reg(cam_mod, 1, 0x5000, &temp); - temp = 0x80 | temp; - ret |= ov_camera_module_write_reg(cam_mod, 0x5000, temp); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp lenc apply failed at beginning\n"); - return ret; - } - - for (i = 0; i < 240; i++) { - ret |= ov_camera_module_write_reg(cam_mod, (0x5800 + i), - otp_ptr->lenc[i]); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp lenc apply failed during procesing\n"); - break; - } - } - - return ret; -} - -static int ov8858_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "active config=%s\n", cam_mod->active_config->name); - - if (otp_ptr && otp_ptr->otp_en == 1 && - cam_mod->update_config && - cam_mod->active_config->soft_reset) { - ov_camera_module_pr_debug(cam_mod, - "apply otp data for R2A module...\n"); - update_awb_gain(cam_mod); - update_lenc(cam_mod); - } - ret = ov8858_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 1); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov8858_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 0); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -/* - * call this function after ov8858 initialization - * return value: 0 update success - * 1, no OTP - */ -int __ov8858_read_otp_wb(struct ov_camera_module *cam_mod) -{ - int otp_flag = 0; - int addr = 0; - int ret = 0; - int temp1 = 0, temp2 = 0; - - ret = ov_camera_module_read_reg(cam_mod, 1, 0x7010, &otp_flag); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp wb flag read failed\n"); - return ret; - } - ov_camera_module_pr_debug(cam_mod, "otp wb flag is %0x\n", otp_flag); - - if ((otp_flag & 0xc0) == 0x40) - addr = 0x7011; /* set addr to group 1 base */ - else if ((otp_flag & 0x30) == 0x10) - addr = 0x7019; /* set addr to group 2 base */ - - if (addr != 0) { - ov_camera_module_pr_debug(cam_mod, - "otp wb addr is %0x\n", addr); - otp_ptr->flag = 0xc0; - ret |= ov_camera_module_read_reg(cam_mod, 1, addr, - &otp_ptr->module_integrator_id); - ret |= ov_camera_module_read_reg(cam_mod, 1, (addr + 1), - &otp_ptr->lens_id); - ret |= ov_camera_module_read_reg(cam_mod, 1, (addr + 2), - &otp_ptr->production_year); - ret |= ov_camera_module_read_reg(cam_mod, 1, (addr + 3), - &otp_ptr->production_month); - ret |= ov_camera_module_read_reg(cam_mod, 1, (addr + 4), - &otp_ptr->production_day); - ret |= ov_camera_module_read_reg(cam_mod, 1, - (addr + 5), &temp1); - ret |= ov_camera_module_read_reg(cam_mod, 1, - (addr + 7), &temp2); - otp_ptr->rg_ratio = (temp1 << 2) + (temp2 >> 6 & 0x03); - ret |= ov_camera_module_read_reg(cam_mod, 1, - (addr + 6), &temp1); - otp_ptr->bg_ratio = (temp1 << 2) + (temp2 >> 4 & 0x03); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp wb data read failed\n"); - return 1; - } - - } else { - ov_camera_module_pr_debug(cam_mod, - "no valid module info and awb data in otp\n"); - otp_ptr->flag = 0; - otp_ptr->module_integrator_id = 0; - otp_ptr->lens_id = 0; - otp_ptr->production_year = 0; - otp_ptr->production_month = 0; - otp_ptr->production_day = 0; - otp_ptr->rg_ratio = 0; - otp_ptr->bg_ratio = 0; - return 1; - } - - otp_ptr->R_gain = (RG_RATIO_TYPICAL * 1000) / otp_ptr->rg_ratio; - otp_ptr->B_gain = (BG_RATIO_TYPICAL * 1000) / otp_ptr->bg_ratio; - otp_ptr->G_gain = 1000; - - if (otp_ptr->R_gain < 1000 || otp_ptr->B_gain < 1000) { - if (otp_ptr->R_gain < otp_ptr->B_gain) - temp1 = otp_ptr->R_gain; - else - temp1 = otp_ptr->B_gain; - } else { - temp1 = otp_ptr->G_gain; - } - - otp_ptr->R_gain = 0x400 * otp_ptr->R_gain / temp1; - otp_ptr->B_gain = 0x400 * otp_ptr->B_gain / temp1; - otp_ptr->G_gain = 0x400 * otp_ptr->G_gain / temp1; - - return ret; -} - -int __ov8858_read_otp_vcm(struct ov_camera_module *cam_mod) -{ - int otp_flag = 0; - int addr = 0; - int ret = 0; - int temp1 = 0, temp2 = 0; - - ret = ov_camera_module_read_reg(cam_mod, 1, 0x7021, &otp_flag); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp vcm flag read failed\n"); - return ret; - } - ov_camera_module_pr_debug(cam_mod, "otp vcm flag is %0x\n", otp_flag); - - if ((otp_flag & 0xc0) == 0x40) - addr = 0x7022; /* set addr to group 1 base */ - else if ((otp_flag & 0x30) == 0x10) - addr = 0x7025; /* set addr to group 2 base */ - - if (addr != 0) { - ov_camera_module_pr_debug(cam_mod, - "otp vcm addr is %0x\n", addr); - otp_ptr->flag |= 0x20; - ret |= ov_camera_module_read_reg(cam_mod, 1, addr, &temp1); - ret |= ov_camera_module_read_reg(cam_mod, 1, - (addr + 2), &temp2); - otp_ptr->VCM_start = (temp1 << 2) | (temp1 >> 6 & 0x03); - ret |= ov_camera_module_read_reg(cam_mod, 1, - (addr + 1), &temp1); - otp_ptr->VCM_end = (temp1 << 2) + (temp2 >> 4 & 0x03); - otp_ptr->VCM_dir = (temp2 >> 2 & 0x03); - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "otp vcm read fail!\n"); - } else { - ov_camera_module_pr_debug(cam_mod, - "no valid vcm data in otp\n"); - otp_ptr->VCM_end = 0; - otp_ptr->VCM_end = 0; - otp_ptr->VCM_dir = 0; - return 1; - } - - return ret; -} - -int __ov8858_read_otp_lenc(struct ov_camera_module *cam_mod) -{ - int otp_flag = 0; - int addr = 0; - int ret = 0, i = 0; - int checksum = 0; - - ret = ov_camera_module_read_reg(cam_mod, 1, 0x7028, &otp_flag); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp lenc flag read failed\n"); - return ret; - } - - ov_camera_module_pr_debug(cam_mod, - "otp lenc flag is 0x%0x\n", otp_flag); - - if ((otp_flag & 0xc0) == 0x40) - addr = 0x7029; /* set addr to group 1 base */ - else if ((otp_flag & 0x30) == 0x10) - addr = 0x711a; /* set addr to group 2 base */ - - if (addr != 0) { - for (i = 0; i < 240; i++) { - ret |= ov_camera_module_read_reg(cam_mod, 1, (addr + i), - &otp_ptr->lenc[i]); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp lenc data read failed\n"); - return ret; - } - checksum += otp_ptr->lenc[i]; - } - - checksum = (checksum) % 255 + 1; - ret |= ov_camera_module_read_reg(cam_mod, 1, (addr + 240), - &otp_ptr->checksum); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp lenc checksum read failed\n"); - return ret; - } - - if (otp_ptr->checksum == checksum) { - otp_ptr->flag |= 0x10; - } else { - ov_camera_module_pr_err(cam_mod, - "otp lenc checksum no match!\n"); - return 1; - } - } else { - for (i = 0; i < 240; i++) { - ov_camera_module_pr_debug(cam_mod, - "no valid lenc data in otp\n"); - otp_ptr->lenc[i] = 0; - } - return 1; - } - - return ret; -} - -static int ov8858_otp_read(struct ov_camera_module *cam_mod) -{ - int ret = 0; - int temp = 0; - int reg = 0; - int otp_ret = 0; - struct i2c_client *client = v4l2_get_subdevdata(&cam_mod->sd); - - ov_camera_module_pr_debug(cam_mod, "\n"); - - if (otp_ptr) { - ov_camera_module_pr_debug(cam_mod, "OTP data loaded already\n"); - return 0; - } - - otp_ptr = kzalloc(sizeof(*otp_ptr), GFP_KERNEL); - if (!otp_ptr) { - ov_camera_module_pr_err(cam_mod, "otp alloc fail!\n"); - return -ENOMEM; - } - - ov_camera_module_write_reg(cam_mod, 0x0100, 1); - - /* set 0x5002[3] to "0" before ops */ - ret = ov_camera_module_read_reg(cam_mod, 1, 0x5002, &temp); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp read failed at phase1\n"); - return ret; - } - - ov_camera_module_pr_debug(cam_mod, "otp read phase1 pass\n"); - - ret |= ov_camera_module_write_reg(cam_mod, 0x5002, - ((temp & (~0x08)))); - - ret |= ov_camera_module_write_reg(cam_mod, 0x3d84, 0xc0); - /* otp start addr */ - ret |= ov_camera_module_write_reg(cam_mod, 0x3d88, 0x70); - ret |= ov_camera_module_write_reg(cam_mod, 0x3d89, 0x10); - /* otp end addr */ - ret |= ov_camera_module_write_reg(cam_mod, 0x3d8A, 0x72); - ret |= ov_camera_module_write_reg(cam_mod, 0x3d8B, 0x0a); - /* load otp into buffer */ - ret |= ov_camera_module_write_reg(cam_mod, 0x3d81, 0x01); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp read failed at phase2\n"); - return ret; - } - - ov_camera_module_pr_debug(cam_mod, "otp read phase2 pass\n"); - - usleep_range(10000, 15000); - - /* otp wb read */ - otp_ret = __ov8858_read_otp_wb(cam_mod); - - if (otp_ret) - ov_camera_module_pr_err(cam_mod, "fail to read OTP wb!\n"); - else - ov_camera_module_pr_debug(cam_mod, "read otp wb success\n"); - - /* otp vcm read */ - otp_ret = __ov8858_read_otp_vcm(cam_mod); - - if (otp_ret) - ov_camera_module_pr_err(cam_mod, "fail to read OTP vcm!\n"); - else - ov_camera_module_pr_debug(cam_mod, "read otp vcm success\n"); - - /* otp lenc read */ - otp_ret = __ov8858_read_otp_lenc(cam_mod); - - if (otp_ret) { - ov_camera_module_pr_err(cam_mod, "fail to read OTP lenc!\n"); - goto readotperr; - } else { - ov_camera_module_pr_debug(cam_mod, "read otp lenc success\n"); - } - /* clear data afer read */ - for (reg = 0x7010; reg <= 0x720a; reg++) { - ret |= ov_camera_module_write_reg(cam_mod, reg, 0); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp clear data failed at phase3\n"); - return ret; - } - } - -readotperr: - /* set 0x5002[3] to "1" after ops */ - ret = ov_camera_module_read_reg(cam_mod, 1, 0x5002, &temp); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "otp exit failed at phase 4\n"); - return ret; - } - - ov_camera_module_pr_debug(cam_mod, "0x5002 is 0x%0x\n", temp); - - ret |= ov_camera_module_write_reg(cam_mod, 0x5002, - (0x08 | (temp & (~0x08)))); - ov_camera_module_write_reg(cam_mod, 0x0100, 0); - if (otp_ret) { - otp_ptr->otp_en = 0; - ov_camera_module_pr_err( - cam_mod, - "get otp data failed\n"); - } else { - otp_ptr->otp_en = 1; - dev_info(&client->dev, "get otp data success\n"); - } - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov8858_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl, vid = 0; - int ret = 0; - struct i2c_client *client; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret |= ov_camera_module_read_reg(cam_mod, 1, ov8858_PIDH_ADDR, &pidh); - ret |= ov_camera_module_read_reg(cam_mod, 1, ov8858_PIDL_ADDR, &pidl); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if ((pidh == ov8858_PIDH_MAGIC) && (pidl == ov8858_PIDL_MAGIC)) - ov_camera_module_pr_debug(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - ov8858_PIDH_MAGIC, ov8858_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - ret |= ov_camera_module_read_reg(cam_mod, 1, 0x302a, &vid); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } else - ov_camera_module_pr_debug(cam_mod, - "ov8858 chip version is 0x%2x\n", vid); - - client = v4l2_get_subdevdata(&cam_mod->sd); - if ((vid == 0xb1) || (vid == 0xb0)) { - ov8858_custom_config.configs = ov8858_configs_R1A; - ov8858_custom_config.num_configs = - sizeof(ov8858_configs_R1A) - / sizeof(ov8858_configs_R1A[0]); - dev_info(&client->dev, "init setting for r1a\n"); - } else { - dev_info(&client->dev, "init setting for r2a\n"); - } - - ov8858_filltimings(&ov8858_custom_config); - cam_mod->custom = ov8858_custom_config; - - ov_camera_module_pr_debug(cam_mod, - "ov8858 chip version is 0x%2x,module config no. is %d\n", - vid, - cam_mod->custom.num_configs); - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops ov8858_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops ov8858_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .g_frame_interval = ov_camera_module_g_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops ov8858_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops ov8858_camera_module_ops = { - .core = &ov8858_camera_module_core_ops, - .video = &ov8858_camera_module_video_ops, - .pad = &ov8858_camera_module_pad_ops -}; - -static struct ov_camera_module_custom_config ov8858_custom_config = { - .start_streaming = ov8858_start_streaming, - .stop_streaming = ov8858_stop_streaming, - .s_ctrl = ov8858_s_ctrl, - .s_ext_ctrls = ov8858_s_ext_ctrls, - .g_ctrl = ov8858_g_ctrl, - .g_timings = ov8858_g_timings, - .check_camera_id = ov8858_check_camera_id, - .s_vts = ov8858_auto_adjust_fps, - .read_otp = ov8858_otp_read, - .configs = ov8858_configs, - .num_configs = ARRAY_SIZE(ov8858_configs), - .power_up_delays_ms = {5, 20, 0}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static int ov8858_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - ov8858_filltimings(&ov8858_custom_config); - v4l2_i2c_subdev_init(&ov8858.sd, client, &ov8858_camera_module_ops); - ov8858.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; - ov8858.custom = ov8858_custom_config; - - mutex_init(&ov8858.lock); - dev_info(&client->dev, "probing successful\n"); - - return 0; -} - -static int ov8858_remove(struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - mutex_destroy(&cam_mod->lock); - ov_camera_module_release(cam_mod); - - kfree(otp_ptr); - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id ov8858_id[] = { - { ov8858_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id ov8858_of_match[] = { - {.compatible = "omnivision,ov8858-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, ov8858_id); - -static struct i2c_driver ov8858_i2c_driver = { - .driver = { - .name = ov8858_DRIVER_NAME, - .owner = THIS_MODULE, - .of_match_table = ov8858_of_match - }, - .probe = ov8858_probe, - .remove = ov8858_remove, - .id_table = ov8858_id, -}; - -module_i2c_driver(ov8858_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for ov8858"); -MODULE_AUTHOR("George"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/ov9281_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/ov9281_v4l2-i2c-subdev.c deleted file mode 100644 index 03e3395e97cf..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov9281_v4l2-i2c-subdev.c +++ /dev/null @@ -1,830 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * drivers/media/i2c/soc_camera/xgold/ov9281.c - * - * ov9281 sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - * Note: - * 07/01/2014: new implementation using v4l2-subdev - * instead of v4l2-int-device. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" -#define DEBUG -#define ov9281_DRIVER_NAME "ov9281" - -#define ov9281_FETCH_LSB_GAIN(VAL) ((VAL) & 0x00ff) -#define ov9281_FETCH_MSB_GAIN(VAL) (((VAL) >> 8) & 0xff) -#define ov9281_AEC_PK_LONG_GAIN_REG 0x3509 /* Bits 0 -5 */ - -#define ov9281_AEC_PK_LONG_EXPO_3RD_REG 0x3500 /* Exposure Bits 16-19 */ -#define ov9281_AEC_PK_LONG_EXPO_2ND_REG 0x3501 /* Exposure Bits 8-15 */ -#define ov9281_AEC_PK_LONG_EXPO_1ST_REG 0x3502 /* Exposure Bits 0-7 */ - -#define ov9281_AEC_GROUP_UPDATE_ADDRESS 0x3208 -#define ov9281_AEC_GROUP_UPDATE_START_DATA 0x00 -#define ov9281_AEC_GROUP_UPDATE_END_DATA 0x10 -#define ov9281_AEC_GROUP_UPDATE_END_LAUNCH 0xA0 - -#define ov9281_FETCH_3RD_BYTE_EXP(VAL) (((VAL) >> 16) & 0xF) /* 4 Bits */ -#define ov9281_FETCH_2ND_BYTE_EXP(VAL) (((VAL) >> 8) & 0xFF) /* 8 Bits */ -#define ov9281_FETCH_1ST_BYTE_EXP(VAL) ((VAL) & 0xFF) /* 8 Bits */ - -#define ov9281_PIDH_ADDR 0x300A -#define ov9281_PIDL_ADDR 0x300B - -#define ov9281_TIMING_VTS_HIGH_REG 0x380e -#define ov9281_TIMING_VTS_LOW_REG 0x380f -#define ov9281_TIMING_HTS_HIGH_REG 0x380c -#define ov9281_TIMING_HTS_LOW_REG 0x380d -#define ov9281_INTEGRATION_TIME_MARGIN 8 -#define ov9281_FINE_INTG_TIME_MIN 0 -#define ov9281_FINE_INTG_TIME_MAX_MARGIN 0 -#define ov9281_COARSE_INTG_TIME_MIN 1 -#define ov9281_COARSE_INTG_TIME_MAX_MARGIN 25 -#define ov9281_TIMING_X_INC 0x3814 -#define ov9281_TIMING_Y_INC 0x3815 -#define ov9281_HORIZONTAL_START_HIGH_REG 0x3800 -#define ov9281_HORIZONTAL_START_LOW_REG 0x3801 -#define ov9281_VERTICAL_START_HIGH_REG 0x3802 -#define ov9281_VERTICAL_START_LOW_REG 0x3803 -#define ov9281_HORIZONTAL_END_HIGH_REG 0x3804 -#define ov9281_HORIZONTAL_END_LOW_REG 0x3805 -#define ov9281_VERTICAL_END_HIGH_REG 0x3806 -#define ov9281_VERTICAL_END_LOW_REG 0x3807 -#define ov9281_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3808 -#define ov9281_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3809 -#define ov9281_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x380a -#define ov9281_VERTICAL_OUTPUT_SIZE_LOW_REG 0x380b -#define ov9281_FLIP_REG 0x3820 -#define ov9281_MIRROR_REG 0x3821 - -#define ov9281_EXT_CLK 24000000 - -#define ov9281_FULL_SIZE_RESOLUTION_WIDTH 1280 -#define ov9281_BINING_SIZE_RESOLUTION_WIDTH 1280 -#define ov9281_VIDEO_SIZE_RESOLUTION_WIDTH 1200 - -#define ov9281_EXP_VALID_FRAMES 4 -/* High byte of product ID */ -#define ov9281_PIDH_MAGIC 0x92 -/* Low byte of product ID */ -#define ov9281_PIDL_MAGIC 0x81 - -#define ov9281_SNAPSHOT_MODE 1 - -static struct ov_camera_module ov9281; -static struct ov_camera_module_custom_config ov9281_custom_config; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ - -/* MCLK:26MHz 1280x800 60fps mipi 2lane 481Mbps/lane */ -static struct ov_camera_module_reg - ov9281_init_tab_1280_800_60fps[] = { - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0103, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030d, 0x50}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030e, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3001, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3004, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3005, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3006, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x0a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3013, 0x18}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3022, 0x01}, - /* normal */ - // {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4f00, 0x01}; - #ifdef ov9281_SNAPSHOT_MODE - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3023, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x302f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3030, 0x04}, - #else - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3030, 0x10}, - #endif - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3039, 0x32}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x303a, 0x00}, - - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x303f, 0x01}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x2a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x90}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3505, 0x8c}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3507, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x10}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3610, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0xa0}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3620, 0x6f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3632, 0x56}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3633, 0x78}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3662, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3666, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366f, 0x5a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3680, 0x84}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3712, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x372d, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3731, 0x80}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3732, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3778, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x377d, 0x22}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3788, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3789, 0xa4}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x378a, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x378b, 0x4a}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3799, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x0f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0x2f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x05}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0x20}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x02}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0xd8}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x03}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0x8e}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x11}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3881, 0x42}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x38b1, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3920, 0xff}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4003, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4008, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4009, 0x0b}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400c, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x400d, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4010, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4043, 0x40}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4307, 0x30}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4317, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4501, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4507, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4509, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x450a, 0x08}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x04}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x470f, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4f07, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4800, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x9f}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5d00, 0x07}, - {OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5d01, 0x00} -}; - -/* ======================================================================== */ -static struct ov_camera_module_config ov9281_configs[] = { -{ - .name = "1280x800_60fps", - .frm_fmt = { - .width = 1280, - .height = 800, - .code = MEDIA_BUS_FMT_Y10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 120 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov9281_init_tab_1280_800_60fps, - .reg_table_num_entries = - sizeof(ov9281_init_tab_1280_800_60fps) / - sizeof(ov9281_init_tab_1280_800_60fps[0]), - .v_blanking_time_us = 7251, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 450, 24000000) - } -}; - -/*--------------------------------------------------------------------------*/ -static int ov9281_g_VTS(struct ov_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = ov_camera_module_read_reg_table(cam_mod, - ov9281_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_read_reg_table(cam_mod, - ov9281_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - cam_mod->vts_cur = *vts; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int ov9281_auto_adjust_fps(struct ov_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - if ((cam_mod->exp_config.exp_time + ov9281_COARSE_INTG_TIME_MAX_MARGIN) - > cam_mod->vts_min) - vts = cam_mod->exp_config.exp_time + - ov9281_COARSE_INTG_TIME_MAX_MARGIN; - else - vts = cam_mod->vts_min; - ret = ov_camera_module_write_reg(cam_mod, - ov9281_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov9281_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, - "updated vts = %d,vts_min=%d\n", vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int ov9281_set_vts(struct ov_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts <= cam_mod->vts_min) - return ret; - - ret = ov_camera_module_write_reg(cam_mod, - ov9281_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - ov9281_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0x0F); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, - "updated vts = 0x%x,vts_min=0x%x\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - return ret; -} - -static int ov9281_write_aec(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_err(cam_mod, - "exp_time = %d, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if ((cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY) || - (cam_mod->state == OV_CAMERA_MODULE_STREAMING)) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time; - - a_gain = a_gain > 0x7ff ? 0x7ff : a_gain; - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - - exp_time = cam_mod->exp_config.exp_time << 4; - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - ret = ov_camera_module_write_reg(cam_mod, - ov9281_AEC_GROUP_UPDATE_ADDRESS, - ov9281_AEC_GROUP_UPDATE_START_DATA); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = ov9281_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - - ret |= ov_camera_module_write_reg(cam_mod, - ov9281_AEC_PK_LONG_GAIN_REG, - ov9281_FETCH_LSB_GAIN(a_gain)); - ret = ov_camera_module_write_reg(cam_mod, - ov9281_AEC_PK_LONG_EXPO_3RD_REG, - ov9281_FETCH_3RD_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov9281_AEC_PK_LONG_EXPO_2ND_REG, - ov9281_FETCH_2ND_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - ov9281_AEC_PK_LONG_EXPO_1ST_REG, - ov9281_FETCH_1ST_BYTE_EXP(exp_time)); - if (!cam_mod->auto_adjust_fps) - ret |= ov9281_set_vts(cam_mod, - cam_mod->exp_config.vts_value); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - ret = ov_camera_module_write_reg(cam_mod, - ov9281_AEC_GROUP_UPDATE_ADDRESS, - ov9281_AEC_GROUP_UPDATE_END_DATA); - ret = ov_camera_module_write_reg(cam_mod, - ov9281_AEC_GROUP_UPDATE_ADDRESS, - ov9281_AEC_GROUP_UPDATE_END_LAUNCH); - } - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int ov9281_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int ov9281_filltimings(struct ov_camera_module_custom_config *custom) -{ - size_t i; - int j; - struct ov_camera_module_config *config; - struct ov_camera_module_timings *timings; - struct ov_camera_module_reg *reg_table; - int reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - memset(timings, 0x00, sizeof(*timings)); - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case ov9281_TIMING_VTS_HIGH_REG: - timings->frame_length_lines = - ((reg_table[j].val << 8) | - (timings->frame_length_lines & 0xff)); - break; - case ov9281_TIMING_VTS_LOW_REG: - timings->frame_length_lines = - (reg_table[j].val | - (timings->frame_length_lines & 0xff00)); - break; - case ov9281_TIMING_HTS_HIGH_REG: - timings->line_length_pck = - ((reg_table[j].val << 8) | - timings->line_length_pck); - break; - case ov9281_TIMING_HTS_LOW_REG: - timings->line_length_pck = - (reg_table[j].val | - (timings->line_length_pck & 0xff00)); - break; - case ov9281_TIMING_X_INC: - timings->binning_factor_x = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_x == 0) - timings->binning_factor_x = 1; - break; - case ov9281_TIMING_Y_INC: - timings->binning_factor_y = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_y == 0) - timings->binning_factor_y = 1; - break; - case ov9281_HORIZONTAL_START_HIGH_REG: - timings->crop_horizontal_start = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_start & - 0xff)); - break; - case ov9281_HORIZONTAL_START_LOW_REG: - timings->crop_horizontal_start = - (reg_table[j].val | - (timings->crop_horizontal_start & - 0xff00)); - break; - case ov9281_VERTICAL_START_HIGH_REG: - timings->crop_vertical_start = - ((reg_table[j].val << 8) | - (timings->crop_vertical_start & 0xff)); - break; - case ov9281_VERTICAL_START_LOW_REG: - timings->crop_vertical_start = - ((reg_table[j].val) | - (timings->crop_vertical_start & - 0xff00)); - break; - case ov9281_HORIZONTAL_END_HIGH_REG: - timings->crop_horizontal_end = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_end & 0xff)); - break; - case ov9281_HORIZONTAL_END_LOW_REG: - timings->crop_horizontal_end = - (reg_table[j].val | - (timings->crop_horizontal_end & - 0xff00)); - break; - case ov9281_VERTICAL_END_HIGH_REG: - timings->crop_vertical_end = - ((reg_table[j].val << 8) | - (timings->crop_vertical_end & 0xff)); - break; - case ov9281_VERTICAL_END_LOW_REG: - timings->crop_vertical_end = - (reg_table[j].val | - (timings->crop_vertical_end & 0xff00)); - break; - case ov9281_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - ((reg_table[j].val << 8) | - (timings->sensor_output_width & 0xff)); - break; - case ov9281_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width = - (reg_table[j].val | - (timings->sensor_output_width & - 0xff00)); - break; - case ov9281_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - ((reg_table[j].val << 8) | - (timings->sensor_output_height & 0xff)); - break; - case ov9281_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height = - (reg_table[j].val | - (timings->sensor_output_height & - 0xff00)); - break; - case ov9281_AEC_PK_LONG_EXPO_1ST_REG: - timings->exp_time = - ((reg_table[j].val) | - (timings->exp_time & 0xffff00)); - break; - case ov9281_AEC_PK_LONG_EXPO_2ND_REG: - timings->exp_time = - ((reg_table[j].val << 8) | - (timings->exp_time & 0x00ff00)); - break; - case ov9281_AEC_PK_LONG_EXPO_3RD_REG: - timings->exp_time = - (((reg_table[j].val & 0x0f) << 16) | - (timings->exp_time & 0xff0000)); - break; - case ov9281_AEC_PK_LONG_GAIN_REG: - timings->gain = - ((reg_table[j].val) | - (timings->gain & 0x00ff)); - break; - } - } - - timings->exp_time >>= 4; - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator - * timings->frame_length_lines - * timings->line_length_pck; - - timings->coarse_integration_time_min = - ov9281_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - ov9281_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = - ov9281_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - ov9281_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -static int ov9281_g_timings(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - - return ret; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9281_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = ov9281_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d) 0x%x\n", ret, ctrl_id); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9281_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - /* Handles only exposure and gain together special case. */ - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = ov9281_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int ov9281_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "active config=%s\n", cam_mod->active_config->name); - - ret = ov9281_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - -#ifdef ov9281_SNAPSHOT_MODE - if (IS_ERR_VALUE(ov_camera_module_write_reg(cam_mod, 0x0100, 0))) - goto err; -#else - if (IS_ERR_VALUE(ov_camera_module_write_reg(cam_mod, 0x0100, 1))) - goto err; -#endif - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9281_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 0); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ -static int ov9281_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl = 0; - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret |= ov_camera_module_read_reg(cam_mod, 1, ov9281_PIDH_ADDR, &pidh); - ret |= ov_camera_module_read_reg(cam_mod, 1, ov9281_PIDL_ADDR, &pidl); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if ((pidh == ov9281_PIDH_MAGIC) && (pidl == ov9281_PIDL_MAGIC)) { - ov_camera_module_pr_debug(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - } else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - ov9281_PIDH_MAGIC, ov9281_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops ov9281_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops ov9281_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops ov9281_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops ov9281_camera_module_ops = { - .core = &ov9281_camera_module_core_ops, - .video = &ov9281_camera_module_video_ops, - .pad = &ov9281_camera_module_pad_ops -}; - -static struct ov_camera_module_custom_config ov9281_custom_config = { - .start_streaming = ov9281_start_streaming, - .stop_streaming = ov9281_stop_streaming, - .s_ctrl = ov9281_s_ctrl, - .s_vts = ov9281_auto_adjust_fps, - .s_ext_ctrls = ov9281_s_ext_ctrls, - .g_ctrl = ov9281_g_ctrl, - .g_timings = ov9281_g_timings, - .check_camera_id = ov9281_check_camera_id, - .configs = ov9281_configs, - .num_configs = ARRAY_SIZE(ov9281_configs), - .power_up_delays_ms = {5, 20, 0} -}; - -static int ov9281_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "tlc cam probing...\n"); - dev_dbg(&client->dev, "tlc cam debug...\n"); - ov9281_filltimings(&ov9281_custom_config); - client->flags |= I2C_CLIENT_SCCB; - v4l2_i2c_subdev_init(&ov9281.sd, client, &ov9281_camera_module_ops); - ov9281.custom = ov9281_custom_config; - - dev_info(&client->dev, "tlc cam probing successful\n"); - - return 0; -} - -static int ov9281_remove(struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - ov_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id ov9281_id[] = { - { ov9281_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id ov9281_of_match[] = { - {.compatible = "omnivision,ov9281-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, ov9281_id); - -static struct i2c_driver ov9281_i2c_driver = { - .driver = { - .name = ov9281_DRIVER_NAME, - .of_match_table = ov9281_of_match - }, - .probe = ov9281_probe, - .remove = ov9281_remove, - .id_table = ov9281_id, -}; - -module_i2c_driver(ov9281_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for ov9281"); -MODULE_AUTHOR("George"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/ov9750_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/ov9750_v4l2-i2c-subdev.c deleted file mode 100644 index a3605b63d519..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov9750_v4l2-i2c-subdev.c +++ /dev/null @@ -1,1052 +0,0 @@ -/* - * Copyright (C) 2017 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "ov_camera_module.h" - -#define OV9750_DRIVER_NAME "ov9750" - -#define OV9750_FETCH_LSB_GAIN(VAL) (VAL & 0xFF) -#define OV9750_FETCH_MSB_GAIN(VAL) ((VAL >> 8) & 0xff) -#define OV9750_AEC_PK_LONG_GAIN_HIGH_REG 0x3508 -#define OV9750_AEC_PK_LONG_GAIN_LOW_REG 0x3509 - -#define OV9750_AEC_PK_LONG_EXPO_3RD_REG 0x3500 -#define OV9750_AEC_PK_LONG_EXPO_2ND_REG 0x3501 -#define OV9750_AEC_PK_LONG_EXPO_1ST_REG 0x3502 - -#define OV9750_AEC_GROUP_UPDATE_ADDRESS 0x3208 -#define OV9750_AEC_GROUP_UPDATE_START_DATA 0x00 -#define OV9750_AEC_GROUP_UPDATE_END_DATA 0x10 -#define OV9750_AEC_GROUP_UPDATE_END_LAUNCH 0xA0 - -#define OV9750_FETCH_3RD_BYTE_EXP(VAL) (((VAL) >> 12) & 0xF) -#define OV9750_FETCH_2ND_BYTE_EXP(VAL) (((VAL) >> 4) & 0xFF) -#define OV9750_FETCH_1ST_BYTE_EXP(VAL) (((VAL) & 0x0F) << 4) - -#define OV9750_PIDH_ADDR 0x300B -#define OV9750_PIDL_ADDR 0x300C - -#define OV9750_PIDH_MAGIC 0x97 -#define OV9750_PIDL_MAGIC 0x50 - -#define OV9750_EXT_CLK 12000000 -#define OV9750_TIMING_VTS_HIGH_REG 0x380e -#define OV9750_TIMING_VTS_LOW_REG 0x380f -#define OV9750_TIMING_HTS_HIGH_REG 0x380c -#define OV9750_TIMING_HTS_LOW_REG 0x380d -#define OV9750_FINE_INTG_TIME_MIN 0 -#define OV9750_FINE_INTG_TIME_MAX_MARGIN 0 -#define OV9750_COARSE_INTG_TIME_MIN 1 -#define OV9750_COARSE_INTG_TIME_MAX_MARGIN 4 -#define OV9750_TIMING_X_INC 0x3814 -#define OV9750_TIMING_Y_INC 0x3815 -#define OV9750_HORIZONTAL_START_HIGH_REG 0x3800 -#define OV9750_HORIZONTAL_START_LOW_REG 0x3801 -#define OV9750_VERTICAL_START_HIGH_REG 0x3802 -#define OV9750_VERTICAL_START_LOW_REG 0x3803 -#define OV9750_HORIZONTAL_END_HIGH_REG 0x3804 -#define OV9750_HORIZONTAL_END_LOW_REG 0x3805 -#define OV9750_VERTICAL_END_HIGH_REG 0x3806 -#define OV9750_VERTICAL_END_LOW_REG 0x3807 -#define OV9750_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3808 -#define OV9750_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3809 -#define OV9750_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x380a -#define OV9750_VERTICAL_OUTPUT_SIZE_LOW_REG 0x380b -#define OV9750_H_WIN_OFF_HIGH_REG 0x3810 -#define OV9750_H_WIN_OFF_LOW_REG 0x3811 -#define OV9750_V_WIN_OFF_HIGH_REG 0x3812 -#define OV9750_V_WIN_OFF_LOW_REG 0x3813 - -static int cam_num; -static struct ov_camera_module ov9750[2]; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ -/* 1280x960 2lane MCLK:24MHz 60fps 800Mbps/lane, MCLK:12Mhz 30fps 400Mbps/lane */ -static struct ov_camera_module_reg ov9750_init_tab_1280_960_30fps[] = { -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0103, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_TIMEOUT, 0x0000, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_TIMEOUT, 0x0000, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0300, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0302, 0x64}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0303, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0304, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0305, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0306, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030a, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030b, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030d, 0x1e}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030e, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x030f, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x0312, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x031e, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3000, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3001, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3002, 0x21}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3005, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3011, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3016, 0x53}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0x32}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301a, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301b, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301c, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301d, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x301e, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3022, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3031, 0x0a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3032, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x303c, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x303e, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3040, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3041, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3042, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3104, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3106, 0x15}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3107, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3500, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3501, 0x38}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3502, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3503, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3504, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3505, 0x83}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3508, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3509, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3600, 0x65}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3601, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3602, 0x22}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3610, 0xe8}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x56}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3612, 0x48}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3613, 0x5a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3614, 0x91}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3615, 0x79}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3617, 0x57}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3621, 0x90}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3622, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3623, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3625, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3633, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3634, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3635, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x13}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3650, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3652, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3654, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3653, 0x34}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3655, 0x20}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3656, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3657, 0xc4}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x365a, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x365b, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x365e, 0xff}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x365f, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3668, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366a, 0x07}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366d, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x366e, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3702, 0x1d}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3703, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3704, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3705, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3706, 0x27}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3709, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370a, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x370b, 0x7d}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3714, 0x24}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x371a, 0x5e}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3730, 0x82}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3733, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x373e, 0x18}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3755, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3758, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x375b, 0x13}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3772, 0x23}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3773, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3774, 0x16}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3775, 0x12}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3776, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37a8, 0x38}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37b5, 0x36}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37c2, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37c5, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37c7, 0x38}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37c8, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x37d1, 0x13}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3800, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3801, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3803, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3804, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3805, 0x0f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3806, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3807, 0xcb}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3808, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3809, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380a, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380b, 0xc0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380c, 0x03},//hts -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380d, 0x2a}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380e, 0x03},//vts -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x380f, 0xdc}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3810, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3811, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3812, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3813, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3814, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3815, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3816, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3817, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3818, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3819, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3820, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3821, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3826, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3827, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382a, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x382b, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3836, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3838, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3861, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3862, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3863, 0x02}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3b00, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c00, 0x89}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c01, 0xab}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c02, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c03, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c04, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c05, 0x03}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c06, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c07, 0x05}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0c, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0d, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0e, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c0f, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c40, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c41, 0xa3}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c43, 0x7d}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c56, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c80, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c82, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3c83, 0x61}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3d85, 0x17}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f08, 0x08}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f0a, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3f0b, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4000, 0xcd}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4003, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4009, 0x0d}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4010, 0xf0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4011, 0x70}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4017, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4040, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4041, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4303, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4307, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4502, 0x40}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4503, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4508, 0xaa}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x450b, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x450c, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4600, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4601, 0x80}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4700, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4704, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4705, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x484a, 0x3f}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5001, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5002, 0x28}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5004, 0x0c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5006, 0x0c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5007, 0xe0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5008, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5009, 0xb0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x502a, 0x18}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5901, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5a01, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5a03, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5a04, 0x0c}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5a05, 0xe0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5a06, 0x09}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5a07, 0xb0}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5a08, 0x06}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e00, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x5e10, 0xfc}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3733, 0x10}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3610, 0xe8}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3611, 0x56}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3635, 0x14}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x13}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3620, 0x84}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3614, 0x96}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x481f, 0x30}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3788, 0x00}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3789, 0x04}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x378a, 0x01}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x378b, 0x60}, -{OV_CAMERA_MODULE_REG_TYPE_DATA, 0x3799, 0x27}, -}; - -/* ======================================================================== */ - -static struct ov_camera_module_config ov9750_configs[] = { - { - .name = "1280x960_30fps", - .frm_fmt = { - .width = 1280, - .height = 960, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)ov9750_init_tab_1280_960_30fps, - .reg_table_num_entries = - ARRAY_SIZE(ov9750_init_tab_1280_960_30fps), - .v_blanking_time_us = 3078, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 402, OV9750_EXT_CLK) - } -}; - -/*--------------------------------------------------------------------------*/ - -static int ov9750_dual_mode(struct ov_camera_module *cam_mod) -{ - if (cam_mod->as_master == 1) { - ov_camera_module_write_reg(cam_mod, 0x3002, 0xa1); - ov_camera_module_write_reg(cam_mod, 0x3007, 0x02); - ov_camera_module_write_reg(cam_mod, 0x3816, 0x00); - ov_camera_module_write_reg(cam_mod, 0x3817, 0x00); - ov_camera_module_write_reg(cam_mod, 0x3818, 0x00); - ov_camera_module_write_reg(cam_mod, 0x3819, 0x01); - ov_camera_module_write_reg(cam_mod, 0x3823, 0x00); - ov_camera_module_write_reg(cam_mod, 0x3824, 0x00); - } else if (cam_mod->as_master == 0) { - ov_camera_module_write_reg(cam_mod, 0x3002, 0x21); - ov_camera_module_write_reg(cam_mod, 0x3823, 0x48); - ov_camera_module_write_reg(cam_mod, 0x3824, 0x11); - } else { - ;/* do nothing */ - } - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9750_set_flip(struct ov_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - int i, mode = 0; - u16 match_reg[3]; - - mode = ov_camera_module_get_flip_mirror(cam_mod); - - if (mode == -1) { - ov_camera_module_pr_debug(cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - if (mode == OV_FLIP_BIT_MASK) { - match_reg[0] = 0x86; - match_reg[1] = 0x40; - match_reg[2] = 0x20; - } else if (mode == OV_MIRROR_BIT_MASK) { - match_reg[0] = 0x80; - match_reg[1] = 0x46; - match_reg[2] = 0x00; - } else if (mode == (OV_MIRROR_BIT_MASK | - OV_FLIP_BIT_MASK)) { - match_reg[0] = 0x86; - match_reg[1] = 0x46; - match_reg[2] = 0x20; - } else { - match_reg[0] = 0x80; - match_reg[1] = 0x40; - match_reg[2] = 0x00; - } - - for (i = len; i > 0; i--) { - if (reglist[i].reg == 0x3820) - reglist[i].val = match_reg[0]; - else if (reglist[i].reg == 0x3821) - reglist[i].val = match_reg[1]; - else if (reglist[i].reg == 0x450b) - reglist[i].val = match_reg[2]; - } - - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int OV9750_g_VTS(struct ov_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = ov_camera_module_read_reg_table(cam_mod, - OV9750_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_read_reg_table(cam_mod, - OV9750_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - - return 0; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int OV9750_auto_adjust_fps(struct ov_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - if ((exp_time + OV9750_COARSE_INTG_TIME_MAX_MARGIN) - > cam_mod->vts_min) - vts = exp_time + OV9750_COARSE_INTG_TIME_MAX_MARGIN; - else - vts = cam_mod->vts_min; - - ret = ov_camera_module_write_reg(cam_mod, - OV9750_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - OV9750_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0x0F); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, - "updated vts = 0x%x,vts_min=0x%x\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int ov9750_set_vts(struct ov_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts <= cam_mod->vts_min) - return ret; - - ret = ov_camera_module_write_reg(cam_mod, - OV9750_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= ov_camera_module_write_reg(cam_mod, - OV9750_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0x0F); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - ov_camera_module_pr_info(cam_mod, - "updated vts = 0x%x,vts_min=0x%x\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - return ret; -} - -static int ov9750_write_aec(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, - "exp_time = %d lines, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if (cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY || - cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time = cam_mod->exp_config.exp_time; - - mutex_lock(&cam_mod->lock); - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - if (a_gain < 0x80) - a_gain = 0x80; - if (a_gain > 0x7c0) - a_gain = 0x7c0; - if (exp_time < 4) - exp_time = 4; - - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - ret = ov_camera_module_write_reg(cam_mod, - OV9750_AEC_GROUP_UPDATE_ADDRESS, - OV9750_AEC_GROUP_UPDATE_START_DATA); - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret = OV9750_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - ret |= ov_camera_module_write_reg(cam_mod, - OV9750_AEC_PK_LONG_GAIN_HIGH_REG, - OV9750_FETCH_MSB_GAIN(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, - OV9750_AEC_PK_LONG_GAIN_LOW_REG, - OV9750_FETCH_LSB_GAIN(a_gain)); - ret |= ov_camera_module_write_reg(cam_mod, - OV9750_AEC_PK_LONG_EXPO_3RD_REG, - OV9750_FETCH_3RD_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - OV9750_AEC_PK_LONG_EXPO_2ND_REG, - OV9750_FETCH_2ND_BYTE_EXP(exp_time)); - ret |= ov_camera_module_write_reg(cam_mod, - OV9750_AEC_PK_LONG_EXPO_1ST_REG, - OV9750_FETCH_1ST_BYTE_EXP(exp_time)); - - if (!cam_mod->auto_adjust_fps) - ret |= ov9750_set_vts(cam_mod, cam_mod->exp_config.vts_value); - - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - ret |= ov_camera_module_write_reg(cam_mod, - OV9750_AEC_GROUP_UPDATE_ADDRESS, - OV9750_AEC_GROUP_UPDATE_END_DATA); - ret |= ov_camera_module_write_reg(cam_mod, - OV9750_AEC_GROUP_UPDATE_ADDRESS, - OV9750_AEC_GROUP_UPDATE_END_LAUNCH); - } - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int ov9750_g_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9750_filltimings(struct ov_camera_module_custom_config *custom) -{ - u32 i, j; - u32 win_h_off = 0, win_v_off = 0; - struct ov_camera_module_config *config; - struct ov_camera_module_timings *timings; - struct ov_camera_module_reg *reg_table; - u32 reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - memset(timings, 0x00, sizeof(*timings)); - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case OV9750_TIMING_VTS_HIGH_REG: - timings->frame_length_lines = - ((reg_table[j].val << 8) | - (timings->frame_length_lines & 0xff)); - break; - case OV9750_TIMING_VTS_LOW_REG: - timings->frame_length_lines = - (reg_table[j].val | - (timings->frame_length_lines & 0xff00)); - break; - case OV9750_TIMING_HTS_HIGH_REG: - timings->line_length_pck = - ((reg_table[j].val << 8) | - timings->line_length_pck); - break; - case OV9750_TIMING_HTS_LOW_REG: - timings->line_length_pck = - (reg_table[j].val | - (timings->line_length_pck & 0xff00)); - break; - case OV9750_TIMING_X_INC: - timings->binning_factor_x = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_x == 0) - timings->binning_factor_x = 1; - break; - case OV9750_TIMING_Y_INC: - timings->binning_factor_y = - ((reg_table[j].val >> 4) + 1) / 2; - if (timings->binning_factor_y == 0) - timings->binning_factor_y = 1; - break; - case OV9750_HORIZONTAL_START_HIGH_REG: - timings->crop_horizontal_start = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_start & - 0xff)); - break; - case OV9750_HORIZONTAL_START_LOW_REG: - timings->crop_horizontal_start = - (reg_table[j].val | - (timings->crop_horizontal_start & - 0xff00)); - break; - case OV9750_VERTICAL_START_HIGH_REG: - timings->crop_vertical_start = - ((reg_table[j].val << 8) | - (timings->crop_vertical_start & 0xff)); - break; - case OV9750_VERTICAL_START_LOW_REG: - timings->crop_vertical_start = - ((reg_table[j].val) | - (timings->crop_vertical_start & - 0xff00)); - break; - case OV9750_HORIZONTAL_END_HIGH_REG: - timings->crop_horizontal_end = - ((reg_table[j].val << 8) | - (timings->crop_horizontal_end & 0xff)); - break; - case OV9750_HORIZONTAL_END_LOW_REG: - timings->crop_horizontal_end = - (reg_table[j].val | - (timings->crop_horizontal_end & - 0xff00)); - break; - case OV9750_VERTICAL_END_HIGH_REG: - timings->crop_vertical_end = - ((reg_table[j].val << 8) | - (timings->crop_vertical_end & 0xff)); - break; - case OV9750_VERTICAL_END_LOW_REG: - timings->crop_vertical_end = - (reg_table[j].val | - (timings->crop_vertical_end & 0xff00)); - break; - case OV9750_H_WIN_OFF_HIGH_REG: - win_h_off = (reg_table[j].val & 0xf) << 8; - break; - case OV9750_H_WIN_OFF_LOW_REG: - win_h_off |= (reg_table[j].val & 0xff); - break; - case OV9750_V_WIN_OFF_HIGH_REG: - win_v_off = (reg_table[j].val & 0xf) << 8; - break; - case OV9750_V_WIN_OFF_LOW_REG: - win_v_off |= (reg_table[j].val & 0xff); - break; - case OV9750_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - ((reg_table[j].val << 8) | - (timings->sensor_output_width & 0xff)); - break; - case OV9750_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width = - (reg_table[j].val | - (timings->sensor_output_width & - 0xff00)); - break; - case OV9750_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - ((reg_table[j].val << 8) | - (timings->sensor_output_height & 0xff)); - break; - case OV9750_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height = - (reg_table[j].val | - (timings->sensor_output_height & - 0xff00)); - break; - } - } - - timings->crop_horizontal_start += win_h_off; - timings->crop_horizontal_end -= win_h_off; - timings->crop_vertical_start += win_v_off; - timings->crop_vertical_end -= win_v_off; - - timings->exp_time >>= 4; - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator * - timings->frame_length_lines * - timings->line_length_pck; - - timings->coarse_integration_time_min = - OV9750_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - OV9750_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = - OV9750_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - OV9750_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9750_g_timings(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - - timings->frame_length_lines = vts; - return ret; -err: - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9750_s_ctrl(struct ov_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = ov9750_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - case V4L2_CID_FOCUS_ABSOLUTE: - /* todo*/ - break; - /* - * case RK_V4L2_CID_FPS_CTRL: - * if (cam_mod->auto_adjust_fps) - * ret = OV9750_auto_adjust_fps( - * cam_mod, - * cam_mod->exp_config.exp_time); - * break; - */ - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9750_s_ext_ctrls(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - /* Handles only exposure and gain together special case. */ - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = ov9750_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - ov_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9750_start_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_info(cam_mod, - "active config=%s\n", - cam_mod->active_config->name); - - ov9750_dual_mode(cam_mod); - - ret = OV9750_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 0x01); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9750_stop_streaming(struct ov_camera_module *cam_mod) -{ - int ret = 0; - - ov_camera_module_pr_info(cam_mod, "\n"); - mutex_lock(&cam_mod->lock); - ret = ov_camera_module_write_reg(cam_mod, 0x0100, 0x00); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - msleep(25); - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int ov9750_check_camera_id(struct ov_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - ov_camera_module_pr_debug(cam_mod, "\n"); - - ret |= ov_camera_module_read_reg(cam_mod, 1, OV9750_PIDH_ADDR, &pidh); - ret |= ov_camera_module_read_reg(cam_mod, 1, OV9750_PIDL_ADDR, &pidl); - - if (IS_ERR_VALUE(ret)) { - ov_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if (pidh == OV9750_PIDH_MAGIC && pidl == OV9750_PIDL_MAGIC) { - ov_camera_module_pr_info(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - } else { - ov_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - OV9750_PIDH_MAGIC, OV9750_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - ov_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops ov9750_camera_module_core_ops = { - .g_ctrl = ov_camera_module_g_ctrl, - .s_ctrl = ov_camera_module_s_ctrl, - .s_ext_ctrls = ov_camera_module_s_ext_ctrls, - .s_power = ov_camera_module_s_power, - .ioctl = ov_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops ov9750_camera_module_video_ops = { - .s_frame_interval = ov_camera_module_s_frame_interval, - .g_frame_interval = ov_camera_module_g_frame_interval, - .s_stream = ov_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops ov9750_camera_module_pad_ops = { - .enum_frame_interval = ov_camera_module_enum_frameintervals, - .get_fmt = ov_camera_module_g_fmt, - .set_fmt = ov_camera_module_s_fmt, - .enum_frame_size = ov_camera_module_enum_frame_size, -}; - -static struct v4l2_subdev_ops ov9750_camera_module_ops = { - .core = &ov9750_camera_module_core_ops, - .video = &ov9750_camera_module_video_ops, - .pad = &ov9750_camera_module_pad_ops -}; - -static struct ov_camera_module_custom_config ov9750_custom_config = { - .start_streaming = ov9750_start_streaming, - .stop_streaming = ov9750_stop_streaming, - .s_ctrl = ov9750_s_ctrl, - .g_ctrl = ov9750_g_ctrl, - .s_ext_ctrls = ov9750_s_ext_ctrls, - .g_timings = ov9750_g_timings, - .set_flip = ov9750_set_flip, - .s_vts = OV9750_auto_adjust_fps, - .check_camera_id = ov9750_check_camera_id, - .configs = ov9750_configs, - .num_configs = ARRAY_SIZE(ov9750_configs), - .power_up_delays_ms = {5, 30, 30}, - .exposure_valid_frame = {4, 4} -}; - -static int ov9750_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - int ret = 0; - int as_master = -1; - struct device_node *np = of_node_get(client->dev.of_node); - - dev_info(&client->dev, "probing cam_num:%d 0x%x\n", - cam_num, client->addr); - - ov9750_filltimings(&ov9750_custom_config); - v4l2_i2c_subdev_init(&ov9750[cam_num].sd, client, - &ov9750_camera_module_ops); - - ov9750[cam_num].sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; - ov9750[cam_num].custom = ov9750_custom_config; - - mutex_init(&ov9750[cam_num].lock); - - ret = of_property_read_u32(np, "as-master", &as_master); - ov9750[cam_num].as_master = (ret == 0) ? as_master : -1; - cam_num++; - - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -/* ======================================================================== */ - -static int ov9750_remove(struct i2c_client *client) -{ - struct ov_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; - - mutex_destroy(&cam_mod->lock); - ov_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id ov9750_id[] = { - { OV9750_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id ov9750_of_match[] = { - {.compatible = "omnivision,ov9750-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, ov9750_id); - -static struct i2c_driver ov9750_i2c_driver = { - .driver = { - .name = OV9750_DRIVER_NAME, - .of_match_table = ov9750_of_match - }, - .probe = ov9750_probe, - .remove = ov9750_remove, - .id_table = ov9750_id, -}; - -module_i2c_driver(ov9750_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for ov9750"); -MODULE_AUTHOR("Cain"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/ov_camera_module.c b/drivers/media/i2c/soc_camera/rockchip/ov_camera_module.c deleted file mode 100644 index 032984869999..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov_camera_module.c +++ /dev/null @@ -1,1356 +0,0 @@ -/* - * ov_camera_module.c - * - * Generic omnivision sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "ov_camera_module.h" - -static struct ov_camera_module *to_ov_camera_module(struct v4l2_subdev *sd) -{ - return container_of(sd, struct ov_camera_module, sd); -} - -/* ======================================================================== */ - -static void ov_camera_module_reset( - struct ov_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->inited = false; - cam_mod->active_config = NULL; - cam_mod->update_config = true; - cam_mod->frm_fmt_valid = false; - cam_mod->frm_intrvl_valid = false; - cam_mod->exp_config.auto_exp = false; - cam_mod->exp_config.auto_gain = false; - cam_mod->wb_config.auto_wb = false; - cam_mod->auto_adjust_fps = true; - cam_mod->rotation = 0; - cam_mod->ctrl_updt = 0; - cam_mod->state = OV_CAMERA_MODULE_POWER_OFF; - cam_mod->state_before_suspend = OV_CAMERA_MODULE_POWER_OFF; - - cam_mod->exp_config.exp_time = 0; - cam_mod->exp_config.gain = 0; - cam_mod->vts_cur = 0; -} - -/* ======================================================================== */ - -static void ov_camera_module_set_active_config( - struct ov_camera_module *cam_mod, - struct ov_camera_module_config *new_config) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(new_config)) { - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no active config\n"); - } else { - cam_mod->ctrl_updt &= OV_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP | - OV_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN | - OV_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - if (new_config->auto_exp_enabled != - cam_mod->exp_config.auto_exp) { - cam_mod->ctrl_updt |= - OV_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = - new_config->auto_exp_enabled; - } - if (new_config->auto_gain_enabled != - cam_mod->exp_config.auto_gain) { - cam_mod->ctrl_updt |= - OV_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = - new_config->auto_gain_enabled; - } - if (new_config->auto_wb_enabled != - cam_mod->wb_config.auto_wb) { - cam_mod->ctrl_updt |= - OV_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = - new_config->auto_wb_enabled; - } - if (new_config != cam_mod->active_config) { - cam_mod->update_config = true; - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "activating config '%s'\n", - cam_mod->active_config->name); - } - } -} - -/* ======================================================================== */ - -static struct ov_camera_module_config *ov_camera_module_find_config( - struct ov_camera_module *cam_mod, - struct v4l2_mbus_framefmt *fmt, - struct v4l2_subdev_frame_interval *frm_intrvl) -{ - u32 i; - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - - if (!IS_ERR_OR_NULL(fmt)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (!IS_ERR_OR_NULL(frm_intrvl)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "frame interval %d/%d\n", - frm_intrvl->interval.numerator, - frm_intrvl->interval.denominator); - - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (!IS_ERR_OR_NULL(frm_intrvl)) { - gcdiv = gcd(cam_mod->custom.configs[i]. - frm_intrvl.interval.numerator, - cam_mod->custom.configs[i]. - frm_intrvl.interval.denominator); - norm_interval.interval.numerator = - cam_mod->custom.configs[i]. - frm_intrvl.interval.numerator / gcdiv; - norm_interval.interval.denominator = - cam_mod->custom.configs[i]. - frm_intrvl.interval.denominator / gcdiv; - if ((frm_intrvl->interval.numerator != - norm_interval.interval.numerator) || - (frm_intrvl->interval.denominator != - norm_interval.interval.denominator)) - continue; - } - if (!IS_ERR_OR_NULL(fmt)) { - if ((cam_mod->custom.configs[i].frm_fmt.width != - fmt->width) || - (cam_mod->custom.configs[i].frm_fmt.height != - fmt->height) || - (cam_mod->custom.configs[i].frm_fmt.code != - fmt->code)) { - continue; - } - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "found matching config %s\n", - cam_mod->custom.configs[i].name); - return &cam_mod->custom.configs[i]; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no matching config found\n"); - - return ERR_PTR(-EINVAL); -} - -/* ======================================================================== */ - -static int ov_camera_module_write_config( - struct ov_camera_module *cam_mod) -{ - int ret = 0; - struct ov_camera_module_reg *reg_table; - u32 reg_table_num_entries; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - - if (!cam_mod->inited) { - cam_mod->active_config->soft_reset = true; - reg_table = cam_mod->active_config->reg_table; - reg_table_num_entries = - cam_mod->active_config->reg_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s\n", - cam_mod->active_config->name); - } else { - if (cam_mod->active_config->reg_diff_table && - cam_mod->active_config->reg_diff_table_num_entries) { - cam_mod->active_config->soft_reset = false; - reg_table = cam_mod->active_config->reg_diff_table; - reg_table_num_entries = - cam_mod->active_config->reg_diff_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s%s\n", - cam_mod->active_config->name, "_diff"); - } else { - cam_mod->active_config->soft_reset = true; - reg_table = cam_mod->active_config->reg_table; - reg_table_num_entries = - cam_mod->active_config->reg_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s\n", - cam_mod->active_config->name); - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.set_flip)) - cam_mod->custom.set_flip(cam_mod, - reg_table, reg_table_num_entries); - - ret = pltfrm_camera_module_write_reglist(&cam_mod->sd, - reg_table, reg_table_num_entries); - if (IS_ERR_VALUE(ret)) - goto err; - ret = pltfrm_camera_module_patch_config(&cam_mod->sd, - &cam_mod->frm_fmt, - &cam_mod->frm_intrvl); - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -static int ov_camera_module_attach( - struct ov_camera_module *cam_mod) -{ - int ret = 0; - struct ov_camera_module_custom_config *custom; - - custom = &cam_mod->custom; - - if (custom->check_camera_id) { - ov_camera_module_s_power(&cam_mod->sd, 1); - ret = custom->check_camera_id(cam_mod); - ov_camera_module_s_power(&cam_mod->sd, 0); - if (ret != 0) - goto err; - } - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - ov_camera_module_release(cam_mod); - return ret; -} - -/* ======================================================================== */ - -int ov_camera_module_try_fmt(struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *fmt) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(ov_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "format not supported\n"); - return -EINVAL; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, "format supported\n"); - - return 0; -} - -/* ======================================================================== */ - -int ov_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(ov_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "format %dx%d, code 0x%04x, not supported\n", - fmt->width, fmt->height, fmt->code); - ret = -EINVAL; - goto err; - } - cam_mod->frm_fmt_valid = true; - cam_mod->frm_fmt = *fmt; - if (cam_mod->frm_intrvl_valid) { - ov_camera_module_set_active_config(cam_mod, - ov_camera_module_find_config(cam_mod, - fmt, &cam_mod->frm_intrvl)); - } else { - ov_camera_module_set_active_config(cam_mod, - ov_camera_module_find_config(cam_mod, - fmt, NULL)); - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int ov_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->active_config) { - fmt->code = cam_mod->active_config->frm_fmt.code; - fmt->width = cam_mod->active_config->frm_fmt.width; - fmt->height = cam_mod->active_config->frm_fmt.height; - return 0; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "no active config\n"); - - return -1; -} - -/* ======================================================================== */ - -int ov_camera_module_enum_frame_size( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_size_enum *fse) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - - if (fse->index >= cam_mod->custom.num_configs) - return -EINVAL; - - fse->code = - cam_mod->custom.configs[fse->index].frm_fmt.code; - fse->max_width = - cam_mod->custom.configs[fse->index].frm_fmt.width; - fse->max_height = - cam_mod->custom.configs[fse->index].frm_fmt.height; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d", - fse->max_width, fse->max_height); - return 0; -} - -/* ======================================================================== */ - -int ov_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - struct ov_camera_module_config *config; - unsigned int vts; - int ret = 0; - - if ((interval->interval.denominator == 0) || - (interval->interval.numerator == 0)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "invalid frame interval %d/%d\n", - interval->interval.numerator, - interval->interval.denominator); - ret = -EINVAL; - goto err; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d/%d (%dfps)\n", - interval->interval.numerator, interval->interval.denominator, - (interval->interval.denominator + - (interval->interval.numerator >> 1)) / - interval->interval.numerator); - - /* normalize interval */ - gcdiv = gcd(interval->interval.numerator, - interval->interval.denominator); - norm_interval.interval.numerator = - interval->interval.numerator / gcdiv; - norm_interval.interval.denominator = - interval->interval.denominator / gcdiv; - - if (!cam_mod->frm_fmt_valid) - goto end; - config = ov_camera_module_find_config( - cam_mod, - &cam_mod->active_config->frm_fmt, - &norm_interval); - - if (!IS_ERR_OR_NULL(config) && (config != cam_mod->active_config)) { - ov_camera_module_set_active_config(cam_mod, config); - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - cam_mod->custom.stop_streaming(cam_mod); - ov_camera_module_write_config(cam_mod); - cam_mod->custom.start_streaming(cam_mod); - } - } else { - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - if (cam_mod->active_config->frm_intrvl.interval.denominator < - norm_interval.interval.denominator) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "%dx%d@%dfps isn't support!", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - norm_interval.interval.denominator); - ret = -EFAULT; - goto err; - } - if (!cam_mod->custom.s_vts) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "custom.s_vts isn't support!"); - ret = -EFAULT; - goto err; - } - - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= norm_interval.interval.denominator; - cam_mod->vts_cur = vts; - - if (cam_mod->state != OV_CAMERA_MODULE_STREAMING) - goto end; - - cam_mod->custom.s_vts(cam_mod, vts); - } - -end: - cam_mod->frm_intrvl_valid = true; - cam_mod->frm_intrvl = norm_interval; - cam_mod->auto_adjust_fps = false; - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -int ov_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - - if (cam_mod->active_config) { - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - if (cam_mod->frm_intrvl_valid) { - *interval = cam_mod->frm_intrvl; - return 0; - } else { - *interval = cam_mod->active_config->frm_intrvl; - return 0; - } - } - } - - return -EFAULT; -} - -/* ======================================================================== */ - -int ov_camera_module_s_stream(struct v4l2_subdev *sd, int enable) -{ - int ret = 0; - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - unsigned int vts; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", enable); - - if (enable) { - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - return 0; - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration, cannot start streaming\n"); - ret = -EFAULT; - goto err; - } - if (cam_mod->state != OV_CAMERA_MODULE_SW_STANDBY) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "sensor is not powered on (in state %d), cannot start streaming\n", - cam_mod->state); - ret = -EINVAL; - goto err; - } - if (cam_mod->update_config) { - ret = ov_camera_module_write_config(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - } - - ret = cam_mod->custom.start_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - if (cam_mod->frm_intrvl_valid) { - if ((cam_mod->frm_intrvl.interval.numerator != - cam_mod->active_config->frm_intrvl.interval.numerator) || - (cam_mod->frm_intrvl.interval.denominator != - cam_mod->active_config->frm_intrvl.interval.denominator)) { - if (cam_mod->frm_intrvl.interval.denominator > - cam_mod->active_config->frm_intrvl.interval.denominator) { - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "sensor is not support stream: %dx%d@(%d/%d)fps!\n", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - cam_mod->frm_intrvl.interval.denominator, - cam_mod->frm_intrvl.interval.numerator); - goto end; - } - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= cam_mod->frm_intrvl.interval.denominator; - cam_mod->custom.s_vts(cam_mod, vts); - } - } - - if (!cam_mod->inited && cam_mod->update_config) - cam_mod->inited = true; - cam_mod->update_config = false; - cam_mod->ctrl_updt = 0; - mdelay(cam_mod->custom.power_up_delays_ms[2]); - cam_mod->state = OV_CAMERA_MODULE_STREAMING; - } else { - int pclk; - int wait_ms; - struct isp_supplemental_sensor_mode_data timings; - - if (cam_mod->state != OV_CAMERA_MODULE_STREAMING) - return 0; - ret = cam_mod->custom.stop_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = ov_camera_module_ioctl(sd, - RK_VIDIOC_SENSOR_MODE_DATA, - &timings); - - cam_mod->state = OV_CAMERA_MODULE_SW_STANDBY; - - if (IS_ERR_VALUE(ret)) - goto err; - - pclk = timings.vt_pix_clk_freq_hz / 1000; - - if (!pclk) - goto err; - - wait_ms = - (timings.line_length_pck * - timings.frame_length_lines) / - pclk; - - /* - * wait for a frame period to make sure that there is - * no pending frame left. - */ - - msleep(wait_ms + 1); - } - -end: - cam_mod->state_before_suspend = cam_mod->state; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int ov_camera_module_s_power(struct v4l2_subdev *sd, int on) -{ - int ret = 0; - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - struct v4l2_subdev *af_ctrl; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", on); - - if (on) { - if (cam_mod->state == OV_CAMERA_MODULE_POWER_OFF) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 1); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[0]); - cam_mod->state = OV_CAMERA_MODULE_HW_STANDBY; - } - } - if (cam_mod->state == OV_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[1]); - cam_mod->state = OV_CAMERA_MODULE_SW_STANDBY; - if (!IS_ERR_OR_NULL( - cam_mod->custom.init_common) && - cam_mod->custom.init_common( - cam_mod)) - usleep_range(1000, 1500); - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - v4l2_subdev_call(af_ctrl, - core, init, 0); - } - } - } - if (cam_mod->update_config) { - ov_camera_module_write_config(cam_mod); - cam_mod->update_config = false; - } - } else { - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) { - ret = ov_camera_module_s_stream(sd, 0); - if (!IS_ERR_VALUE(ret)) - cam_mod->state = OV_CAMERA_MODULE_SW_STANDBY; - } - if (cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - - if (!IS_ERR_VALUE(ret)) - cam_mod->state = OV_CAMERA_MODULE_HW_STANDBY; - } - if (cam_mod->state == OV_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 0); - if (!IS_ERR_VALUE(ret)) { - cam_mod->state = OV_CAMERA_MODULE_POWER_OFF; - ov_camera_module_reset(cam_mod); - } - } - } - - cam_mod->state_before_suspend = cam_mod->state; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "%s failed, camera left in state %d\n", - on ? "on" : "off", cam_mod->state); - goto err; - } else - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "camera powered %s\n", on ? "on" : "off"); - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int ov_camera_module_g_ctrl(struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - int ret; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, " id 0x%x\n", ctrl->id); - - if (ctrl->id == V4L2_CID_FLASH_LED_MODE) { - ctrl->value = cam_mod->exp_config.flash_mode; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_HFLIP) { - ctrl->value = cam_mod->hflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_HFLIP %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_VFLIP) { - ctrl->value = cam_mod->vflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_VFLIP %d\n", - ctrl->value); - return 0; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active configuration\n"); - return -EFAULT; - } - - if (ctrl->id == RK_V4L2_CID_VBLANKING) { - ctrl->value = cam_mod->active_config->v_blanking_time_us; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_VBLANKING %d\n", - ctrl->value); - return 0; - } - - if ((cam_mod->state != OV_CAMERA_MODULE_SW_STANDBY) && - (cam_mod->state != OV_CAMERA_MODULE_STREAMING)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cannot get controls when camera is off\n"); - return -EFAULT; - } - - if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - ret = v4l2_subdev_call(af_ctrl, core, g_ctrl, ctrl); - return ret; - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.g_ctrl)) { - ret = cam_mod->custom.g_ctrl(cam_mod, ctrl->id); - if (IS_ERR_VALUE(ret)) - return ret; - } - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl->value = cam_mod->exp_config.gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE: - ctrl->value = cam_mod->exp_config.exp_time; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl->value = cam_mod->wb_config.temperature; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.preset_id; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl->value = cam_mod->exp_config.auto_gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl->value = cam_mod->exp_config.auto_exp; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.auto_wb; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - ctrl->value = cam_mod->af_config.abs_pos; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - default: - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed, unknown ctrl %d\n", ctrl->id); - return -EINVAL; - } - - return 0; -} - -static int flash_light_ctrl( - struct v4l2_subdev *sd, - struct ov_camera_module *cam_mod, - int value) -{ - return 0; -} - -/* ======================================================================== */ - -int ov_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls) -{ - int i; - int ctrl_cnt = 0; - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - struct ov_camera_module_ext_ctrls ov_ctrls; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - if (ctrls->count == 0) - return -EINVAL; - - for (i = 0; i < ctrls->count; i++) { - struct v4l2_ext_control *ctrl; - u32 ctrl_updt = 0; - - ctrl = &ctrls->controls[i]; - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl_updt = OV_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case RK_V4L2_CID_GAIN_PERCENT: - ctrl_updt = OV_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain_percent = ctrl->value; - break; - case V4L2_CID_FLASH_LED_MODE: - ret = flash_light_ctrl(sd, cam_mod, ctrl->value); - if (ret == 0) { - cam_mod->exp_config.flash_mode = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - } - break; - case V4L2_CID_EXPOSURE: - ctrl_updt = OV_CAMERA_MODULE_CTRL_UPDT_EXP_TIME; - cam_mod->exp_config.exp_time = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_VTS: - ctrl_updt = OV_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE; - cam_mod->exp_config.vts_value = ctrl->value; - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl_updt = OV_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE; - cam_mod->wb_config.temperature = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl_updt = OV_CAMERA_MODULE_CTRL_UPDT_PRESET_WB; - cam_mod->wb_config.preset_id = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl_updt = OV_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl_updt = OV_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl_updt = OV_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_AUTO_FPS: - cam_mod->auto_adjust_fps = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_AUTO_FPS %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - struct v4l2_control single_ctrl; - - single_ctrl.id = - V4L2_CID_FOCUS_ABSOLUTE; - single_ctrl.value = ctrl->value; - ret = v4l2_subdev_call(af_ctrl, - core, s_ctrl, &single_ctrl); - return ret; - } - } - ctrl_updt = - OV_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE; - cam_mod->af_config.abs_pos = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - case V4L2_CID_HFLIP: - if (ctrl->value) - cam_mod->hflip = true; - else - cam_mod->hflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_VFLIP: - if (ctrl->value) - cam_mod->vflip = true; - else - cam_mod->vflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_TEST_PATTERN: - ov_ctrls.ctrls = - kmalloc_array(ctrls->count, - sizeof(*ov_ctrls.ctrls), - GFP_KERNEL); - if (ov_ctrls.ctrls) { - for (i = 0; i < ctrls->count; i++) { - ov_ctrls.ctrls[i].id = - ctrls->controls[i].id; - ov_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - ov_ctrls.count = ctrls->count; - ret = cam_mod->custom.s_ext_ctrls(cam_mod, - &ov_ctrls); - } - kfree(ov_ctrls.ctrls); - break; - default: - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "ignoring unknown ctrl 0x%x\n", ctrl->id); - break; - } - - if (cam_mod->state != OV_CAMERA_MODULE_SW_STANDBY && - cam_mod->state != OV_CAMERA_MODULE_STREAMING) - cam_mod->ctrl_updt |= ctrl_updt; - else if (ctrl_updt) - ctrl_cnt++; - } - - /* if camera module is already streaming, write through */ - if (ctrl_cnt && - (cam_mod->state == OV_CAMERA_MODULE_STREAMING || - cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY)) { - struct ov_camera_module_ext_ctrls ov_ctrls; - - ov_ctrls.ctrls = - (struct ov_camera_module_ext_ctrl *) - kmalloc(ctrl_cnt * sizeof(struct ov_camera_module_ext_ctrl), - GFP_KERNEL); - - if (ov_ctrls.ctrls) { - for (i = 0; i < ctrl_cnt; i++) { - ov_ctrls.ctrls[i].id = ctrls->controls[i].id; - ov_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - - ov_ctrls.count = ctrl_cnt; - - ret = cam_mod->custom.s_ext_ctrls(cam_mod, &ov_ctrls); - - kfree(ov_ctrls.ctrls); - } else { - ret = -ENOMEM; - } - if (IS_ERR_VALUE(ret)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed with error %d\n", ret); - } - - return ret; -} - -/* ======================================================================== */ - -int ov_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - struct v4l2_ext_control ext_ctrl[1]; - struct v4l2_ext_controls ext_ctrls; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "0x%x 0x%x\n", ctrl->id, ctrl->value); - - ext_ctrl[0].id = ctrl->id; - ext_ctrl[0].value = ctrl->value; - - ext_ctrls.count = 1; - ext_ctrls.controls = ext_ctrl; - - return ov_camera_module_s_ext_ctrls(sd, &ext_ctrls); -} - -/* ======================================================================== */ - -long ov_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - int ret, i; - unsigned int flag, val; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "cmd: 0x%x\n", cmd); - - if (cmd == RK_VIDIOC_SENSOR_MODE_DATA) { - struct ov_camera_module_timings ov_timings; - struct isp_supplemental_sensor_mode_data *timings = - (struct isp_supplemental_sensor_mode_data *)arg; - - if (cam_mod->custom.g_timings) - ret = cam_mod->custom.g_timings(cam_mod, &ov_timings); - else - ret = -EPERM; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; - } - - timings->sensor_output_width = ov_timings.sensor_output_width; - timings->sensor_output_height = ov_timings.sensor_output_height; - timings->crop_horizontal_start = - ov_timings.crop_horizontal_start; - timings->crop_vertical_start = ov_timings.crop_vertical_start; - timings->crop_horizontal_end = ov_timings.crop_horizontal_end; - timings->crop_vertical_end = ov_timings.crop_vertical_end; - timings->line_length_pck = ov_timings.line_length_pck; - timings->frame_length_lines = ov_timings.frame_length_lines; - timings->vt_pix_clk_freq_hz = ov_timings.vt_pix_clk_freq_hz; - timings->binning_factor_x = ov_timings.binning_factor_x; - timings->binning_factor_y = ov_timings.binning_factor_y; - timings->coarse_integration_time_max_margin = - ov_timings.coarse_integration_time_max_margin; - timings->coarse_integration_time_min = - ov_timings.coarse_integration_time_min; - timings->fine_integration_time_max_margin = - ov_timings.fine_integration_time_max_margin; - timings->fine_integration_time_min = - ov_timings.fine_integration_time_min; - - timings->exposure_valid_frame[0] = - cam_mod->custom.exposure_valid_frame[0]; - timings->exposure_valid_frame[1] = - cam_mod->custom.exposure_valid_frame[1]; - if (cam_mod->exp_config.exp_time) - timings->exp_time = cam_mod->exp_config.exp_time; - else - timings->exp_time = ov_timings.exp_time; - if (cam_mod->exp_config.gain) - timings->gain = cam_mod->exp_config.gain; - else - timings->gain = ov_timings.gain; - - if (cam_mod->active_config) { - timings->max_exp_gain_h = cam_mod->active_config->max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->active_config->max_exp_gain_l; - } else { - timings->max_exp_gain_h = cam_mod->custom.configs[0].max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->custom.configs[0].max_exp_gain_l; - } - return ret; - } else if (cmd == RK_VIDIOC_SENSOR_CONFIGINFO) { - struct sensor_config_info_s *sensor_config = (struct sensor_config_info_s *)arg; - - sensor_config->config_num = cam_mod->custom.num_configs; - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (i >= SENSOR_CONFIG_NUM) - break; - sensor_config->sensor_fmt[i] = - pltfrm_camera_module_pix_fmt2csi2_dt(cam_mod->custom.configs[i].frm_fmt.code); - sensor_config->reso[i].width = cam_mod->custom.configs[i].frm_fmt.width; - sensor_config->reso[i].height = cam_mod->custom.configs[i].frm_fmt.height; - } - return 0; - } else if (cmd == RK_VIDIOC_SENSOR_REG_ACCESS) { - struct sensor_reg_rw_s *sensor_rw = (struct sensor_reg_rw_s *)arg; - - if (sensor_rw->reg_access_mode == SENSOR_READ_MODE) { - for (i = 0; i < cam_mod->custom.configs[0].reg_table_num_entries; i++) { - flag = cam_mod->custom.configs[0].reg_table[i].flag; - if (flag != PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) - break; - } - if (flag == PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "Can not get sensor reg type.\n"); - return -EINVAL; - } - sensor_rw->reg_addr_len = PLTFRM_CAMERA_MODULE_REG_LEN(flag); - sensor_rw->reg_data_len = PLTFRM_CAMERA_MODULE_DATA_LEN(flag); - pltfrm_camera_module_read_reg_ex(&cam_mod->sd, 1, flag, sensor_rw->addr, &val); - sensor_rw->data = val; - } else { - flag = (sensor_rw->reg_addr_len << PLTFRM_CAMERA_MODULE_REG_LEN_BIT); - flag |= (sensor_rw->reg_data_len << PLTFRM_CAMERA_MODULE_DATA_LEN_BIT); - pltfrm_camera_module_write_reg_ex(&cam_mod->sd, flag, sensor_rw->addr, sensor_rw->data); - } - return 0; - } else if (cmd == PLTFRM_CIFCAM_G_ITF_CFG) { - struct pltfrm_cam_itf *itf_cfg = (struct pltfrm_cam_itf *)arg; - struct ov_camera_module_config *config; - - if (cam_mod->custom.num_configs <= 0) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cam_mod->custom.num_configs is NULL, Get interface config failed!\n"); - return -EINVAL; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - config = &cam_mod->custom.configs[0]; - else - config = cam_mod->active_config; - - *itf_cfg = config->itf_cfg; - - pltfrm_camera_module_ioctl(sd, PLTFRM_CIFCAM_G_ITF_CFG, arg); - return 0; - } else if (cmd == PLTFRM_CIFCAM_ATTACH) { - ret = ov_camera_module_init(cam_mod, &cam_mod->custom); - if (!IS_ERR_VALUE(ret)) { - pltfrm_camera_module_ioctl(sd, cmd, arg); - return ov_camera_module_attach(cam_mod); - } else { - ov_camera_module_release(cam_mod); - return ret; - } - } - - ret = pltfrm_camera_module_ioctl(sd, cmd, arg); - return ret; -} - -/* ======================================================================== */ - -int ov_camera_module_get_flip_mirror( - struct ov_camera_module *cam_mod) -{ - int mode = 0; - - if (!cam_mod->flip_flg) - return -1; - - if (cam_mod->hflip) - mode |= OV_MIRROR_BIT_MASK; - else - mode &= ~OV_MIRROR_BIT_MASK; - - if (cam_mod->vflip) - mode |= OV_FLIP_BIT_MASK; - else - mode &= ~OV_FLIP_BIT_MASK; - - return mode; -} - -/* ======================================================================== */ - -int ov_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie) -{ - struct ov_camera_module *cam_mod = to_ov_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", fie->index); - - if (fie->index >= cam_mod->custom.num_configs) - return -EINVAL; - fie->code = - cam_mod->custom.configs[fie->index].frm_fmt.code; - fie->width = - cam_mod->custom.configs[fie->index].frm_fmt.width; - fie->height = - cam_mod->custom.configs[fie->index].frm_fmt.height; - fie->interval.numerator = cam_mod->custom. - configs[fie->index].frm_intrvl.interval.numerator; - fie->interval.denominator = cam_mod->custom. - configs[fie->index].frm_intrvl.interval.denominator; - return 0; -} - -/* ======================================================================== */ - -int ov_camera_module_write_reglist( - struct ov_camera_module *cam_mod, - const struct ov_camera_module_reg reglist[], - int len) -{ - return pltfrm_camera_module_write_reglist(&cam_mod->sd, reglist, len); -} - -/* ======================================================================== */ - -int ov_camera_module_write_reg( - struct ov_camera_module *cam_mod, - u16 reg, - u8 val) -{ - return pltfrm_camera_module_write_reg(&cam_mod->sd, reg, val); -} - -/* ======================================================================== */ - -int ov_camera_module_read_reg( - struct ov_camera_module *cam_mod, - u16 data_length, - u16 reg, - u32 *val) -{ - return pltfrm_camera_module_read_reg(&cam_mod->sd, - data_length, reg, val); -} - -/* ======================================================================== */ - -int ov_camera_module_read_reg_table( - struct ov_camera_module *cam_mod, - u16 reg, - u32 *val) -{ - int i; - - if (cam_mod->state == OV_CAMERA_MODULE_STREAMING) - return pltfrm_camera_module_read_reg(&cam_mod->sd, - 1, reg, val); - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - for ( - i = cam_mod->active_config->reg_table_num_entries - 1; - i > 0; - i--) { - if (cam_mod->active_config->reg_table[i].reg == reg) { - *val = cam_mod->active_config->reg_table[i].val; - return 0; - } - } - } - - if (cam_mod->state == OV_CAMERA_MODULE_SW_STANDBY) - return pltfrm_camera_module_read_reg(&cam_mod->sd, - 1, reg, val); - - return -EFAULT; -} - -int ov_camera_module_init(struct ov_camera_module *cam_mod, - struct ov_camera_module_custom_config *custom) -{ - int ret = 0; - int mode = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->hflip = false; - cam_mod->vflip = false; - cam_mod->flip_flg = false; - ov_camera_module_reset(cam_mod); - - if (IS_ERR_OR_NULL(custom->start_streaming) || - IS_ERR_OR_NULL(custom->stop_streaming) || - IS_ERR_OR_NULL(custom->s_ctrl) || - IS_ERR_OR_NULL(custom->g_ctrl)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "mandatory callback function is missing\n"); - ret = -EINVAL; - goto err; - } - - ret = pltfrm_camera_module_init(&cam_mod->sd, &cam_mod->pltfm_data); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - if (IS_ERR_VALUE(ret)) { - ov_camera_module_release(cam_mod); - goto err; - } - - mode = pltfrm_camera_module_get_flip_mirror(&cam_mod->sd); - if (mode != -1) { - cam_mod->hflip = mode & OV_MIRROR_BIT_MASK ? true : false; - cam_mod->vflip = mode & OV_FLIP_BIT_MASK ? true : false; - cam_mod->flip_flg = true; - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -void ov_camera_module_release(struct ov_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->otp_work.wq) { - flush_workqueue(cam_mod->otp_work.wq); - destroy_workqueue(cam_mod->otp_work.wq); - cam_mod->otp_work.wq = NULL; - } - - cam_mod->custom.configs = NULL; - - pltfrm_camera_module_release(&cam_mod->sd); - v4l2_device_unregister_subdev(&cam_mod->sd); -} diff --git a/drivers/media/i2c/soc_camera/rockchip/ov_camera_module.h b/drivers/media/i2c/soc_camera/rockchip/ov_camera_module.h deleted file mode 100644 index cd9db4df6dc4..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/ov_camera_module.h +++ /dev/null @@ -1,302 +0,0 @@ -/* - * ov_camera_module.h - * - * Generic omnivision sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#ifndef OV_CAMERA_MODULE_H -#define OV_CAMERA_MODULE_H -#include -#include -#include - -/* - * TODO: references to v4l2 should be reomved from here and go into a - * platform dependent wrapper - */ - -#define OV_CAMERA_MODULE_REG_TYPE_DATA PLTFRM_CAMERA_MODULE_REG_TYPE_DATA -#define OV_CAMERA_MODULE_REG_TYPE_TIMEOUT PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT -#define ov_camera_module_csi_config -#define ov_camera_module_reg pltfrm_camera_module_reg -#define OV_FLIP_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_FLIP_BIT) -#define OV_MIRROR_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_MIRROR_BIT) - -#define OV_CAMERA_MODULE_CTRL_UPDT_GAIN 0x01 -#define OV_CAMERA_MODULE_CTRL_UPDT_EXP_TIME 0x02 -#define OV_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE 0x04 -#define OV_CAMERA_MODULE_CTRL_UPDT_AUTO_WB 0x08 -#define OV_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN 0x10 -#define OV_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP 0x20 -#define OV_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE 0x40 -#define OV_CAMERA_MODULE_CTRL_UPDT_PRESET_WB 0x80 -#define OV_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE 0x100 - -enum ov_camera_module_state { - OV_CAMERA_MODULE_POWER_OFF = 0, - OV_CAMERA_MODULE_HW_STANDBY = 1, - OV_CAMERA_MODULE_SW_STANDBY = 2, - OV_CAMERA_MODULE_STREAMING = 3 -}; - -struct ov_camera_module; - -struct ov_camera_module_timings { - /* public */ - u32 coarse_integration_time_min; - u32 coarse_integration_time_max_margin; - u32 fine_integration_time_min; - u32 fine_integration_time_max_margin; - u32 frame_length_lines; - u32 line_length_pck; - u32 vt_pix_clk_freq_hz; - u32 sensor_output_width; - u32 sensor_output_height; - u32 crop_horizontal_start; /* Sensor crop start cord. (x0,y0) */ - u32 crop_vertical_start; - u32 crop_horizontal_end; /* Sensor crop end cord. (x1,y1) */ - u32 crop_vertical_end; - u8 binning_factor_x; - u8 binning_factor_y; - u32 exp_time; - u32 gain; -}; - -struct ov_camera_module_config { - const char *name; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - bool auto_exp_enabled; - bool auto_gain_enabled; - bool auto_wb_enabled; - struct ov_camera_module_reg *reg_table; - u32 reg_table_num_entries; - struct ov_camera_module_reg *reg_diff_table; - u32 reg_diff_table_num_entries; - u32 v_blanking_time_us; - u32 line_length_pck; - u32 frame_length_lines; - struct ov_camera_module_timings timings; - bool soft_reset; - bool ignore_measurement_check; - u8 max_exp_gain_h; - u8 max_exp_gain_l; - struct pltfrm_cam_itf itf_cfg; -}; - -struct ov_camera_module_exp_config { - s32 exp_time; - bool auto_exp; - u16 gain; - u16 gain_percent; - bool auto_gain; - enum v4l2_flash_led_mode flash_mode; - u32 vts_value; -}; - -struct ov_camera_module_wb_config { - u32 temperature; - u32 preset_id; - bool auto_wb; -}; - -struct ov_camera_module_af_config { - u32 abs_pos; - u32 rel_pos; -}; - -struct ov_camera_module_ext_ctrl { - /* public */ - u32 id; - u32 value; - __u32 reserved2[1]; -}; - -struct ov_camera_module_ext_ctrls { - /* public */ - u32 count; - struct ov_camera_module_ext_ctrl *ctrls; -}; - -/* - * start_streaming: (mandatory) will be called when sensor should be - * put into streaming mode right after the base config has been - * written to the sensor. After a successful call of this function - * the sensor should start delivering frame data. - * - * stop_streaming: (mandatory) will be called when sensor should stop - * delivering data. After a successful call of this function the - * sensor should not deliver any more frame data. - * - * check_camera_id: (optional) will be called when the sensor is - * powered on. If provided should check the sensor ID/version - * required by the custom driver. Register access should be - * possible when this function is invoked. - * - * s_ctrl: (mandatory) will be called at the successful end of - * ov_camera_module_s_ctrl with the ctrl_id as argument. - * - * priv: (optional) for private data used by the custom driver. - */ -struct ov_camera_module_custom_config { - int (*start_streaming)(struct ov_camera_module *cam_mod); - int (*stop_streaming)(struct ov_camera_module *cam_mod); - int (*check_camera_id)(struct ov_camera_module *cam_mod); - int (*s_ctrl)(struct ov_camera_module *cam_mod, u32 ctrl_id); - int (*g_ctrl)(struct ov_camera_module *cam_mod, u32 ctrl_id); - int (*g_timings)(struct ov_camera_module *cam_mod, - struct ov_camera_module_timings *timings); - int (*s_vts)(struct ov_camera_module *cam_mod, - u32 vts); - int (*s_ext_ctrls)(struct ov_camera_module *cam_mod, - struct ov_camera_module_ext_ctrls *ctrls); - int (*set_flip)( - struct ov_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len); - int (*init_common)(struct ov_camera_module *cam_mod); - int (*read_otp)(struct ov_camera_module *cam_mod); - struct ov_camera_module_config *configs; - u32 num_configs; - u32 power_up_delays_ms[3]; - unsigned short exposure_valid_frame[2]; - void *priv; -}; - -struct ov_camera_module_otp_work { - struct work_struct work; - struct workqueue_struct *wq; - void *cam_mod; -}; - -struct ov_camera_module { - /* public */ - struct v4l2_subdev sd; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - struct ov_camera_module_exp_config exp_config; - struct ov_camera_module_wb_config wb_config; - struct ov_camera_module_af_config af_config; - struct ov_camera_module_custom_config custom; - enum ov_camera_module_state state; - enum ov_camera_module_state state_before_suspend; - struct ov_camera_module_config *active_config; - struct ov_camera_module_otp_work otp_work; - u32 ctrl_updt; - u32 vts_cur; - u32 vts_min; - bool auto_adjust_fps; - bool update_config; - bool frm_fmt_valid; - bool frm_intrvl_valid; - bool hflip; - bool vflip; - bool flip_flg; - u32 rotation; - void *pltfm_data; - bool inited; - int as_master; - struct mutex lock; -}; - -#define ov_camera_module_pr_info(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_info(&(cam_mod)->sd, fmt, ## arg) -#define ov_camera_module_pr_debug(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_debug(&(cam_mod)->sd, fmt, ## arg) -#define ov_camera_module_pr_warn(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_warn(&(cam_mod)->sd, fmt, ## arg) -#define ov_camera_module_pr_err(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_err(&(cam_mod)->sd, fmt, ## arg) - -int ov_camera_module_write_reglist( - struct ov_camera_module *cam_mod, - const struct ov_camera_module_reg reglist[], - int len); - -int ov_camera_module_write_reg( - struct ov_camera_module *cam_mod, - u16 reg, - u8 val); - -int ov_camera_module_read_reg( - struct ov_camera_module *cam_mod, - u16 data_length, - u16 reg, - u32 *val); - -int ov_camera_module_read_reg_table( - struct ov_camera_module *cam_mod, - u16 reg, - u32 *val); - -int ov_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int ov_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int ov_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int ov_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int ov_camera_module_s_stream( - struct v4l2_subdev *sd, - int enable); - -int ov_camera_module_s_power( - struct v4l2_subdev *sd, - int on); - -int ov_camera_module_g_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int ov_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int ov_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls); - -int ov_camera_module_enum_frame_size( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_size_enum *fse); - -int ov_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie); - -int ov_camera_module_init( - struct ov_camera_module *cam_mod, - struct ov_camera_module_custom_config *custom); - -void ov_camera_module_release( - struct ov_camera_module *cam_mod); - -long ov_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg); - -int ov_camera_module_get_flip_mirror( - struct ov_camera_module *cam_mod); -#endif diff --git a/drivers/media/i2c/soc_camera/rockchip/rk_camera_module.c b/drivers/media/i2c/soc_camera/rockchip/rk_camera_module.c deleted file mode 100644 index 9b61ff9a1ab1..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/rk_camera_module.c +++ /dev/null @@ -1,2036 +0,0 @@ -/* - * rk_camera_module.c - * (Based on Intel driver for sofiaxxx) - * - * Copyright (C) 2015 Intel Mobile Communications GmbH - * Copyright (C) 2016 Fuzhou Rockchip 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 as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef CONFIG_OF -#error "this file requires device tree support" -#endif - -#ifndef SOFIA_3G_CAMERA_MODULE_H -#define SOFIA_3G_CAMERA_MODULE_H - -#include -#include -#ifdef CONFIG_PLATFORM_DEVICE_PM -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define OF_OV_GPIO_PD "rockchip,pd-gpio" -#define OF_OV_GPIO_PWR "rockchip,pwr-gpio" -#define OF_OV_GPIO_PWR_2ND "rockchip,pwr-2nd-gpio" -#define OF_OV_GPIO_PWR_3RD "rockchip,pwr-3rd-gpio" -#define OF_OV_GPIO_FLASH "rockchip,flash-gpio" -#define OF_OV_GPIO_TORCH "rockchip,torch-gpio" -#define OF_OV_GPIO_RESET "rockchip,rst-gpio" - -#define OF_CAMERA_MODULE_NAME "rockchip,camera-module-name" -#define OF_CAMERA_MODULE_LEN_NAME "rockchip,camera-module-len-name" -#define OF_CAMERA_MODULE_FOV_H "rockchip,camera-module-fov-h" -#define OF_CAMERA_MODULE_FOV_V "rockchip,camera-module-fov-v" -#define OF_CAMERA_MODULE_ORIENTATION "rockchip,camera-module-orientation" -#define OF_CAMERA_MODULE_FOCAL_LENGTH "rockchip,camera-module-focal-length" -#define OF_CAMERA_MODULE_FOCUS_DISTANCE "rockchip,camera-module-focus-distance" -#define OF_CAMERA_MODULE_IQ_MIRROR "rockchip,camera-module-iq-mirror" -#define OF_CAMERA_MODULE_IQ_FLIP "rockchip,camera-module-iq-flip" -#define OF_CAMERA_MODULE_FLIP "rockchip,camera-module-flip" -#define OF_CAMERA_MODULE_MIRROR "rockchip,camera-module-mirror" -#define OF_CAMERA_FLASH_SUPPORT "rockchip,camera-module-flash-support" -#define OF_CAMERA_FLASH_EXP_PERCENT "rockchip,camera-module-flash-exp-percent" -#define OF_CAMERA_FLASH_TURN_ON_TIME "rockchip,camera-module-flash-turn-on-time" -#define OF_CAMERA_FLASH_ON_TIMEOUT "rockchip,camera-module-flash-on-timeout" -#define OF_CAMERA_MODULE_DEFRECT0 "rockchip,camera-module-defrect0" -#define OF_CAMERA_MODULE_DEFRECT1 "rockchip,camera-module-defrect1" -#define OF_CAMERA_MODULE_DEFRECT2 "rockchip,camera-module-defrect2" -#define OF_CAMERA_MODULE_DEFRECT3 "rockchip,camera-module-defrect3" -#define OF_CAMERA_MODULE_MIPI_DPHY_INDEX "rockchip,camera-module-mipi-dphy-index" - -#define OF_CAMERA_MODULE_REGULATORS "rockchip,camera-module-regulator-names" -#define OF_CAMERA_MODULE_REGULATOR_VOLTAGES "rockchip,camera-module-regulator-voltages" -#define OF_CAMERA_MODULE_MCLK_NAME "rockchip,camera-module-mclk-name" -#define OF_CAMERA_PINCTRL_STATE_DEFAULT "rockchip,camera_default" -#define OF_CAMERA_PINCTRL_STATE_SLEEP "rockchip,camera_sleep" - -const char *PLTFRM_CAMERA_MODULE_PIN_PD = OF_OV_GPIO_PD; -const char *PLTFRM_CAMERA_MODULE_PIN_PWR = OF_OV_GPIO_PWR; -const char *PLTFRM_CAMERA_MODULE_PIN_PWR_2ND = OF_OV_GPIO_PWR_2ND; -const char *PLTFRM_CAMERA_MODULE_PIN_PWR_3RD = OF_OV_GPIO_PWR_3RD; -const char *PLTFRM_CAMERA_MODULE_PIN_FLASH = OF_OV_GPIO_FLASH; -const char *PLTFRM_CAMERA_MODULE_PIN_TORCH = OF_OV_GPIO_TORCH; -const char *PLTFRM_CAMERA_MODULE_PIN_RESET = OF_OV_GPIO_RESET; - -#define I2C_M_WR 0 -#define I2C_MSG_MAX 300 -#define I2C_DATA_MAX (I2C_MSG_MAX * 3) -#define CSI2_DT_YUV420_8b (0x18) -#define CSI2_DT_YUV420_10b (0x19) -#define CSI2_DT_YUV422_8b (0x1E) -#define CSI2_DT_YUV422_10b (0x1F) -#define CSI2_DT_RGB444 (0x20) -#define CSI2_DT_RGB555 (0x21) -#define CSI2_DT_RGB565 (0x22) -#define CSI2_DT_RGB666 (0x23) -#define CSI2_DT_RGB888 (0x24) -#define CSI2_DT_RAW6 (0x28) -#define CSI2_DT_RAW7 (0x29) -#define CSI2_DT_RAW8 (0x2A) -#define CSI2_DT_RAW10 (0x2B) -#define CSI2_DT_RAW12 (0x2C) - -struct pltfrm_camera_module_gpio { - int pltfrm_gpio; - const char *label; - enum of_gpio_flags active_low; -}; - -struct pltfrm_camera_module_regulator { - struct regulator *regulator; - unsigned int min_uV; - unsigned int max_uV; -}; - -struct pltfrm_camera_module_regulators { - unsigned int cnt; - struct pltfrm_camera_module_regulator *regulator; -}; - -struct pltfrm_camera_module_fl { - const char *flash_driver_name; - /* flash ,torch */ - char fl_init_status; - struct pltfrm_camera_module_gpio *fl_flash; - struct pltfrm_camera_module_gpio *fl_torch; - struct v4l2_subdev *flsh_ctrl; -}; - -struct pltfrm_camera_module_info_s { - const char *module_name; - const char *len_name; - const char *fov_h; - const char *fov_v; - const char *focal_length; - const char *focus_distance; - int facing; - int orientation; - bool iq_mirror; - bool iq_flip; - int flip; - int mirror; - int flash_support; - int flash_exp_percent; - int flash_turn_on_time; - int flash_on_timeout; - int af_support; -}; - -struct pltfrm_camera_module_mipi { - unsigned int dphy_index; -}; - -struct pltfrm_camera_module_itf { - union { - struct pltfrm_camera_module_mipi mipi; - } itf; -}; - -struct pltfrm_camera_module_data { - struct pltfrm_camera_module_gpio gpios[8]; - struct pinctrl *pinctrl; - struct pinctrl_state *pins_default; - struct pinctrl_state *pins_sleep; - struct v4l2_subdev *af_ctrl; - /* move to struct pltfrm_camera_module_fl */ - /* const char *flash_driver_name; */ - struct pltfrm_camera_module_fl fl_ctrl; - - struct pltfrm_camera_module_info_s info; - struct pltfrm_camera_module_itf itf; - struct pltfrm_cam_defrect defrects[4]; - struct clk *mclk; - struct pltfrm_soc_cfg *soc_cfg; - struct pltfrm_camera_module_regulators regulators; - - void *priv; -}; - -/* ======================================================================== */ - -static int pltfrm_camera_module_set_pinctrl_state( - struct v4l2_subdev *sd, - struct pinctrl_state *state) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - int ret = 0; - - if (!IS_ERR_OR_NULL(state)) { - ret = pinctrl_select_state(pdata->pinctrl, state); - if (ret < 0) - pltfrm_camera_module_pr_debug(sd, - "could not set pins\n"); - } - - return ret; -} - -static int pltfrm_camera_module_init_gpio( - struct v4l2_subdev *sd) -{ - int ret = 0; - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - unsigned int i = 0; - - ret = pltfrm_camera_module_set_pinctrl_state(sd, pdata->pins_default); - if (ret < 0) - goto err; - - for (i = 0; i < ARRAY_SIZE(pdata->gpios); i++) { - if (gpio_is_valid(pdata->gpios[i].pltfrm_gpio)) { - if (pdata->gpios[i].label == - PLTFRM_CAMERA_MODULE_PIN_FLASH || - pdata->gpios[i].label == - PLTFRM_CAMERA_MODULE_PIN_TORCH) { - if (pdata->fl_ctrl.fl_init_status && - pdata->fl_ctrl.fl_flash->pltfrm_gpio == - pdata->fl_ctrl.fl_torch->pltfrm_gpio) { - pltfrm_camera_module_pr_info( - sd, - "fl gpio has been inited, continue!\n"); - continue; - } - pdata->fl_ctrl.fl_init_status = 1; - } - - pltfrm_camera_module_pr_debug( - sd, - "requesting GPIO #%d ('%s')\n", - pdata->gpios[i].pltfrm_gpio, - pdata->gpios[i].label); - ret = gpio_request_one( - pdata->gpios[i].pltfrm_gpio, - GPIOF_DIR_OUT, - pdata->gpios[i].label); - if (ret) { - if ((pdata->gpios[i].label == - PLTFRM_CAMERA_MODULE_PIN_RESET) || - (pdata->gpios[i].label == - PLTFRM_CAMERA_MODULE_PIN_PWR)) { - pltfrm_camera_module_pr_warn(sd, - "GPIO #%d ('%s') may be reused!\n", - pdata->gpios[i].pltfrm_gpio, - pdata->gpios[i].label); - } else { - pltfrm_camera_module_pr_err(sd, - "failed to request GPIO #%d ('%s')\n", - pdata->gpios[i].pltfrm_gpio, - pdata->gpios[i].label); - goto err; - } - } - - if (pdata->gpios[i].label == - PLTFRM_CAMERA_MODULE_PIN_PD) - ret = pltfrm_camera_module_set_pin_state(sd, - pdata->gpios[i].label, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - else if (pdata->gpios[i].label == - PLTFRM_CAMERA_MODULE_PIN_RESET) - ret = pltfrm_camera_module_set_pin_state(sd, - pdata->gpios[i].label, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - else - ret = pltfrm_camera_module_set_pin_state(sd, - pdata->gpios[i].label, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE - ); - } - } - return 0; -err: - pltfrm_camera_module_pr_err(sd, "failed with error %d\n", ret); - for (; i < ARRAY_SIZE(pdata->gpios); i++) - pdata->gpios[i].pltfrm_gpio = -1; - - return ret; -} - -static struct pltfrm_camera_module_data *pltfrm_camera_module_get_data( - struct v4l2_subdev *sd) -{ - int ret = 0; - int elem_size, elem_index; - const char *str = ""; - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct device_node *np = of_node_get(client->dev.of_node); - struct device_node *af_ctrl_node = NULL; - struct i2c_client *af_ctrl_client = NULL; - struct device_node *fl_ctrl_node = NULL; - struct i2c_client *fl_ctrl_client = NULL; - struct pltfrm_camera_module_data *pdata = NULL; - struct property *prop; - unsigned int i; - - pltfrm_camera_module_pr_debug(sd, "\n"); - - pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); - if (IS_ERR_OR_NULL(pdata)) { - ret = -ENOMEM; - goto err; - } - - client->dev.platform_data = pdata; - - ret = of_property_read_string(np, OF_CAMERA_MODULE_MCLK_NAME, &str); - if (ret) { - pltfrm_camera_module_pr_err(sd, - "cannot not get camera-module-mclk-name property of node %s\n", - np->name); - ret = -ENODEV; - goto err; - } - - pdata->mclk = devm_clk_get(&client->dev, str); - if (IS_ERR_OR_NULL(pdata->mclk)) { - pltfrm_camera_module_pr_err(sd, - "cannot not get %s property of node %s\n", - str, np->name); - ret = -ENODEV; - goto err; - } - - ret = of_property_read_string(np, - "rockchip,camera-module-facing", &str); - if (ret) { - pltfrm_camera_module_pr_err(sd, - "cannot not get camera-module-facing property of node %s\n", - np->name); - } else { - pltfrm_camera_module_pr_debug(sd, - "camera module camera-module-facing driver is %s\n", - str); - } - pdata->info.facing = -1; - if (!strcmp(str, "back")) - pdata->info.facing = 0; - else if (!strcmp(str, "front")) - pdata->info.facing = 1; - - ret = of_property_read_string(np, "rockchip,flash-driver", - &pdata->fl_ctrl.flash_driver_name); - if (ret) { - pltfrm_camera_module_pr_debug(sd, - "cannot not get flash-driver property of node %s\n", - np->name); - pdata->fl_ctrl.flash_driver_name = "0"; - } else { - pltfrm_camera_module_pr_info(sd, - "camera module flash driver is %s\n", - (char *)pdata->fl_ctrl.flash_driver_name); - - /*parse flash node info*/ - fl_ctrl_node = of_parse_phandle(np, "rockchip,fl-ctrl", 0); - if (!IS_ERR_OR_NULL(fl_ctrl_node)) { - fl_ctrl_client = - of_find_i2c_device_by_node(fl_ctrl_node); - of_node_put(fl_ctrl_node); - if (IS_ERR_OR_NULL(fl_ctrl_client)) { - pltfrm_camera_module_pr_err(sd, - "cannot not get node\n"); - ret = -EFAULT; - goto err; - } - pdata->fl_ctrl.flsh_ctrl = - i2c_get_clientdata(fl_ctrl_client); - if (IS_ERR_OR_NULL(pdata->fl_ctrl.flsh_ctrl)) { - pltfrm_camera_module_pr_warn(sd, - "cannot not get camera i2c client, maybe not yet created, deferring device probing...\n"); - ret = -EPROBE_DEFER; - goto err; - } - pltfrm_camera_module_pr_info(sd, - "camera module has flash driver %s\n", - pltfrm_dev_string(pdata->fl_ctrl.flsh_ctrl)); - } - } - - pdata->info.af_support = 0; - af_ctrl_node = of_parse_phandle(np, "rockchip,af-ctrl", 0); - if (!IS_ERR_OR_NULL(af_ctrl_node)) { - af_ctrl_client = of_find_i2c_device_by_node(af_ctrl_node); - of_node_put(af_ctrl_node); - if (IS_ERR_OR_NULL(af_ctrl_client)) { - pltfrm_camera_module_pr_err(sd, - "cannot not get node\n"); - ret = -EFAULT; - goto err; - } - pdata->af_ctrl = i2c_get_clientdata(af_ctrl_client); - if (IS_ERR_OR_NULL(pdata->af_ctrl)) { - pltfrm_camera_module_pr_warn(sd, - "cannot not get camera i2c client, maybe not yet created, deferring device probing...\n"); - ret = -EPROBE_DEFER; - goto err; - } - pdata->info.af_support = 1; - pltfrm_camera_module_pr_info(sd, - "camera module has auto focus controller %s\n", - pltfrm_dev_string(pdata->af_ctrl)); - } - - pdata->pinctrl = devm_pinctrl_get(&client->dev); - if (!IS_ERR(pdata->pinctrl)) { - pdata->pins_default = pinctrl_lookup_state( - pdata->pinctrl, - OF_CAMERA_PINCTRL_STATE_DEFAULT); - if (IS_ERR(pdata->pins_default)) - pltfrm_camera_module_pr_warn(sd, - "could not get default pinstate\n"); - - pdata->pins_sleep = pinctrl_lookup_state( - pdata->pinctrl, OF_CAMERA_PINCTRL_STATE_SLEEP); - if (IS_ERR(pdata->pins_sleep)) - pltfrm_camera_module_pr_warn(sd, - "could not get sleep pinstate\n"); - } - - elem_size = of_property_count_elems_of_size( - np, - OF_CAMERA_MODULE_REGULATOR_VOLTAGES, - sizeof(u32)); - prop = of_find_property( - np, - OF_CAMERA_MODULE_REGULATORS, - NULL); - if (elem_size > 0 && !IS_ERR_OR_NULL(prop)) { - struct pltfrm_camera_module_regulator *regulator; - - pdata->regulators.regulator = devm_kzalloc(&client->dev, - elem_size * - sizeof(struct pltfrm_camera_module_regulator), - GFP_KERNEL); - if (!pdata->regulators.regulator) { - pltfrm_camera_module_pr_err(sd, - "could not malloc pltfrm_camera_module_regulator\n"); - goto err; - } - pdata->regulators.cnt = elem_size; - str = NULL; - elem_index = 0; - regulator = pdata->regulators.regulator; - do { - str = of_prop_next_string(prop, str); - if (!str) { - pltfrm_camera_module_pr_err(sd, - "%s is not match %s in dts\n", - OF_CAMERA_MODULE_REGULATORS, - OF_CAMERA_MODULE_REGULATOR_VOLTAGES); - break; - } - regulator->regulator = - devm_regulator_get_optional(&client->dev, str); - if (IS_ERR(regulator->regulator)) - pltfrm_camera_module_pr_err(sd, - "devm_regulator_get %s failed\n", - str); - of_property_read_u32_index( - np, - OF_CAMERA_MODULE_REGULATOR_VOLTAGES, - elem_index++, - ®ulator->min_uV); - regulator->max_uV = regulator->min_uV; - regulator++; - } while (--elem_size); - } - - for (i = 0; i < ARRAY_SIZE(pdata->gpios); i++) - pdata->gpios[i].pltfrm_gpio = -1; - - pdata->gpios[0].label = PLTFRM_CAMERA_MODULE_PIN_PD; - pdata->gpios[0].pltfrm_gpio = of_get_named_gpio_flags( - np, - pdata->gpios[0].label, - 0, - &pdata->gpios[0].active_low); - - pdata->gpios[1].label = PLTFRM_CAMERA_MODULE_PIN_PWR; - pdata->gpios[1].pltfrm_gpio = of_get_named_gpio_flags( - np, - pdata->gpios[1].label, - 0, - &pdata->gpios[1].active_low); - - pdata->gpios[2].label = PLTFRM_CAMERA_MODULE_PIN_PWR_2ND; - pdata->gpios[2].pltfrm_gpio = of_get_named_gpio_flags( - np, - pdata->gpios[2].label, - 0, - &pdata->gpios[2].active_low); - - pdata->gpios[3].label = PLTFRM_CAMERA_MODULE_PIN_PWR_3RD; - pdata->gpios[3].pltfrm_gpio = of_get_named_gpio_flags( - np, - pdata->gpios[3].label, - 0, - &pdata->gpios[3].active_low); - - pdata->gpios[4].label = PLTFRM_CAMERA_MODULE_PIN_FLASH; - pdata->gpios[4].pltfrm_gpio = of_get_named_gpio_flags( - np, - pdata->gpios[4].label, - 0, - &pdata->gpios[4].active_low); - - /*set fl_ctrl flash reference*/ - pdata->fl_ctrl.fl_flash = &pdata->gpios[4]; - - pdata->gpios[5].label = PLTFRM_CAMERA_MODULE_PIN_TORCH; - pdata->gpios[5].pltfrm_gpio = of_get_named_gpio_flags( - np, - pdata->gpios[5].label, - 0, - &pdata->gpios[5].active_low); - - /*set fl_ctrl torch reference*/ - pdata->fl_ctrl.fl_torch = &pdata->gpios[5]; - - pdata->gpios[6].label = PLTFRM_CAMERA_MODULE_PIN_RESET; - pdata->gpios[6].pltfrm_gpio = of_get_named_gpio_flags( - np, - pdata->gpios[6].label, - 0, - &pdata->gpios[6].active_low); - - ret = of_property_read_string(np, OF_CAMERA_MODULE_NAME, - &pdata->info.module_name); - ret |= of_property_read_string(np, OF_CAMERA_MODULE_LEN_NAME, - &pdata->info.len_name); - if (ret) { - pltfrm_camera_module_pr_err( - sd, - "could not get module %s and %s from dts!\n", - OF_CAMERA_MODULE_NAME, - OF_CAMERA_MODULE_LEN_NAME); - } - - if (of_property_read_u32( - np, - OF_CAMERA_MODULE_ORIENTATION, - (unsigned int *)&pdata->info.orientation)) { - pdata->info.orientation = -1; - pltfrm_camera_module_pr_err( - sd, - "could not get module %s from dts!\n", - OF_CAMERA_MODULE_ORIENTATION); - } - - if (of_property_read_u32( - np, - OF_CAMERA_MODULE_FLIP, - (unsigned int *)&pdata->info.flip)) { - pdata->info.flip = -1; - pltfrm_camera_module_pr_err( - sd, - "could not get module %s from dts!\n", - OF_CAMERA_MODULE_FLIP); - } - - if (of_property_read_u32( - np, - OF_CAMERA_MODULE_MIRROR, - (unsigned int *)&pdata->info.mirror)) { - pdata->info.mirror = -1; - pltfrm_camera_module_pr_err( - sd, - "could not get module %s from dts!\n", - OF_CAMERA_MODULE_MIRROR); - } - - if (of_property_read_u32( - np, - OF_CAMERA_FLASH_SUPPORT, - (unsigned int *)&pdata->info.flash_support)) { - pdata->info.flash_support = -1; - pltfrm_camera_module_pr_err( - sd, - "could not get module %s from dts!\n", - OF_CAMERA_FLASH_SUPPORT); - } - - ret = of_property_read_string(np, OF_CAMERA_MODULE_FOV_H, - &pdata->info.fov_h); - ret |= of_property_read_string(np, OF_CAMERA_MODULE_FOV_V, - &pdata->info.fov_v); - if (ret) { - pltfrm_camera_module_pr_debug( - sd, - "could not get module %s and %s from dts!", - OF_CAMERA_MODULE_FOV_H, - OF_CAMERA_MODULE_FOV_V); - } - - ret = of_property_read_string(np, OF_CAMERA_MODULE_FOCAL_LENGTH, - &pdata->info.focal_length); - if (ret) { - pltfrm_camera_module_pr_debug( - sd, - "could not get %s from dts!\n", - OF_CAMERA_MODULE_FOCAL_LENGTH); - } - ret = of_property_read_string(np, OF_CAMERA_MODULE_FOCUS_DISTANCE, - &pdata->info.focus_distance); - if (ret) { - pltfrm_camera_module_pr_debug( - sd, - "could not get %s from dts!\n", - OF_CAMERA_MODULE_FOCUS_DISTANCE); - } - - ret = 0; - of_property_read_u32(np, OF_CAMERA_MODULE_IQ_MIRROR, &ret); - pdata->info.iq_mirror = (ret == 0) ? false : true; - - ret = 0; - of_property_read_u32(np, OF_CAMERA_MODULE_IQ_FLIP, &ret); - pdata->info.iq_flip = (ret == 0) ? false : true; - - if (of_property_read_u32( - np, - OF_CAMERA_FLASH_EXP_PERCENT, - (unsigned int *)&pdata->info.flash_exp_percent)) { - pdata->info.flash_exp_percent = -1; - pltfrm_camera_module_pr_debug( - sd, - "could not get module %s from dts!\n", - OF_CAMERA_FLASH_EXP_PERCENT); - } - - if (of_property_read_u32( - np, - OF_CAMERA_FLASH_TURN_ON_TIME, - (unsigned int *)&pdata->info.flash_turn_on_time)) { - pdata->info.flash_turn_on_time = -1; - pltfrm_camera_module_pr_debug( - sd, - "could not get module %s from dts!\n", - OF_CAMERA_FLASH_TURN_ON_TIME); - } - - if (of_property_read_u32( - np, - OF_CAMERA_FLASH_ON_TIMEOUT, - (unsigned int *)&pdata->info.flash_on_timeout)) { - pdata->info.flash_on_timeout = -1; - pltfrm_camera_module_pr_debug( - sd, - "could not get module %s from dts!\n", - OF_CAMERA_FLASH_ON_TIMEOUT); - } - - of_property_read_u32_array( - np, - OF_CAMERA_MODULE_DEFRECT0, - (unsigned int *)&pdata->defrects[0], - 6); - of_property_read_u32_array( - np, - OF_CAMERA_MODULE_DEFRECT1, - (unsigned int *)&pdata->defrects[1], - 6); - of_property_read_u32_array( - np, - OF_CAMERA_MODULE_DEFRECT2, - (unsigned int *)&pdata->defrects[2], - 6); - of_property_read_u32_array( - np, - OF_CAMERA_MODULE_DEFRECT3, - (unsigned int *)&pdata->defrects[3], - 6); - - if (of_property_read_u32( - np, - OF_CAMERA_MODULE_MIPI_DPHY_INDEX, - (unsigned int *)&pdata->itf.itf.mipi.dphy_index)) { - pdata->itf.itf.mipi.dphy_index = -1; - pltfrm_camera_module_pr_debug( - sd, - "could not get module %s from dts!\n", - OF_CAMERA_MODULE_MIPI_DPHY_INDEX); - } - - of_node_put(np); - return pdata; -err: - pltfrm_camera_module_pr_err(sd, "failed with error %d\n", ret); - if (!IS_ERR_OR_NULL(pdata->regulators.regulator)) { - devm_kfree( - &client->dev, - pdata->regulators.regulator); - pdata->regulators.regulator = NULL; - } - - if (!IS_ERR_OR_NULL(pdata->mclk)) { - devm_clk_put(&client->dev, pdata->mclk); - pdata->mclk = NULL; - } - if (!IS_ERR_OR_NULL(pdata)) { - devm_kfree(&client->dev, pdata); - pdata = NULL; - } - of_node_put(np); - return ERR_PTR(ret); -} - -static int pltfrm_camera_module_pix_frmt2code( - const char *pix_frmt) -{ - if (strcmp(pix_frmt, "BAYER_BGGR8") == 0) - return MEDIA_BUS_FMT_SBGGR8_1X8; - if (strcmp(pix_frmt, "BAYER_GBRG8") == 0) - return MEDIA_BUS_FMT_SGBRG8_1X8; - if (strcmp(pix_frmt, "BAYER_GRBG8") == 0) - return MEDIA_BUS_FMT_SGRBG8_1X8; - if (strcmp(pix_frmt, "BAYER_RGGB8") == 0) - return MEDIA_BUS_FMT_SRGGB8_1X8; - if (strcmp(pix_frmt, "BAYER_BGGR10") == 0) - return MEDIA_BUS_FMT_SBGGR10_1X10; - if (strcmp(pix_frmt, "BAYER_GBRG10") == 0) - return MEDIA_BUS_FMT_SGBRG10_1X10; - if (strcmp(pix_frmt, "BAYER_GRBG10") == 0) - return MEDIA_BUS_FMT_SGRBG10_1X10; - if (strcmp(pix_frmt, "BAYER_RGGB10") == 0) - return MEDIA_BUS_FMT_SRGGB10_1X10; - if (strcmp(pix_frmt, "BAYER_BGGR12") == 0) - return MEDIA_BUS_FMT_SBGGR12_1X12; - if (strcmp(pix_frmt, "BAYER_GBRG12") == 0) - return MEDIA_BUS_FMT_SGBRG12_1X12; - if (strcmp(pix_frmt, "BAYER_GRBG12") == 0) - return MEDIA_BUS_FMT_SGRBG12_1X12; - if (strcmp(pix_frmt, "BAYER_RGGB12") == 0) - return MEDIA_BUS_FMT_SRGGB12_1X12; - if (strcmp(pix_frmt, "YUYV8") == 0) - return MEDIA_BUS_FMT_YUYV8_2X8; - if (strcmp(pix_frmt, "YUYV10") == 0) - return MEDIA_BUS_FMT_YUYV10_2X10; - if (strcmp(pix_frmt, "UYUV8") == 0) - return MEDIA_BUS_FMT_UYVY8_2X8; - return -EINVAL; -} - -static int pltfrm_camera_module_config_matches( - struct v4l2_subdev *sd, - struct device_node *config, - struct v4l2_mbus_framefmt *frm_fmt, - struct v4l2_subdev_frame_interval *frm_intrvl) -{ - int ret = 0; - struct property *prop; - const char *of_pix_fmt; - bool match = true; - u32 min, max; - u32 min2 = 1, max2 = 1; - u32 numerator, denominator; - - pltfrm_camera_module_pr_debug(sd, - "pix_frm %d, %dx%d@%d/%dfps, config %s\n", - frm_fmt->code, frm_fmt->width, frm_fmt->height, - frm_intrvl->interval.denominator, - frm_intrvl->interval.numerator, - config->name); - - /* check pixel format */ - of_property_for_each_string(config, "rockchip,frm-pixel-format", - prop, of_pix_fmt) { - if (pltfrm_camera_module_pix_frmt2code(of_pix_fmt) == - frm_fmt->code) { - match = true; - break; - } - } - - if (!match) - return 0; - - /* check frame width */ - ret = of_property_read_u32(config, "rockchip,frm-width", &min); - if (ret == -EINVAL) { - ret = of_property_read_u32_index(config, - "rockchip,frm-width-range", 0, &min); - if (ret == -EINVAL) { - min = 0; - max = UINT_MAX; - } else if (ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-width-range'\n"); - goto err; - } else { - ret = of_property_read_u32_index(config, - "rockchip,frm-width-range", 1, &max); - if (ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-width-range'\n"); - goto err; - } - } - } else if (!ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-width'\n"); - goto err; - } else { - max = min; - } - if ((frm_fmt->width < min) || (frm_fmt->width > max)) - return 0; - - /* check frame height */ - ret = of_property_read_u32(config, "rockchip,frm-height", &min); - if (ret == -EINVAL) { - ret = of_property_read_u32_index(config, - "rockchip,frm-height-range", 0, &min); - if (ret == -EINVAL) { - min = 0; - max = UINT_MAX; - } else if (ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-height-range'\n"); - goto err; - } else { - ret = of_property_read_u32_index(config, - "rockchip,frm-height-range", 1, &max); - if (ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-height-range'\n"); - goto err; - } - } - } else if (!ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-height'\n"); - goto err; - } else { - max = min; - } - if ((frm_fmt->height < min) || (frm_fmt->height > max)) - return 0; - - /* check frame interval */ - ret = of_property_read_u32_index(config, - "rockchip,frm-interval", 0, &min); - if (ret == -EINVAL) { - ret = of_property_read_u32_index(config, - "rockchip,frm-interval-range", 0, &min); - if (ret == -EINVAL) { - min = 0; - max = UINT_MAX; - } else if (ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-interval-range'\n"); - goto err; - } else { - ret |= of_property_read_u32_index(config, - "rockchip,frm-interval-range", 1, &min2); - ret |= of_property_read_u32_index(config, - "rockchip,frm-interval-range", 2, &max); - ret |= of_property_read_u32_index(config, - "rockchip,frm-interval-range", 3, &max2); - if (ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-interval-range'\n"); - goto err; - } - } - } else if (!ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-interval'\n"); - goto err; - } else { - ret = of_property_read_u32_index(config, - "rockchip,frm-interval", 1, &min2); - if (ret) { - pltfrm_camera_module_pr_err(sd, - "malformed property 'rockchip,frm-interval'\n"); - goto err; - } - max = min; - max2 = min2; - } - - /* normalize frame intervals */ - denominator = lcm(min2, frm_intrvl->interval.denominator); - denominator = lcm(max2, denominator); - numerator = denominator / frm_intrvl->interval.denominator * - frm_intrvl->interval.numerator; - - min = denominator / min2 * min; - max = denominator / max2 * max; - - if ((numerator < min) || (numerator > max)) - return 0; - - return 1; -err: - pltfrm_camera_module_pr_err(sd, - "failed with error %d\n", ret); - return ret; -} - -static int pltfrm_camera_module_write_reglist_node( - struct v4l2_subdev *sd, - struct device_node *config_node) -{ - struct property *reg_table_prop; - struct pltfrm_camera_module_reg *reg_table = NULL; - u32 reg_table_num_entries; - u32 i = 0; - int ret = 0; - - reg_table_prop = of_find_property(config_node, "rockchip,reg-table", - ®_table_num_entries); - if (!IS_ERR_OR_NULL(reg_table_prop)) { - if (((reg_table_num_entries / 12) == 0) || - (reg_table_num_entries % 3)) { - pltfrm_camera_module_pr_err(sd, - "wrong register format in %s, must be 'type, address, value' per register\n", - config_node->name); - ret = -EINVAL; - goto err; - } - - reg_table_num_entries /= 12; - reg_table = kmalloc_array(reg_table_num_entries, - sizeof(struct pltfrm_camera_module_reg), - GFP_KERNEL); - if (IS_ERR_OR_NULL(reg_table)) { - pltfrm_camera_module_pr_err(sd, - "memory allocation failed\n"); - ret = -ENOMEM; - goto err; - } - - pltfrm_camera_module_pr_debug(sd, - "patching config with %s (%d registers)\n", - config_node->name, reg_table_num_entries); - for (i = 0; i < reg_table_num_entries; i++) { - u32 val; - - ret |= of_property_read_u32_index( - config_node, "rockchip,reg-table", - 3 * i, &val); - reg_table[i].flag = val; - ret |= of_property_read_u32_index( - config_node, "rockchip,reg-table", - 3 * i + 1, &val); - reg_table[i].reg = val; - ret |= of_property_read_u32_index( - config_node, "rockchip,reg-table", - 3 * i + 2, &val); - reg_table[i].val = val; - if (ret) { - pltfrm_camera_module_pr_err(sd, - "error while reading property %s at index %d\n", - "rockchip,reg-table", i); - goto err; - } - } - ret = pltfrm_camera_module_write_reglist( - sd, reg_table, reg_table_num_entries); - if (ret) - goto err; - kfree(reg_table); - reg_table = NULL; - } - return 0; -err: - pltfrm_camera_module_pr_err(sd, - "failed with error %d\n", ret); - kfree(reg_table); - return ret; -} - -/* ======================================================================== */ - -const char *pltfrm_dev_string( - struct v4l2_subdev *sd) -{ - struct i2c_client *client; - - if (IS_ERR_OR_NULL(sd)) - return ""; - client = v4l2_get_subdevdata(sd); - if (IS_ERR_OR_NULL(client)) - return ""; - return dev_driver_string(&client->dev); -} - -int pltfrm_camera_module_read_reg( - struct v4l2_subdev *sd, - u16 data_length, - u16 reg, - u32 *val) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - struct i2c_msg msg[1]; - unsigned char data[4] = { 0, 0, 0, 0 }; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(sd, "client->adapter NULL\n"); - return -ENODEV; - } - - msg->addr = client->addr; - msg->flags = I2C_M_WR; - msg->len = 2; - msg->buf = data; - - /* High byte goes out first */ - data[0] = (u8)(reg >> 8); - data[1] = (u8)(reg & 0xff); - - ret = i2c_transfer(client->adapter, msg, 1); - if (ret >= 0) { - mdelay(3); - msg->flags = I2C_M_RD; - msg->len = data_length; - i2c_transfer(client->adapter, msg, 1); - } - if (ret >= 0) { - *val = 0; - /* High byte comes first */ - if (data_length == 1) - *val = data[0]; - else if (data_length == 2) - *val = data[1] + (data[0] << 8); - else - *val = data[3] + (data[2] << 8) + - (data[1] << 16) + (data[0] << 24); - return 0; - } - pltfrm_camera_module_pr_err(sd, - "i2c read from offset 0x%08x failed with error %d\n", reg, ret); - - return ret; -} - -int pltfrm_camera_module_read_reg_ex( - struct v4l2_subdev *sd, - u16 data_length, - u32 flag, - u16 reg, - u32 *val) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - struct i2c_msg msg[2]; - unsigned char data[4] = { 0, 0, 0, 0 }; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(sd, "client->adapter NULL\n"); - return -ENODEV; - } - - msg->addr = client->addr; - msg->flags = I2C_M_WR; - msg->buf = data; - - if (PLTFRM_CAMERA_MODULE_REG_LEN(flag) == 1) { - data[0] = (u8)(reg & 0xff); - msg->len = 1; - } else { - /* High byte goes out first */ - data[0] = (u8)(reg >> 8); - data[1] = (u8)(reg & 0xff); - msg->len = 2; - } - - if ((flag & PLTFRM_CAMERA_MODULE_RD_CONTINUE_MASK) == - PLTFRM_CAMERA_MODULE_RD_CONTINUE) { - msg[1].addr = client->addr; - msg[1].flags = I2C_M_RD; - msg[1].len = data_length; - msg[1].buf = data; - - ret = i2c_transfer(client->adapter, msg, 2); - } else { - ret = i2c_transfer(client->adapter, msg, 1); - if (ret >= 0) { - mdelay(3); - msg->flags = I2C_M_RD; - msg->len = data_length; - i2c_transfer(client->adapter, msg, 1); - } - } - if (ret >= 0) { - *val = 0; - /* High byte comes first */ - if (data_length == 1) - *val = data[0]; - else if (data_length == 2) - *val = data[1] + (data[0] << 8); - else - *val = data[3] + (data[2] << 8) + - (data[1] << 16) + (data[0] << 24); - return 0; - } - pltfrm_camera_module_pr_err(sd, - "i2c read from offset 0x%08x failed with error %d\n", reg, ret); - return ret; -} -/* ======================================================================== */ - -int pltfrm_camera_module_write_reg( - struct v4l2_subdev *sd, - u16 reg, u8 val) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - struct i2c_msg msg[1]; - unsigned char data[3]; - int retries; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(sd, "client->adapter NULL\n"); - return -ENODEV; - } - - for (retries = 0; retries < 5; retries++) { - msg->addr = client->addr; - msg->flags = I2C_M_WR; - msg->len = 3; - msg->buf = data; - - /* high byte goes out first */ - data[0] = (u8)(reg >> 8); - data[1] = (u8)(reg & 0xff); - data[2] = val; - - ret = i2c_transfer(client->adapter, msg, 1); - if (ret == 1) { - pltfrm_camera_module_pr_debug(sd, - "i2c write to offset 0x%08x success\n", reg); - return 0; - } - - pltfrm_camera_module_pr_debug(sd, - "retrying I2C... %d\n", retries); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(msecs_to_jiffies(20)); - } - pltfrm_camera_module_pr_err(sd, - "i2c write to offset 0x%08x failed with error %d\n", reg, ret); - return ret; -} - -int pltfrm_camera_module_write_reg_ex( - struct v4l2_subdev *sd, - u32 flag, u16 reg, u16 val) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - struct i2c_msg msg[1]; - unsigned char data[4]; - int retries; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(sd, "client->adapter NULL\n"); - return -ENODEV; - } - - for (retries = 0; retries < 5; retries++) { - msg->addr = client->addr; - msg->flags = I2C_M_WR; - msg->buf = data; - - if (PLTFRM_CAMERA_MODULE_REG_LEN(flag) == 1 && - PLTFRM_CAMERA_MODULE_DATA_LEN(flag) == 1) { - data[0] = (u8)(reg & 0xff); - data[1] = val; - msg->len = 2; - } else if (PLTFRM_CAMERA_MODULE_REG_LEN(flag) == 2 && - PLTFRM_CAMERA_MODULE_DATA_LEN(flag) == 1) { - data[0] = (u8)(reg >> 8); - data[1] = (u8)(reg & 0xff); - data[2] = val; - msg->len = 3; - } else if (PLTFRM_CAMERA_MODULE_REG_LEN(flag) == 1 && - PLTFRM_CAMERA_MODULE_DATA_LEN(flag) == 2) { - data[0] = (u8)(reg & 0xff); - data[1] = (u8)(val >> 8); - data[2] = (u8)(val & 0xff); - msg->len = 3; - } else if (PLTFRM_CAMERA_MODULE_REG_LEN(flag) == 2 && - PLTFRM_CAMERA_MODULE_DATA_LEN(flag) == 2) { - data[0] = (u8)(reg >> 8); - data[1] = (u8)(reg & 0xff); - data[2] = (u8)(val >> 8); - data[3] = (u8)(val & 0xff); - msg->len = 4; - } else { - pltfrm_camera_module_pr_err(sd, - "i2c write flag 0x%x error\n", flag); - return -EINVAL; - } - - ret = i2c_transfer(client->adapter, msg, 1); - if (ret == 1) { - pltfrm_camera_module_pr_debug(sd, - "i2c write to offset 0x%08x success\n", reg); - return 0; - } - - pltfrm_camera_module_pr_debug(sd, - "retrying I2C... %d\n", retries); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(msecs_to_jiffies(20)); - } - pltfrm_camera_module_pr_err(sd, - "i2c write to offset 0x%08x failed with error %d\n", reg, ret); - return ret; -} - -/* ======================================================================== */ -int pltfrm_camera_module_write_reglist( - struct v4l2_subdev *sd, - const struct pltfrm_camera_module_reg reglist[], - int len) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - unsigned int k = 0, j = 0; - unsigned int i = 0; - struct i2c_msg *msg; - unsigned char *data; - unsigned int max_entries = len; - - msg = kmalloc((sizeof(struct i2c_msg) * I2C_MSG_MAX), - GFP_KERNEL); - if (NULL == msg) - return -ENOMEM; - data = kmalloc((sizeof(unsigned char) * I2C_DATA_MAX), - GFP_KERNEL); - if (NULL == data) { - kfree(msg); - return -ENOMEM; - } - - for (i = 0; i < max_entries; i++) { - switch (reglist[i].flag & PLTFRM_CAMERA_MODULE_WR_CONTINUE_MASK) { - case PLTFRM_CAMERA_MODULE_WR_CONTINUE: - (msg + j)->addr = client->addr; - (msg + j)->flags = I2C_M_WR; - (msg + j)->buf = (data + k); - - if (PLTFRM_CAMERA_MODULE_REG_LEN(reglist[i].flag) == 1 && - PLTFRM_CAMERA_MODULE_DATA_LEN(reglist[i].flag) == 1) { - data[k + 0] = (u8)(reglist[i].reg & 0xFF); - data[k + 1] = (u8)(reglist[i].val & 0xFF); - k = k + 2; - (msg + j)->len = 2; - } else if (PLTFRM_CAMERA_MODULE_REG_LEN(reglist[i].flag) == 2 && - PLTFRM_CAMERA_MODULE_DATA_LEN(reglist[i].flag) == 1) { - data[k + 0] = (u8)((reglist[i].reg & 0xFF00) >> 8); - data[k + 1] = (u8)(reglist[i].reg & 0xFF); - data[k + 2] = (u8)(reglist[i].val & 0xFF); - k = k + 3; - (msg + j)->len = 3; - } else if (PLTFRM_CAMERA_MODULE_REG_LEN(reglist[i].flag) == 1 && - PLTFRM_CAMERA_MODULE_DATA_LEN(reglist[i].flag) == 2) { - data[k + 0] = (u8)(reglist[i].reg & 0xFF); - data[k + 1] = (u8)((reglist[i].val & 0xFF00) >> 8); - data[k + 2] = (u8)(reglist[i].val & 0xFF); - k = k + 3; - (msg + j)->len = 3; - } else if (PLTFRM_CAMERA_MODULE_REG_LEN(reglist[i].flag) == 2 && - PLTFRM_CAMERA_MODULE_DATA_LEN(reglist[i].flag) == 2) { - data[k + 0] = (u8)((reglist[i].reg & 0xFF00) >> 8); - data[k + 1] = (u8)(reglist[i].reg & 0xFF); - data[k + 2] = (u8)((reglist[i].val & 0xFF00) >> 8); - data[k + 3] = (u8)(reglist[i].val & 0xFF); - k = k + 4; - (msg + j)->len = 4; - } - - j++; - if (j == (I2C_MSG_MAX - 1)) { - /* Bulk I2C transfer */ - pltfrm_camera_module_pr_debug(sd, - "messages transfers 1 0x%p msg %d bytes %d\n", - msg, j, k); - ret = i2c_transfer(client->adapter, msg, j); - if (ret < 0) { - pltfrm_camera_module_pr_err(sd, - "i2c transfer returned with err %d\n", - ret); - kfree(msg); - kfree(data); - return ret; - } - j = 0; - k = 0; - pltfrm_camera_module_pr_debug(sd, - "i2c_transfer return %d\n", ret); - } - break; - case PLTFRM_CAMERA_MODULE_WR_SINGLE: - msg->addr = client->addr; - msg->flags = I2C_M_WR; - msg->buf = data; - - if (PLTFRM_CAMERA_MODULE_REG_LEN(reglist[i].flag) == 1 && - PLTFRM_CAMERA_MODULE_DATA_LEN(reglist[i].flag) == 1) { - data[0] = (u8)(reglist[i].reg & 0xFF); - data[1] = (u8)(reglist[i].val & 0xFF); - msg->len = 2; - } else if (PLTFRM_CAMERA_MODULE_REG_LEN(reglist[i].flag) == 2 && - PLTFRM_CAMERA_MODULE_DATA_LEN(reglist[i].flag) == 1) { - data[0] = (u8)((reglist[i].reg & 0xFF00) >> 8); - data[1] = (u8)(reglist[i].reg & 0xFF); - data[2] = (u8)(reglist[i].val & 0xFF); - msg->len = 3; - } else if (PLTFRM_CAMERA_MODULE_REG_LEN(reglist[i].flag) == 1 && - PLTFRM_CAMERA_MODULE_DATA_LEN(reglist[i].flag) == 2) { - data[0] = (u8)(reglist[i].reg & 0xFF); - data[1] = (u8)((reglist[i].val & 0xFF00) >> 8); - data[2] = (u8)(reglist[i].val & 0xFF); - msg->len = 3; - } else if (PLTFRM_CAMERA_MODULE_REG_LEN(reglist[i].flag) == 2 && - PLTFRM_CAMERA_MODULE_DATA_LEN(reglist[i].flag) == 2) { - data[0] = (u8)((reglist[i].reg & 0xFF00) >> 8); - data[1] = (u8)(reglist[i].reg & 0xFF); - data[2] = (u8)((reglist[i].val & 0xFF00) >> 8); - data[3] = (u8)(reglist[i].val & 0xFF); - msg->len = 4; - } - - pltfrm_camera_module_pr_debug(sd, - "messages transfers 1 0x%p msg\n", msg); - ret = i2c_transfer(client->adapter, msg, 1); - if (ret < 0) { - pltfrm_camera_module_pr_err(sd, - "i2c transfer returned with err %d\n", - ret); - kfree(msg); - kfree(data); - return ret; - } - break; - case PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT: - if (j > 0) { - /* Bulk I2C transfer */ - pltfrm_camera_module_pr_debug(sd, - "messages transfers 1 0x%p msg %d bytes %d\n", - msg, j, k); - ret = i2c_transfer(client->adapter, msg, j); - if (ret < 0) { - pltfrm_camera_module_pr_debug(sd, - "i2c transfer returned with err %d\n", - ret); - kfree(msg); - kfree(data); - return ret; - } - pltfrm_camera_module_pr_debug(sd, - "i2c_transfer return %d\n", ret); - } - mdelay(reglist[i].val); - j = 0; - k = 0; - break; - default: - pltfrm_camera_module_pr_debug(sd, "unknown command\n"); - kfree(msg); - kfree(data); - return -1; - } - } - - if (j != 0) { /*Remaining I2C message*/ - pltfrm_camera_module_pr_debug(sd, - "messages transfers 1 0x%p msg %d bytes %d\n", - msg, j, k); - ret = i2c_transfer(client->adapter, msg, j); - if (ret < 0) { - pltfrm_camera_module_pr_err(sd, - "i2c transfer returned with err %d\n", ret); - kfree(msg); - kfree(data); - return ret; - } - pltfrm_camera_module_pr_debug(sd, - "i2c_transfer return %d\n", ret); - } - - kfree(msg); - kfree(data); - return 0; -} - -static int pltfrm_camera_module_init_pm( - struct v4l2_subdev *sd, - struct pltfrm_soc_cfg *soc_cfg) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - - pdata->soc_cfg = soc_cfg; - return 0; -} - -int pltfrm_camera_module_set_pm_state( - struct v4l2_subdev *sd, - int on) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - struct pltfrm_soc_cfg *soc_cfg = - pdata->soc_cfg; - struct pltfrm_soc_mclk_para mclk_para; - struct pltfrm_soc_cfg_para cfg_para; - struct pltfrm_cam_itf itf_cfg; - unsigned int i; - - if (on) { - if (IS_ERR_OR_NULL(soc_cfg)) { - pltfrm_camera_module_pr_err(sd, - "set_pm_state failed! soc_cfg is %p!\n", - soc_cfg); - return -EINVAL; - } - - if (pdata->regulators.regulator) { - for (i = 0; i < pdata->regulators.cnt; i++) { - struct pltfrm_camera_module_regulator - *regulator; - - regulator = pdata->regulators.regulator + i; - if (IS_ERR(regulator->regulator)) - continue; - regulator_set_voltage( - regulator->regulator, - regulator->min_uV, - regulator->max_uV); - if (regulator_enable(regulator->regulator)) - pltfrm_camera_module_pr_err(sd, - "regulator_enable failed!\n"); - } - } - - pltfrm_camera_module_set_pin_state( - sd, - PLTFRM_CAMERA_MODULE_PIN_PWR, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - - pltfrm_camera_module_set_pin_state( - sd, - PLTFRM_CAMERA_MODULE_PIN_PWR_2ND, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - - pltfrm_camera_module_set_pin_state( - sd, - PLTFRM_CAMERA_MODULE_PIN_PWR_3RD, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - - pltfrm_camera_module_set_pin_state( - sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - usleep_range(100, 300); - pltfrm_camera_module_set_pin_state( - sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - - mclk_para.io_voltage = PLTFRM_IO_1V8; - mclk_para.drv_strength = PLTFRM_DRV_STRENGTH_2; - cfg_para.cmd = PLTFRM_MCLK_CFG; - cfg_para.cfg_para = (void *)&mclk_para; - cfg_para.isp_config = &(soc_cfg->isp_config); - soc_cfg->soc_cfg(&cfg_para); - - if (v4l2_subdev_call(sd, - core, - ioctl, - PLTFRM_CIFCAM_G_ITF_CFG, - (void *)&itf_cfg) == 0) { - clk_set_rate(pdata->mclk, itf_cfg.mclk_hz); - } else { - pltfrm_camera_module_pr_err(sd, - "PLTFRM_CIFCAM_G_ITF_CFG failed, mclk set 24m default.\n"); - clk_set_rate(pdata->mclk, 24000000); - } - clk_prepare_enable(pdata->mclk); - } else { - clk_disable_unprepare(pdata->mclk); - - pltfrm_camera_module_set_pin_state( - sd, - PLTFRM_CAMERA_MODULE_PIN_PWR_3RD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - - pltfrm_camera_module_set_pin_state( - sd, - PLTFRM_CAMERA_MODULE_PIN_PWR_2ND, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - - pltfrm_camera_module_set_pin_state( - sd, - PLTFRM_CAMERA_MODULE_PIN_PWR, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - - if (pdata->regulators.regulator) { - for (i = 0; i < pdata->regulators.cnt; i++) { - struct pltfrm_camera_module_regulator - *regulator; - - regulator = pdata->regulators.regulator + i; - if (IS_ERR(regulator->regulator)) - continue; - regulator_disable(regulator->regulator); - } - } - } - - return 0; -} - -int pltfrm_camera_module_set_pin_state( - struct v4l2_subdev *sd, - const char *pin, - enum pltfrm_camera_module_pin_state state) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - int gpio_val; - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(pdata->gpios); i++) { - if (pin == pdata->gpios[i].label) { - if (!gpio_is_valid(pdata->gpios[i].pltfrm_gpio)) - return 0; - if (state == PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE) - gpio_val = (pdata->gpios[i].active_low == - OF_GPIO_ACTIVE_LOW) ? 0 : 1; - else - gpio_val = (pdata->gpios[i].active_low == - OF_GPIO_ACTIVE_LOW) ? 1 : 0; - gpio_set_value(pdata->gpios[i].pltfrm_gpio, gpio_val); - pltfrm_camera_module_pr_debug(sd, - "set GPIO #%d ('%s') to %s\n", - pdata->gpios[i].pltfrm_gpio, - pdata->gpios[i].label, - gpio_val ? "HIGH" : "LOW"); - - return 0; - } - } - - pltfrm_camera_module_pr_err(sd, - "unknown pin '%s'\n", - pin); - return -EINVAL; -} - -int pltfrm_camera_module_get_pin_state( - struct v4l2_subdev *sd, - const char *pin) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - int gpio_val; - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(pdata->gpios); i++) { - if (pin == pdata->gpios[i].label) { - if (!gpio_is_valid(pdata->gpios[i].pltfrm_gpio)) - return 0; - gpio_val = gpio_get_value(pdata->gpios[i].pltfrm_gpio); - pltfrm_camera_module_pr_debug( - sd, - "get GPIO #%d ('%s') is %s\n", - pdata->gpios[i].pltfrm_gpio, - pdata->gpios[i].label, - gpio_val ? "HIGH" : "LOW"); - - return gpio_val; - } - } - - pltfrm_camera_module_pr_err( - sd, - "unknown pin '%s'\n", - pin); - return -EINVAL; -} - -int pltfrm_camera_module_s_power( - struct v4l2_subdev *sd, - int on) -{ - int ret; - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - - pltfrm_camera_module_pr_debug(sd, "%s\n", on ? "on" : "off"); - - if (on) { - /* Enable clock and voltage to Secondary Camera Sensor */ - ret = pltfrm_camera_module_set_pm_state(sd, on); - if (ret) - pltfrm_camera_module_pr_err(sd, - "set PM state failed (%d), could not power on camera\n", - ret); - else { - pltfrm_camera_module_pr_debug(sd, - "set PM state to %d successful, camera module is on\n", - on); - ret = pltfrm_camera_module_set_pinctrl_state( - sd, pdata->pins_default); - } - } else { - /* Disable clock and voltage to Secondary Camera Sensor */ - ret = pltfrm_camera_module_set_pinctrl_state( - sd, pdata->pins_sleep); - if (ret >= 0) { - ret = pltfrm_camera_module_set_pm_state( - sd, on); - if (ret) - pltfrm_camera_module_pr_err(sd, - "set PM state failed (%d), could not power off camera\n", - ret); - else - pltfrm_camera_module_pr_debug(sd, - "set PM state to %d successful, camera module is off\n", - on); - } - } - return ret; -} - -struct v4l2_subdev *pltfrm_camera_module_get_af_ctrl( - struct v4l2_subdev *sd) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - - return pdata->af_ctrl; -} - -char *pltfrm_camera_module_get_flash_driver_name( - struct v4l2_subdev *sd) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - - return (char *)pdata->fl_ctrl.flash_driver_name; -} - -struct v4l2_subdev *pltfrm_camera_module_get_fl_ctrl( - struct v4l2_subdev *sd) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - - return pdata->fl_ctrl.flsh_ctrl; -} - -int pltfrm_camera_module_patch_config( - struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *frm_fmt, - struct v4l2_subdev_frame_interval *frm_intrvl) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct device_node *parent_node = of_node_get(client->dev.of_node); - struct device_node *child_node = NULL, *prev_node = NULL; - int ret = 0; - - pltfrm_camera_module_pr_debug(sd, "pix_fmt %d, %dx%d@%d/%dfps\n", - frm_fmt->code, frm_fmt->width, frm_fmt->height, - frm_intrvl->interval.denominator, - frm_intrvl->interval.numerator); - - while (!IS_ERR_OR_NULL(child_node = - of_get_next_child(parent_node, prev_node))) { - if (strncasecmp(child_node->name, - "rockchip,camera-module-config", - strlen("rockchip,camera-module-config")) == 0) { - ret = pltfrm_camera_module_config_matches( - sd, child_node, frm_fmt, frm_intrvl); - if (IS_ERR_VALUE(ret)) - goto err; - if (ret) { - ret = pltfrm_camera_module_write_reglist_node( - sd, child_node); - if (ret) - goto err; - } - } - of_node_put(prev_node); - prev_node = child_node; - } - of_node_put(prev_node); - of_node_put(parent_node); - - return 0; -err: - pltfrm_camera_module_pr_err(sd, - "failed with error %d\n", ret); - of_node_put(prev_node); - of_node_put(child_node); - of_node_put(parent_node); - return ret; -} - -int pltfrm_camera_module_init( - struct v4l2_subdev *sd, - void **pldata) -{ - int ret = 0; - struct pltfrm_camera_module_data *pdata; - - pltfrm_camera_module_pr_debug(sd, "\n"); - - pdata = pltfrm_camera_module_get_data(sd); - if (IS_ERR_OR_NULL(pdata)) { - pltfrm_camera_module_pr_err(sd, - "unable to get platform data\n"); - return -EFAULT; - } - - ret = pltfrm_camera_module_init_gpio(sd); - if (ret) - pltfrm_camera_module_pr_err(sd, - "GPIO initialization failed (%d)\n", ret); - else - *(struct pltfrm_camera_module_data **)pldata = pdata; - - return ret; -} - -void pltfrm_camera_module_release( - struct v4l2_subdev *sd) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - unsigned int i; - - /* GPIOs also needs to be freed for other sensors to use */ - for (i = 0; i < ARRAY_SIZE(pdata->gpios); i++) { - if (gpio_is_valid(pdata->gpios[i].pltfrm_gpio)) { - pltfrm_camera_module_pr_debug(sd, - "free GPIO #%d ('%s')\n", - pdata->gpios[i].pltfrm_gpio, - pdata->gpios[i].label); - gpio_free( - pdata->gpios[i].pltfrm_gpio); - } - } - for (i = 0; i < pdata->regulators.cnt; i++) { - if (!IS_ERR(pdata->regulators.regulator[i].regulator)) - devm_regulator_put( - pdata->regulators.regulator[i].regulator); - } - - if (!IS_ERR_OR_NULL(pdata->regulators.regulator)) { - devm_kfree(&client->dev, - pdata->regulators.regulator); - pdata->regulators.regulator = NULL; - } - if (pdata->pinctrl) - devm_pinctrl_put(pdata->pinctrl); - if (!IS_ERR_OR_NULL(pdata)) { - devm_kfree(&client->dev, pdata); - pdata = NULL; - } -} - -/* ======================================================================== */ -long pltfrm_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - struct v4l2_subdev *af_ctrl; - int ret = 0; - - pltfrm_camera_module_pr_debug(sd, "cmd: 0x%x\n", cmd); - - if (cmd == RK_VIDIOC_CAMERA_MODULEINFO) { - struct camera_module_info_s *p_camera_module = - (struct camera_module_info_s *)arg; - - /* - * strlcpy((char *)p_camera_module->sensor_name, - * (char *)client->driver->driver.name, - * sizeof(p_camera_module->sensor_name)); - */ - - if (pdata->info.module_name) - strcpy((char *)p_camera_module->module_name, - pdata->info.module_name); - else - strcpy((char *)p_camera_module->module_name, "(null)"); - if (pdata->info.len_name) - strcpy((char *)p_camera_module->len_name, - pdata->info.len_name); - else - strcpy((char *)p_camera_module->len_name, "(null)"); - if (pdata->info.fov_h) - strcpy((char *)p_camera_module->fov_h, - pdata->info.fov_h); - else - strcpy((char *)p_camera_module->fov_h, "(null)"); - if (pdata->info.fov_v) - strcpy((char *)p_camera_module->fov_v, - pdata->info.fov_v); - else - strcpy((char *)p_camera_module->fov_v, "(null)"); - if (pdata->info.focal_length) - strcpy((char *)p_camera_module->focal_length, - pdata->info.focal_length); - else - strcpy((char *)p_camera_module->focal_length, "(null)"); - if (pdata->info.focus_distance) - strcpy((char *)p_camera_module->focus_distance, - pdata->info.focus_distance); - else - strcpy((char *)p_camera_module->focus_distance, - "(null)"); - - p_camera_module->facing = pdata->info.facing; - p_camera_module->orientation = pdata->info.orientation; - p_camera_module->iq_mirror = pdata->info.iq_mirror; - p_camera_module->iq_flip = pdata->info.iq_flip; - p_camera_module->flash_support = pdata->info.flash_support; - p_camera_module->flash_exp_percent = - pdata->info.flash_exp_percent; - p_camera_module->af_support = pdata->info.af_support; - - return 0; - } else if (cmd == PLTFRM_CIFCAM_G_DEFRECT) { - struct pltfrm_cam_defrect *defrect = - (struct pltfrm_cam_defrect *)arg; - unsigned int i; - - for (i = 0; i < 4; i++) { - if ((pdata->defrects[i].width == defrect->width) && - (pdata->defrects[i].height == defrect->height)) - defrect->defrect = pdata->defrects[i].defrect; - } - return 0; - } else if (cmd == PLTFRM_CIFCAM_G_ITF_CFG) { - struct pltfrm_cam_itf *itf_cfg = (struct pltfrm_cam_itf *)arg; - - if (PLTFRM_CAM_ITF_IS_MIPI(itf_cfg->type)) - itf_cfg->cfg.mipi.dphy_index = - pdata->itf.itf.mipi.dphy_index; - - return 0; - } else if (cmd == PLTFRM_CIFCAM_ATTACH) { - return pltfrm_camera_module_init_pm(sd, - (struct pltfrm_soc_cfg *)arg); - } else if ((cmd == PLTFRM_CIFCAM_SET_VCM_POS) || - (cmd == PLTFRM_CIFCAM_GET_VCM_POS) || - (cmd == PLTFRM_CIFCAM_GET_VCM_MOVE_RES)) { - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - ret = v4l2_subdev_call(af_ctrl, - core, ioctl, cmd, arg); - return ret; - } else { - return -EINVAL; - } - } - - return ret; -} - -int pltfrm_camera_module_get_flip_mirror( - struct v4l2_subdev *sd) -{ - int mode = 0; - struct i2c_client *client = v4l2_get_subdevdata(sd); - struct pltfrm_camera_module_data *pdata = - dev_get_platdata(&client->dev); - - if ((pdata->info.flip == -1) && pdata->info.mirror == -1) - return -1; - - if (pdata->info.flip) - mode |= 0x02; - else - mode &= ~0x02; - - if (pdata->info.mirror) - mode |= 0x01; - else - mode &= ~0x01; - - return mode; -} - -int pltfrm_camera_module_pix_fmt2csi2_dt(int src_pix_fmt) -{ - int ret = 0; - - switch (src_pix_fmt) { - case MEDIA_BUS_FMT_RGB444_1X12: - case MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE: - case MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE: - ret = CSI2_DT_RGB444; - break; - case MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE: - case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE: - ret = CSI2_DT_RGB555; - break; - case MEDIA_BUS_FMT_RGB565_1X16: - case MEDIA_BUS_FMT_BGR565_2X8_BE: - case MEDIA_BUS_FMT_BGR565_2X8_LE: - case MEDIA_BUS_FMT_RGB565_2X8_BE: - case MEDIA_BUS_FMT_RGB565_2X8_LE: - ret = CSI2_DT_RGB565; - break; - case MEDIA_BUS_FMT_RGB666_1X18: - case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: - case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: - ret = CSI2_DT_RGB666; - break; - case MEDIA_BUS_FMT_RBG888_1X24: - case MEDIA_BUS_FMT_BGR888_1X24: - case MEDIA_BUS_FMT_GBR888_1X24: - case MEDIA_BUS_FMT_RGB888_1X24: - case MEDIA_BUS_FMT_RGB888_2X12_BE: - case MEDIA_BUS_FMT_RGB888_2X12_LE: - case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: - case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: - case MEDIA_BUS_FMT_ARGB8888_1X32: - case MEDIA_BUS_FMT_RGB888_1X32_PADHI: - case MEDIA_BUS_FMT_RGB101010_1X30: - case MEDIA_BUS_FMT_RGB121212_1X36: - case MEDIA_BUS_FMT_RGB161616_1X48: - ret = CSI2_DT_RGB888; - break; - case MEDIA_BUS_FMT_Y8_1X8: - case MEDIA_BUS_FMT_UV8_1X8: - case MEDIA_BUS_FMT_UYVY8_1_5X8: - case MEDIA_BUS_FMT_VYUY8_1_5X8: - case MEDIA_BUS_FMT_YUYV8_1_5X8: - case MEDIA_BUS_FMT_YVYU8_1_5X8: - case MEDIA_BUS_FMT_UYVY8_2X8: - case MEDIA_BUS_FMT_VYUY8_2X8: - case MEDIA_BUS_FMT_YUYV8_2X8: - case MEDIA_BUS_FMT_YVYU8_2X8: - ret = CSI2_DT_YUV420_8b; - break; - case MEDIA_BUS_FMT_Y10_1X10: - case MEDIA_BUS_FMT_UYVY10_2X10: - case MEDIA_BUS_FMT_VYUY10_2X10: - case MEDIA_BUS_FMT_YUYV10_2X10: - case MEDIA_BUS_FMT_YVYU10_2X10: - ret = CSI2_DT_YUV420_10b; - break; - case MEDIA_BUS_FMT_Y12_1X12: - case MEDIA_BUS_FMT_UYVY12_2X12: - case MEDIA_BUS_FMT_VYUY12_2X12: - case MEDIA_BUS_FMT_YUYV12_2X12: - case MEDIA_BUS_FMT_YVYU12_2X12: - case MEDIA_BUS_FMT_UYVY8_1X16: - case MEDIA_BUS_FMT_VYUY8_1X16: - case MEDIA_BUS_FMT_YUYV8_1X16: - case MEDIA_BUS_FMT_YVYU8_1X16: - case MEDIA_BUS_FMT_YDYUYDYV8_1X16: - ret = CSI2_DT_YUV422_8b; - break; - case MEDIA_BUS_FMT_UYVY10_1X20: - case MEDIA_BUS_FMT_VYUY10_1X20: - case MEDIA_BUS_FMT_YUYV10_1X20: - case MEDIA_BUS_FMT_YVYU10_1X20: - case MEDIA_BUS_FMT_VUY8_1X24: - case MEDIA_BUS_FMT_YUV8_1X24: - case MEDIA_BUS_FMT_UYYVYY8_0_5X24: - case MEDIA_BUS_FMT_UYVY12_1X24: - case MEDIA_BUS_FMT_VYUY12_1X24: - case MEDIA_BUS_FMT_YUYV12_1X24: - case MEDIA_BUS_FMT_YVYU12_1X24: - case MEDIA_BUS_FMT_YUV10_1X30: - case MEDIA_BUS_FMT_UYYVYY10_0_5X30: - case MEDIA_BUS_FMT_AYUV8_1X32: - case MEDIA_BUS_FMT_UYYVYY12_0_5X36: - case MEDIA_BUS_FMT_YUV12_1X36: - case MEDIA_BUS_FMT_YUV16_1X48: - case MEDIA_BUS_FMT_UYYVYY16_0_5X48: - ret = CSI2_DT_YUV422_10b; - break; - case MEDIA_BUS_FMT_SBGGR8_1X8: - case MEDIA_BUS_FMT_SGBRG8_1X8: - case MEDIA_BUS_FMT_SGRBG8_1X8: - case MEDIA_BUS_FMT_SRGGB8_1X8: - ret = CSI2_DT_RAW8; - break; - case MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8: - case MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8: - case MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8: - case MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8: - case MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8: - case MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8: - case MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8: - case MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8: - case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE: - case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE: - case MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE: - case MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE: - case MEDIA_BUS_FMT_SBGGR10_1X10: - case MEDIA_BUS_FMT_SGBRG10_1X10: - case MEDIA_BUS_FMT_SGRBG10_1X10: - case MEDIA_BUS_FMT_SRGGB10_1X10: - ret = CSI2_DT_RAW10; - break; - case MEDIA_BUS_FMT_SBGGR12_1X12: - case MEDIA_BUS_FMT_SGBRG12_1X12: - case MEDIA_BUS_FMT_SGRBG12_1X12: - case MEDIA_BUS_FMT_SRGGB12_1X12: - ret = CSI2_DT_RAW12; - break; - default: - break; - } - return ret; -} - -#endif - diff --git a/drivers/media/i2c/soc_camera/rockchip/rk_camera_module_version.h b/drivers/media/i2c/soc_camera/rockchip/rk_camera_module_version.h deleted file mode 100644 index 4e52a333e819..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/rk_camera_module_version.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * rk_camera_module.h - * (Based on Intel driver for sofiaxxx) - * - * Copyright (C) 2015 Intel Mobile Communications GmbH - * Copyright (C) 2016 Fuzhou Rockchip 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 as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ -#ifndef _RK_CAMERA_MODULE_VERSION_H_ -#define _RK_CAMERA_MODULE_VERSION_H_ -#include - -/* - * CIF DRIVER VERSION NOTE - * - * v0.1.0: - * 1. Initialize version; - * 2. Update sensor configuration after power up sensor in - * ov_camera_module_s_power. - * Because mipi datalane may be no still on LP11 state when - * sensor configuration; - * - */ - -#define CONFIG_RK_CAMERA_MODULE_VERSION KERNEL_VERSION(0, 1, 0) - -#endif diff --git a/drivers/media/i2c/soc_camera/rockchip/sc031gs_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/sc031gs_v4l2-i2c-subdev.c deleted file mode 100644 index c9ca8b4abe62..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/sc031gs_v4l2-i2c-subdev.c +++ /dev/null @@ -1,787 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * sc031gs sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * Note: - * - *v0.1.0: - *1. Initialize version; - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "sc_camera_module.h" - -#define SC031GS_DRIVER_NAME "sc031gs" - -#define SC031GS_AEC_PK_LONG_GAIN_HIGH_REG 0x3e08 -#define SC031GS_AEC_PK_LONG_GAIN_LOW_REG 0x3e09 - -#define SC031GS_AEC_PK_LONG_EXPO_HIGH_REG 0x3e01 -#define SC031GS_AEC_PK_LONG_EXPO_LOW_REG 0x3e02 - -#define SC031GS_AEC_GROUP_UPDATE_ADDRESS 0x3812 -#define SC031GS_AEC_GROUP_UPDATE_START_DATA 0x00 -#define SC031GS_AEC_GROUP_UPDATE_END_DATA 0x30 - -#define SC031GS_PIDH_ADDR 0x3107 -#define SC031GS_PIDL_ADDR 0x3108 - -/* High byte of product ID */ -#define SC031GS_PIDH_MAGIC 0x00 -/* Low byte of product ID */ -#define SC031GS_PIDL_MAGIC 0x31 - -#define SC031GS_EXT_CLK 24000000 -#define SC031GS_TIMING_VTS_HIGH_REG 0x320e -#define SC031GS_TIMING_VTS_LOW_REG 0x320f -#define SC031GS_TIMING_HTS_HIGH_REG 0x320c -#define SC031GS_TIMING_HTS_LOW_REG 0x320d -#define SC031GS_FINE_INTG_TIME_MIN 0 -#define SC031GS_FINE_INTG_TIME_MAX_MARGIN 0 -#define SC031GS_COARSE_INTG_TIME_MIN 1 -#define SC031GS_COARSE_INTG_TIME_MAX_MARGIN 4 -#define SC031GS_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3208 -#define SC031GS_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3209 -#define SC031GS_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x320a -#define SC031GS_VERTICAL_OUTPUT_SIZE_LOW_REG 0x320b - -#define SC031GS_MIRROR_FILP 0x3221 - -static struct sc_camera_module sc031gs; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ -/* MCLK:24MHz 640x480 50fps mipi 1lane 10bit 720Mbps/lane */ -static struct sc_camera_module_reg sc031gs_init_tab_640_480_50fps[] = { -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3000, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3001, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x300f, 0x0f}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0x13}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3019, 0xfe}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x301c, 0x78}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3031, 0x0a}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3037, 0x20}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x303f, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3208, 0x02}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3209, 0x80}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320a, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320b, 0xe0}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320c, 0x03}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320d, 0x6e}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320e, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320f, 0x67}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3250, 0xc0}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3251, 0x02}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3252, 0x02}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3253, 0xa6}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3254, 0x02}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3255, 0x07}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3304, 0x48}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3306, 0x38}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3309, 0x68}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x330b, 0xe0}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x330c, 0x18}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x330f, 0x20}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3310, 0x10}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3314, 0x3a}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3315, 0x38}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3316, 0x48}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3317, 0x20}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3329, 0x3c}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x332d, 0x3c}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x332f, 0x40}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3335, 0x44}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3344, 0x44}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x335b, 0x80}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x335f, 0x80}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3366, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3385, 0x31}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3387, 0x51}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3389, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x33b1, 0x03}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x33b2, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3621, 0xa4}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3622, 0x05}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3630, 0x46}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3631, 0x48}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3633, 0x52}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x25}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3637, 0x89}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3638, 0x0f}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3639, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x363a, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x363b, 0x48}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x363c, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x363d, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x363e, 0xf8}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3640, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3641, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x36e9, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x36ea, 0x3b}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x36eb, 0x0e}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x36ec, 0x0e}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x36ed, 0x33}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x36f9, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x36fa, 0x3a}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x36fc, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3908, 0x91}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3d08, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e01, 0x2a}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e02, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e03, 0x0b}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e06, 0x0c}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x4500, 0x59}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x4501, 0xc4}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x5011, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x4418, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x4419, 0x8a}, -}; - -static struct sc_camera_module_config sc031gs_configs[] = { - { - .name = "640x480_50fps", - .frm_fmt = { - .width = 640, - .height = 480, - .code = MEDIA_BUS_FMT_Y10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 50 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)sc031gs_init_tab_640_480_50fps, - .reg_table_num_entries = - ARRAY_SIZE(sc031gs_init_tab_640_480_50fps), - .v_blanking_time_us = 3078, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 1, 720, SC031GS_EXT_CLK) - } -}; - -static int sc031gs_set_flip(struct sc_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - int i, mode = 0; - u16 orientation = 0; - - mode = sc_camera_module_get_flip_mirror(cam_mod); - - if (mode == -1) { - sc_camera_module_pr_debug(cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - if (mode == SC_MIRROR_BIT_MASK) - orientation |= 0x06; - if (mode == SC_FLIP_BIT_MASK) - orientation |= 0x60; - for (i = 0; i < len; i++) { - if (reglist[i].reg == SC031GS_MIRROR_FILP) - reglist[i].val = orientation; - } - } - return 0; -} - -static int sc031gs_g_vts(struct sc_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = sc_camera_module_read_reg_table(cam_mod, - SC031GS_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = sc_camera_module_read_reg_table(cam_mod, - SC031GS_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - - return 0; -err: - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int sc031gs_auto_adjust_fps(struct sc_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - if ((exp_time + SC031GS_COARSE_INTG_TIME_MAX_MARGIN) > - cam_mod->vts_min) - vts = (exp_time + SC031GS_COARSE_INTG_TIME_MAX_MARGIN); - else - vts = cam_mod->vts_min; - - ret = sc_camera_module_write_reg(cam_mod, - SC031GS_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= sc_camera_module_write_reg(cam_mod, - SC031GS_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - sc_camera_module_pr_debug(cam_mod, - "updated vts = 0x%x,vts_min=0x%x\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int sc031gs_set_vts(struct sc_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts <= cam_mod->vts_min) - return ret; - - ret = sc_camera_module_write_reg(cam_mod, - SC031GS_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= sc_camera_module_write_reg(cam_mod, - SC031GS_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - sc_camera_module_pr_debug(cam_mod, - "updated vts = 0x%x,vts_min=0x%x\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int sc031gs_write_aec(struct sc_camera_module *cam_mod) -{ - int ret = 0; - - sc_camera_module_pr_debug(cam_mod, - "exp_time = %d lines, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - if (cam_mod->state == SC_CAMERA_MODULE_SW_STANDBY || - cam_mod->state == SC_CAMERA_MODULE_STREAMING) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time = cam_mod->exp_config.exp_time; - u32 vts = cam_mod->vts_min; - u32 coarse_again, fine_again, fine_again_reg, coarse_again_reg; - - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - - /* hold reg start */ - mutex_lock(&cam_mod->lock); - ret = sc_camera_module_write_reg(cam_mod, - SC031GS_AEC_GROUP_UPDATE_ADDRESS, - SC031GS_AEC_GROUP_UPDATE_START_DATA); - - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret |= sc031gs_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - if (exp_time > vts - 6) - exp_time = vts - 6; - - if (a_gain < 0x20) { /*1x ~ 2x*/ - fine_again = a_gain - 16; - coarse_again = 0x03; - fine_again_reg = ((0x01 << 4) & 0x10) | - (fine_again & 0x0f); - coarse_again_reg = coarse_again & 0x1F; - } else if (a_gain < 0x40) { /*2x ~ 4x*/ - fine_again = (a_gain >> 1) - 16; - coarse_again = 0x7; - fine_again_reg = ((0x01 << 4) & 0x10) | - (fine_again & 0x0f); - coarse_again_reg = coarse_again & 0x1F; - } else if (a_gain < 0x80) { /*4x ~ 8x*/ - fine_again = (a_gain >> 2) - 16; - coarse_again = 0xf; - fine_again_reg = ((0x01 << 4) & 0x10) | - (fine_again & 0x0f); - coarse_again_reg = coarse_again & 0x1F; - } else { /*8x ~ 16x*/ - fine_again = (a_gain >> 3) - 16; - coarse_again = 0x1f; - fine_again_reg = ((0x01 << 4) & 0x10) | - (fine_again & 0x0f); - coarse_again_reg = coarse_again & 0x1F; - } - - if (a_gain < 0x20) { - ret |= sc_camera_module_write_reg(cam_mod, - 0x3314, 0x3a); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3317, 0x20); - } else { - ret |= sc_camera_module_write_reg(cam_mod, - 0x3314, 0x44); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3317, 0x0f); - } - - ret |= sc_camera_module_write_reg(cam_mod, - SC031GS_AEC_PK_LONG_GAIN_HIGH_REG, - coarse_again_reg); - ret |= sc_camera_module_write_reg(cam_mod, - SC031GS_AEC_PK_LONG_GAIN_LOW_REG, - fine_again_reg); - - ret |= sc_camera_module_write_reg(cam_mod, - SC031GS_AEC_PK_LONG_EXPO_HIGH_REG, - (exp_time >> 4) & 0xff); - ret |= sc_camera_module_write_reg(cam_mod, - SC031GS_AEC_PK_LONG_EXPO_LOW_REG, - (exp_time & 0xff) << 4); - - if (!cam_mod->auto_adjust_fps) - ret |= sc031gs_set_vts(cam_mod, - cam_mod->exp_config.vts_value); - - /* hold reg end */ - ret |= sc_camera_module_write_reg(cam_mod, - SC031GS_AEC_GROUP_UPDATE_ADDRESS, - SC031GS_AEC_GROUP_UPDATE_END_DATA); - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int sc031gs_g_ctrl(struct sc_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - sc_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - sc_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int sc031gs_filltimings(struct sc_camera_module_custom_config *custom) -{ - u32 i, j; - u32 win_h_off = 0, win_v_off = 0; - struct sc_camera_module_config *config; - struct sc_camera_module_timings *timings; - struct sc_camera_module_reg *reg_table; - u32 reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - memset(timings, 0x00, sizeof(*timings)); - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case SC031GS_TIMING_VTS_HIGH_REG: - if (timings->frame_length_lines & 0xff00) - timings->frame_length_lines = 0; - timings->frame_length_lines = - ((reg_table[j].val << 8) | - (timings->frame_length_lines & 0xff)); - break; - case SC031GS_TIMING_VTS_LOW_REG: - timings->frame_length_lines = - (reg_table[j].val | - (timings->frame_length_lines & 0xff00)); - break; - case SC031GS_TIMING_HTS_HIGH_REG: - if (timings->line_length_pck & 0xff00) - timings->line_length_pck = 0; - timings->line_length_pck = - ((reg_table[j].val << 8) | - timings->line_length_pck); - break; - case SC031GS_TIMING_HTS_LOW_REG: - timings->line_length_pck = - (reg_table[j].val | - (timings->line_length_pck & 0xff00)); - break; - case SC031GS_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - ((reg_table[j].val << 8) | - (timings->sensor_output_width & 0xff)); - break; - case SC031GS_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width = - (reg_table[j].val | - (timings->sensor_output_width & 0xff00)); - break; - case SC031GS_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - ((reg_table[j].val << 8) | - (timings->sensor_output_height & 0xff)); - break; - case SC031GS_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height = - (reg_table[j].val | - (timings->sensor_output_height & 0xff00)); - break; - } - } - - timings->crop_horizontal_start += win_h_off; - timings->crop_horizontal_end -= win_h_off; - timings->crop_vertical_start += win_v_off; - timings->crop_vertical_end -= win_v_off; - timings->exp_time = timings->exp_time >> 4; - - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator - * timings->frame_length_lines - * timings->line_length_pck; - - timings->coarse_integration_time_min = - SC031GS_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - SC031GS_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = - SC031GS_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - SC031GS_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -static int sc031gs_g_timings(struct sc_camera_module *cam_mod, - struct sc_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - - timings->frame_length_lines = vts; - - return ret; -err: - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int sc031gs_s_ctrl(struct sc_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - sc_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = sc031gs_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - case V4L2_CID_FOCUS_ABSOLUTE: - /* todo*/ - break; - /* - *case RK_V4L2_CID_AUTO_FPS: - * if (cam_mod->auto_adjust_fps) - * ret = sc031gs_auto_adjust_fps( - *cam_mod, - *cam_mod->exp_config.exp_time); - *break; - */ - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int sc031gs_s_ext_ctrls(struct sc_camera_module *cam_mod, - struct sc_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = sc031gs_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - sc_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - - return ret; -} - -static int sc031gs_start_streaming(struct sc_camera_module *cam_mod) -{ - int ret = 0; - - sc_camera_module_pr_info(cam_mod, "active config=%s\n", - cam_mod->active_config->name); - - ret = sc031gs_g_vts(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = sc_camera_module_write_reg(cam_mod, 0x0100, 0x01); - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - sc_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -static int sc031gs_stop_streaming(struct sc_camera_module *cam_mod) -{ - int ret = 0; - - sc_camera_module_pr_info(cam_mod, "\n"); - - ret = sc_camera_module_write_reg(cam_mod, 0x0100, 0x00); - - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - sc_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -static int sc031gs_check_camera_id(struct sc_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - sc_camera_module_pr_debug(cam_mod, "\n"); - - ret |= sc_camera_module_read_reg(cam_mod, 1, SC031GS_PIDH_ADDR, &pidh); - ret |= sc_camera_module_read_reg(cam_mod, 1, SC031GS_PIDL_ADDR, &pidl); - - if (IS_ERR_VALUE(ret)) { - sc_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if (pidh == SC031GS_PIDH_MAGIC && pidl == SC031GS_PIDL_MAGIC) { - sc_camera_module_pr_info(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - } else { - sc_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - SC031GS_PIDH_MAGIC, SC031GS_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - sc_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops sc031gs_camera_module_core_ops = { - .g_ctrl = sc_camera_module_g_ctrl, - .s_ctrl = sc_camera_module_s_ctrl, - .s_ext_ctrls = sc_camera_module_s_ext_ctrls, - .s_power = sc_camera_module_s_power, - .ioctl = sc_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops sc031gs_camera_module_video_ops = { - .s_frame_interval = sc_camera_module_s_frame_interval, - .g_frame_interval = sc_camera_module_g_frame_interval, - .s_stream = sc_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops sc031gs_camera_module_pad_ops = { - .enum_frame_interval = sc_camera_module_enum_frameintervals, - .get_fmt = sc_camera_module_g_fmt, - .set_fmt = sc_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops sc031gs_camera_module_ops = { - .core = &sc031gs_camera_module_core_ops, - .video = &sc031gs_camera_module_video_ops, - .pad = &sc031gs_camera_module_pad_ops, -}; - -static struct sc_camera_module_custom_config sc031gs_custom_config = { - .start_streaming = sc031gs_start_streaming, - .stop_streaming = sc031gs_stop_streaming, - .s_ctrl = sc031gs_s_ctrl, - .g_ctrl = sc031gs_g_ctrl, - .s_ext_ctrls = sc031gs_s_ext_ctrls, - .g_timings = sc031gs_g_timings, - .set_flip = sc031gs_set_flip, - .s_vts = sc031gs_auto_adjust_fps, - .check_camera_id = sc031gs_check_camera_id, - .configs = sc031gs_configs, - .num_configs = ARRAY_SIZE(sc031gs_configs), - .power_up_delays_ms = {5, 30, 30}, - /* - *0: Exposure time valid fields; - *1: Exposure gain valid fields; - *(2 fields == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static int sc031gs_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - sc031gs_filltimings(&sc031gs_custom_config); - - v4l2_i2c_subdev_init(&sc031gs.sd, client, - &sc031gs_camera_module_ops); - sc031gs.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; - sc031gs.custom = sc031gs_custom_config; - mutex_init(&sc031gs.lock); - dev_info(&client->dev, "probing successful\n"); - - return 0; -} - -static int sc031gs_remove(struct i2c_client *client) -{ - struct sc_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - mutex_destroy(&cam_mod->lock); - sc_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id sc031gs_id[] = { - { SC031GS_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id sc031gs_of_match[] = { - {.compatible = "smartsens,sc031gs-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, sc031gs_id); - -static struct i2c_driver sc031gs_i2c_driver = { - .driver = { - .name = SC031GS_DRIVER_NAME, - .of_match_table = sc031gs_of_match - }, - .probe = sc031gs_probe, - .remove = sc031gs_remove, - .id_table = sc031gs_id, -}; - -module_i2c_driver(sc031gs_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for sc031gs"); -MODULE_AUTHOR("zack.zeng"); -MODULE_LICENSE("GPL"); - diff --git a/drivers/media/i2c/soc_camera/rockchip/sc2232_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/sc2232_v4l2-i2c-subdev.c deleted file mode 100644 index 0d99587c1df0..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/sc2232_v4l2-i2c-subdev.c +++ /dev/null @@ -1,844 +0,0 @@ -/* - * sc2232 sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - * Note: - * - *v0.1.0: - *1. Initialize version; - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "sc_camera_module.h" - -#define SC2232_DRIVER_NAME "sc2232" - -#define SC2232_AEC_PK_LONG_GAIN_HIGH_REG 0x3e08 -#define SC2232_AEC_PK_LONG_GAIN_LOW_REG 0x3e09 - -#define SC2232_AEC_PK_LONG_EXPO_HIGH_REG 0x3e01 -#define SC2232_AEC_PK_LONG_EXPO_LOW_REG 0x3e02 - -#define SC2232_AEC_GROUP_UPDATE_ADDRESS 0x3812 -#define SC2232_AEC_GROUP_UPDATE_START_DATA 0x00 -#define SC2232_AEC_GROUP_UPDATE_END_DATA 0x30 - -#define SC2232_PIDH_ADDR 0x3107 -#define SC2232_PIDL_ADDR 0x3108 - -/* High byte of product ID */ -#define SC2232_PIDH_MAGIC 0x22 -/* Low byte of product ID */ -#define SC2232_PIDL_MAGIC 0x32 - -#define SC2232_EXT_CLK 24000000 -#define SC2232_TIMING_VTS_HIGH_REG 0x320e -#define SC2232_TIMING_VTS_LOW_REG 0x320f -#define SC2232_TIMING_HTS_HIGH_REG 0x320c -#define SC2232_TIMING_HTS_LOW_REG 0x320d -#define SC2232_FINE_INTG_TIME_MIN 0 -#define SC2232_FINE_INTG_TIME_MAX_MARGIN 0 -#define SC2232_COARSE_INTG_TIME_MIN 1 -#define SC2232_COARSE_INTG_TIME_MAX_MARGIN 4 -#define SC2232_HORIZONTAL_OUTPUT_SIZE_HIGH_REG 0x3208 -#define SC2232_HORIZONTAL_OUTPUT_SIZE_LOW_REG 0x3209 -#define SC2232_VERTICAL_OUTPUT_SIZE_HIGH_REG 0x320a -#define SC2232_VERTICAL_OUTPUT_SIZE_LOW_REG 0x320b - -#define SC2232_MIRROR_FILP 0x3221 - -static struct sc_camera_module sc2232; - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ -/* MCLK:24MHz 1920x1080 30fps mipi 2lane 10bit 390Mbps/lane */ -static struct sc_camera_module_reg sc2232_init_tab_1920_1080_30fps[] = { -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3001, 0xfe}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3018, 0x33}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3031, 0x0a}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3034, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3035, 0x9b}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3037, 0x20}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3038, 0xff}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3039, 0x54}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x303a, 0xb3}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x303b, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x303c, 0x0e}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320c, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320d, 0x20}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320e, 0x04}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x320f, 0xe2}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3211, 0x0c}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3213, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3222, 0x29}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3235, 0x09}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3236, 0xc2}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3301, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3302, 0x1f}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3303, 0x20}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3306, 0x48}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3308, 0x10}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3309, 0x60}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x330b, 0xd3}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x330e, 0x30}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3314, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x331b, 0x83}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x331e, 0x19}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x331f, 0x59}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3320, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3326, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3333, 0x30}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x335e, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x335f, 0x03}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3366, 0x7c}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3367, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3368, 0x04}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3369, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x336a, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x336b, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x337c, 0x04}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x337d, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x337f, 0x03}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x33a0, 0x05}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x33aa, 0x10}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x360f, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3620, 0x28}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3621, 0x28}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3622, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3624, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3625, 0x02}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3630, 0x1c}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3631, 0x84}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3632, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3633, 0x4f}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3635, 0xa0}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3636, 0x25}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3637, 0x59}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3638, 0x1f}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3639, 0x09}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x363b, 0x0b}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x363c, 0x05}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x366e, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x366f, 0x2f}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3670, 0x0c}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3671, 0xc6}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3672, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3673, 0x16}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3677, 0x84}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3678, 0x88}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3679, 0x88}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x367a, 0x28}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x367b, 0x3f}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x367e, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x367f, 0x28}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3690, 0x34}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3691, 0x11}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3692, 0x42}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x369c, 0x08}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x369d, 0x28}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3802, 0x01}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3901, 0x02}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3902, 0x45}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3905, 0x98}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3907, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3908, 0x11}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x391b, 0x80}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e00, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e01, 0x8c}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e02, 0xa0}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e03, 0x03}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e06, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e07, 0x80}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e08, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e09, 0x10}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3e1e, 0x34}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3f00, 0x07}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3f04, 0x03}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x3f05, 0xec}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x4603, 0x00}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x4827, 0x48}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x4837, 0x34}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x5000, 0x06}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x5780, 0xff}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x5781, 0x04}, -{SC_CAMERA_MODULE_REG_TYPE_DATA, 0x5785, 0x18}, -}; - -/* ======================================================================== */ - -static struct sc_camera_module_config sc2232_configs[] = { - { - .name = "1920x1080_30fps", - .frm_fmt = { - .width = 1920, - .height = 1080, - .code = MEDIA_BUS_FMT_SBGGR10_1X10 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 30 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)sc2232_init_tab_1920_1080_30fps, - .reg_table_num_entries = - ARRAY_SIZE(sc2232_init_tab_1920_1080_30fps), - .v_blanking_time_us = 3078, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - PLTFRM_CAM_ITF_MIPI_CFG(0, 2, 390, SC2232_EXT_CLK) - } -}; - -static int sc2232_set_flip(struct sc_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len) -{ - int i, mode = 0; - u16 orientation = 0; - - mode = sc_camera_module_get_flip_mirror(cam_mod); - - if (mode == -1) { - sc_camera_module_pr_debug(cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - if (mode == SC_MIRROR_BIT_MASK) - orientation |= 0x06; - if (mode == SC_FLIP_BIT_MASK) - orientation |= 0x60; - for (i = 0; i < len; i++) { - if (reglist[i].reg == SC2232_MIRROR_FILP) - reglist[i].val = orientation; - } - } - - return 0; -} - -static int SC2232_g_VTS(struct sc_camera_module *cam_mod, u32 *vts) -{ - u32 msb, lsb; - int ret; - - ret = sc_camera_module_read_reg_table(cam_mod, - SC2232_TIMING_VTS_HIGH_REG, - &msb); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = sc_camera_module_read_reg_table(cam_mod, - SC2232_TIMING_VTS_LOW_REG, - &lsb); - if (IS_ERR_VALUE(ret)) - goto err; - - *vts = (msb << 8) | lsb; - - return 0; -err: - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int sc2232_auto_adjust_fps(struct sc_camera_module *cam_mod, - u32 exp_time) -{ - int ret; - u32 vts; - - exp_time = exp_time << 1; - - if ((exp_time + SC2232_COARSE_INTG_TIME_MAX_MARGIN) > - 2 * cam_mod->vts_min) - vts = (exp_time + SC2232_COARSE_INTG_TIME_MAX_MARGIN) >> 1; - else - vts = cam_mod->vts_min; - - ret = sc_camera_module_write_reg(cam_mod, - SC2232_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= sc_camera_module_write_reg(cam_mod, - SC2232_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - sc_camera_module_pr_info(cam_mod, - "updated vts = 0x%x,vts_min=0x%x\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int sc2232_set_vts(struct sc_camera_module *cam_mod, - u32 vts) -{ - int ret = 0; - - if (vts <= cam_mod->vts_min) - return ret; - - ret = sc_camera_module_write_reg(cam_mod, - SC2232_TIMING_VTS_LOW_REG, - vts & 0xFF); - ret |= sc_camera_module_write_reg(cam_mod, - SC2232_TIMING_VTS_HIGH_REG, - (vts >> 8) & 0xFF); - - if (IS_ERR_VALUE(ret)) { - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - } else { - sc_camera_module_pr_info(cam_mod, - "updated vts = 0x%x,vts_min=0x%x\n", - vts, cam_mod->vts_min); - cam_mod->vts_cur = vts; - } - - return ret; -} - -static int sc2232_write_aec(struct sc_camera_module *cam_mod) -{ - int ret = 0; - - sc_camera_module_pr_debug(cam_mod, - "exp_time = %d lines, gain = %d, flash_mode = %d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - /* - * if the sensor is already streaming, write to shadow registers, - * if the sensor is in SW standby, write to active registers, - * if the sensor is off/registers are not writeable, do nothing - */ - - if (cam_mod->state == SC_CAMERA_MODULE_SW_STANDBY || - cam_mod->state == SC_CAMERA_MODULE_STREAMING) { - u32 a_gain = cam_mod->exp_config.gain; - u32 exp_time = cam_mod->exp_config.exp_time; - - a_gain = a_gain * cam_mod->exp_config.gain_percent / 100; - - if (!IS_ERR_VALUE(ret) && cam_mod->auto_adjust_fps) - ret |= sc2232_auto_adjust_fps(cam_mod, - cam_mod->exp_config.exp_time); - - if (a_gain > 0xf04) - a_gain = 0xf04; - exp_time = exp_time << 1; - if (exp_time > 0xfff) - exp_time = 0xfff; - - /* hold reg start */ - mutex_lock(&cam_mod->lock); - ret = sc_camera_module_write_reg(cam_mod, - SC2232_AEC_GROUP_UPDATE_ADDRESS, - SC2232_AEC_GROUP_UPDATE_START_DATA); - - ret |= sc_camera_module_write_reg(cam_mod, - SC2232_AEC_PK_LONG_GAIN_HIGH_REG, - (a_gain >> 8) & 0xff); - ret |= sc_camera_module_write_reg(cam_mod, - SC2232_AEC_PK_LONG_GAIN_LOW_REG, - a_gain & 0xff); - - if (a_gain < 0x20) {//1x~2x - ret |= sc_camera_module_write_reg(cam_mod, - 0x3301, 0x06); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3306, 0x48); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3632, 0x08); - } else if (a_gain < 0x40) {//2x~4x - ret |= sc_camera_module_write_reg(cam_mod, - 0x3301, 0x14); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3306, 0x48); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3632, 0x08); - } else if (a_gain < 0x80) {//4x~8x - ret |= sc_camera_module_write_reg(cam_mod, - 0x3301, 0x18); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3306, 0x48); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3632, 0x08); - } else if (a_gain < 0xf8) {//8x~15.5x - ret |= sc_camera_module_write_reg(cam_mod, - 0x3301, 0x13); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3306, 0x48); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3632, 0x08); - } else if (a_gain < 0x1f0) {//15.5x~31x - ret |= sc_camera_module_write_reg(cam_mod, - 0x3301, 0xc5); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3306, 0x78); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3632, 0x48); - } else {//31x~ - ret |= sc_camera_module_write_reg(cam_mod, - 0x3301, 0xc5); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3306, 0x78); - ret |= sc_camera_module_write_reg(cam_mod, - 0x3632, 0x78); - } - - ret |= sc_camera_module_write_reg(cam_mod, - SC2232_AEC_PK_LONG_EXPO_HIGH_REG, - (exp_time >> 4) & 0xff); - ret |= sc_camera_module_write_reg(cam_mod, - SC2232_AEC_PK_LONG_EXPO_LOW_REG, - (exp_time & 0xff) << 4); - - if (!cam_mod->auto_adjust_fps) - ret |= sc2232_set_vts(cam_mod, - cam_mod->exp_config.vts_value); - - /* hold reg end */ - ret |= sc_camera_module_write_reg(cam_mod, - SC2232_AEC_GROUP_UPDATE_ADDRESS, - SC2232_AEC_GROUP_UPDATE_END_DATA); - mutex_unlock(&cam_mod->lock); - } - - if (IS_ERR_VALUE(ret)) - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int sc2232_g_ctrl(struct sc_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - sc_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - sc_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -static int sc2232_filltimings(struct sc_camera_module_custom_config *custom) -{ - int i, j; - u32 win_h_off = 0, win_v_off = 0; - struct sc_camera_module_config *config; - struct sc_camera_module_timings *timings; - struct sc_camera_module_reg *reg_table; - int reg_table_num_entries; - - for (i = 0; i < custom->num_configs; i++) { - config = &custom->configs[i]; - reg_table = config->reg_table; - reg_table_num_entries = config->reg_table_num_entries; - timings = &config->timings; - - memset(timings, 0x00, sizeof(*timings)); - for (j = 0; j < reg_table_num_entries; j++) { - switch (reg_table[j].reg) { - case SC2232_TIMING_VTS_HIGH_REG: - if (timings->frame_length_lines & 0xff00) - timings->frame_length_lines = 0; - timings->frame_length_lines = - ((reg_table[j].val << 8) | - (timings->frame_length_lines & 0xff)); - break; - case SC2232_TIMING_VTS_LOW_REG: - timings->frame_length_lines = - (reg_table[j].val | - (timings->frame_length_lines & 0xff00)); - break; - case SC2232_TIMING_HTS_HIGH_REG: - if (timings->line_length_pck & 0xff00) - timings->line_length_pck = 0; - timings->line_length_pck = - ((reg_table[j].val << 8) | - timings->line_length_pck); - break; - case SC2232_TIMING_HTS_LOW_REG: - timings->line_length_pck = - (reg_table[j].val | - (timings->line_length_pck & 0xff00)); - break; - case SC2232_HORIZONTAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_width = - ((reg_table[j].val << 8) | - (timings->sensor_output_width & 0xff)); - break; - case SC2232_HORIZONTAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_width = - (reg_table[j].val | - (timings->sensor_output_width & 0xff00)); - break; - case SC2232_VERTICAL_OUTPUT_SIZE_HIGH_REG: - timings->sensor_output_height = - ((reg_table[j].val << 8) | - (timings->sensor_output_height & 0xff)); - break; - case SC2232_VERTICAL_OUTPUT_SIZE_LOW_REG: - timings->sensor_output_height = - (reg_table[j].val | - (timings->sensor_output_height & 0xff00)); - break; - } - } - - timings->crop_horizontal_start += win_h_off; - timings->crop_horizontal_end -= win_h_off; - timings->crop_vertical_start += win_v_off; - timings->crop_vertical_end -= win_v_off; - - timings->vt_pix_clk_freq_hz = - config->frm_intrvl.interval.denominator - * timings->frame_length_lines - * timings->line_length_pck; - - timings->coarse_integration_time_min = - SC2232_COARSE_INTG_TIME_MIN; - timings->coarse_integration_time_max_margin = - SC2232_COARSE_INTG_TIME_MAX_MARGIN; - - /* OV Sensor do not use fine integration time. */ - timings->fine_integration_time_min = - SC2232_FINE_INTG_TIME_MIN; - timings->fine_integration_time_max_margin = - SC2232_FINE_INTG_TIME_MAX_MARGIN; - } - - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int sc2232_g_timings(struct sc_camera_module *cam_mod, - struct sc_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - - if (cam_mod->frm_intrvl_valid) { - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - } else { - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - } - - timings->frame_length_lines = vts; - - return ret; -err: - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int sc2232_s_ctrl(struct sc_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - sc_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = sc2232_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - case V4L2_CID_FOCUS_ABSOLUTE: - /* todo*/ - break; - /* - * case RK_V4L2_CID_FPS_CTRL: - * if (cam_mod->auto_adjust_fps) - * ret = OV2740_auto_adjust_fps( - * cam_mod, - * cam_mod->exp_config.exp_time); - * break; - */ - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - sc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int sc2232_s_ext_ctrls(struct sc_camera_module *cam_mod, - struct sc_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = sc2232_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - sc_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", ret); - - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int sc2232_start_streaming(struct sc_camera_module *cam_mod) -{ - int ret = 0; - - sc_camera_module_pr_info(cam_mod, "active config=%s\n", - cam_mod->active_config->name); - - ret = SC2232_g_VTS(cam_mod, &cam_mod->vts_min); - if (IS_ERR_VALUE(ret)) - goto err; - - mutex_lock(&cam_mod->lock); - ret = sc_camera_module_write_reg(cam_mod, 0x0100, 0x01); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - sc_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int sc2232_stop_streaming(struct sc_camera_module *cam_mod) -{ - int ret = 0; - - sc_camera_module_pr_info(cam_mod, "\n"); - mutex_lock(&cam_mod->lock); - ret = sc_camera_module_write_reg(cam_mod, 0x0100, 0x00); - mutex_unlock(&cam_mod->lock); - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - sc_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int sc2232_check_camera_id(struct sc_camera_module *cam_mod) -{ - u32 pidh, pidl; - int ret = 0; - - sc_camera_module_pr_debug(cam_mod, "\n"); - - ret |= sc_camera_module_read_reg(cam_mod, 1, - SC2232_PIDH_ADDR, &pidh); - ret |= sc_camera_module_read_reg(cam_mod, 1, - SC2232_PIDL_ADDR, &pidl); - - if (IS_ERR_VALUE(ret)) { - sc_camera_module_pr_err(cam_mod, - "register read failed, camera module powered off?\n"); - goto err; - } - - if (pidh == SC2232_PIDH_MAGIC && pidl == SC2232_PIDL_MAGIC) { - sc_camera_module_pr_info(cam_mod, - "successfully detected camera ID 0x%02x%02x\n", - pidh, pidl); - } else { - sc_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%02x%02x, detected 0x%02x%02x\n", - SC2232_PIDH_MAGIC, SC2232_PIDL_MAGIC, pidh, pidl); - ret = -EINVAL; - goto err; - } - - return 0; -err: - sc_camera_module_pr_err(cam_mod, "failed with error (%d)\n", ret); - return ret; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops sc2232_camera_module_core_ops = { - .g_ctrl = sc_camera_module_g_ctrl, - .s_ctrl = sc_camera_module_s_ctrl, - .s_ext_ctrls = sc_camera_module_s_ext_ctrls, - .s_power = sc_camera_module_s_power, - .ioctl = sc_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops sc2232_camera_module_video_ops = { - .s_frame_interval = sc_camera_module_s_frame_interval, - .g_frame_interval = sc_camera_module_g_frame_interval, - .s_stream = sc_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops sc2232_camera_module_pad_ops = { - .enum_frame_interval = sc_camera_module_enum_frameintervals, - .get_fmt = sc_camera_module_g_fmt, - .set_fmt = sc_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops sc2232_camera_module_ops = { - .core = &sc2232_camera_module_core_ops, - .video = &sc2232_camera_module_video_ops, - .pad = &sc2232_camera_module_pad_ops -}; - -static struct sc_camera_module_custom_config sc2232_custom_config = { - .start_streaming = sc2232_start_streaming, - .stop_streaming = sc2232_stop_streaming, - .s_ctrl = sc2232_s_ctrl, - .g_ctrl = sc2232_g_ctrl, - .s_ext_ctrls = sc2232_s_ext_ctrls, - .g_timings = sc2232_g_timings, - .s_vts = sc2232_auto_adjust_fps, - .set_flip = sc2232_set_flip, - .check_camera_id = sc2232_check_camera_id, - .configs = sc2232_configs, - .num_configs = ARRAY_SIZE(sc2232_configs), - .power_up_delays_ms = {5, 30, 30}, - .exposure_valid_frame = {4, 4} -}; - -static int sc2232_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - sc2232_filltimings(&sc2232_custom_config); - - v4l2_i2c_subdev_init(&sc2232.sd, client, - &sc2232_camera_module_ops); - sc2232.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; - sc2232.custom = sc2232_custom_config; - mutex_init(&sc2232.lock); - dev_info(&client->dev, "probing successful\n"); - - return 0; -} - -/* ======================================================================== */ - -static int sc2232_remove(struct i2c_client *client) -{ - struct sc_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "removing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - mutex_destroy(&cam_mod->lock); - sc_camera_module_release(cam_mod); - - dev_info(&client->dev, "removed\n"); - return 0; -} - -static const struct i2c_device_id sc2232_id[] = { - { SC2232_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id sc2232_of_match[] = { - {.compatible = "smartsens,sc2232-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, sc2232_id); - -static struct i2c_driver sc2232_i2c_driver = { - .driver = { - .name = SC2232_DRIVER_NAME, - .of_match_table = sc2232_of_match - }, - .probe = sc2232_probe, - .remove = sc2232_remove, - .id_table = sc2232_id, -}; - -module_i2c_driver(sc2232_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for sc2232"); -MODULE_AUTHOR("zack.zeng"); -MODULE_LICENSE("GPL"); - diff --git a/drivers/media/i2c/soc_camera/rockchip/sc_camera_module.c b/drivers/media/i2c/soc_camera/rockchip/sc_camera_module.c deleted file mode 100644 index 00bb5bcbb500..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/sc_camera_module.c +++ /dev/null @@ -1,1301 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * sc_camera_module.c - * - * Generic omnivision sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "sc_camera_module.h" - -static struct sc_camera_module *to_sc_camera_module(struct v4l2_subdev *sd) -{ - return container_of(sd, struct sc_camera_module, sd); -} - -/* ======================================================================== */ - -static void sc_camera_module_reset(struct sc_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->inited = false; - cam_mod->active_config = NULL; - cam_mod->update_config = true; - cam_mod->frm_fmt_valid = false; - cam_mod->frm_intrvl_valid = false; - cam_mod->exp_config.auto_exp = false; - cam_mod->exp_config.auto_gain = false; - cam_mod->wb_config.auto_wb = false; - cam_mod->auto_adjust_fps = true; - cam_mod->rotation = 0; - cam_mod->ctrl_updt = 0; - cam_mod->state = SC_CAMERA_MODULE_POWER_OFF; - cam_mod->state_before_suspend = SC_CAMERA_MODULE_POWER_OFF; - cam_mod->exp_config.exp_time = 0; - cam_mod->exp_config.gain = 0; - cam_mod->vts_cur = 0; -} - -/* ======================================================================== */ - -static void sc_camera_module_set_active_config(struct sc_camera_module - *cam_mod, struct sc_camera_module_config *new_config) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(new_config)) { - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no active config\n"); - } else { - cam_mod->ctrl_updt &= SC_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP | - SC_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN | - SC_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - if (new_config->auto_exp_enabled != - cam_mod->exp_config.auto_exp) { - cam_mod->ctrl_updt |= - SC_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = - new_config->auto_exp_enabled; - } - if (new_config->auto_gain_enabled != - cam_mod->exp_config.auto_gain) { - cam_mod->ctrl_updt |= - SC_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = - new_config->auto_gain_enabled; - } - if (new_config->auto_wb_enabled != - cam_mod->wb_config.auto_wb) { - cam_mod->ctrl_updt |= - SC_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = - new_config->auto_wb_enabled; - } - if (new_config != cam_mod->active_config) { - cam_mod->update_config = true; - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "activating config '%s'\n", - cam_mod->active_config->name); - } - } -} - -/* ======================================================================== */ - -static struct sc_camera_module_config *sc_camera_module_find_config( - struct sc_camera_module *cam_mod, - struct v4l2_mbus_framefmt *fmt, - struct v4l2_subdev_frame_interval *frm_intrvl) -{ - u32 i; - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - - if (!IS_ERR_OR_NULL(fmt)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (!IS_ERR_OR_NULL(frm_intrvl)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "frame interval %d/%d\n", - frm_intrvl->interval.numerator, - frm_intrvl->interval.denominator); - - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (!IS_ERR_OR_NULL(frm_intrvl)) { - gcdiv = gcd(cam_mod->custom.configs[i].frm_intrvl.interval.numerator, - cam_mod->custom.configs[i].frm_intrvl.interval.denominator); - norm_interval.interval.numerator = - cam_mod->custom.configs[i].frm_intrvl.interval.numerator / - gcdiv; - norm_interval.interval.denominator = - cam_mod->custom.configs[i].frm_intrvl.interval.denominator / - gcdiv; - if ((frm_intrvl->interval.numerator != - norm_interval.interval.numerator) || - (frm_intrvl->interval.denominator != - norm_interval.interval.denominator)) - continue; - } - if (!IS_ERR_OR_NULL(fmt)) { - if ((cam_mod->custom.configs[i].frm_fmt.width != - fmt->width) || - (cam_mod->custom.configs[i].frm_fmt.height != - fmt->height) || - (cam_mod->custom.configs[i].frm_fmt.code != - fmt->code)) { - continue; - } - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "found matching config %s\n", - cam_mod->custom.configs[i].name); - return &cam_mod->custom.configs[i]; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no matching config found\n"); - - return ERR_PTR(-EINVAL); -} - -/* ======================================================================== */ - -static int sc_camera_module_write_config(struct sc_camera_module *cam_mod) -{ - int ret = 0; - struct sc_camera_module_reg *reg_table; - u32 reg_table_num_entries; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - - if (!cam_mod->inited) { - cam_mod->active_config->soft_reset = true; - reg_table = cam_mod->active_config->reg_table; - reg_table_num_entries = - cam_mod->active_config->reg_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s\n", - cam_mod->active_config->name); - } else { - if (cam_mod->active_config->reg_diff_table && - cam_mod->active_config->reg_diff_table_num_entries) { - cam_mod->active_config->soft_reset = false; - reg_table = cam_mod->active_config->reg_diff_table; - reg_table_num_entries = - cam_mod->active_config->reg_diff_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s%s\n", - cam_mod->active_config->name, "_diff"); - } else { - cam_mod->active_config->soft_reset = true; - reg_table = cam_mod->active_config->reg_table; - reg_table_num_entries = - cam_mod->active_config->reg_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s\n", - cam_mod->active_config->name); - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.set_flip)) - cam_mod->custom.set_flip(cam_mod, - reg_table, reg_table_num_entries); - - ret = pltfrm_camera_module_write_reglist(&cam_mod->sd, - reg_table, reg_table_num_entries); - if (IS_ERR_VALUE(ret)) - goto err; - ret = pltfrm_camera_module_patch_config(&cam_mod->sd, - &cam_mod->frm_fmt, - &cam_mod->frm_intrvl); - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -static int sc_camera_module_attach(struct sc_camera_module *cam_mod) -{ - int ret = 0; - struct sc_camera_module_custom_config *custom; - - custom = &cam_mod->custom; - - if (custom->check_camera_id) { - sc_camera_module_s_power(&cam_mod->sd, 1); - ret = custom->check_camera_id(cam_mod); - sc_camera_module_s_power(&cam_mod->sd, 0); - if (ret != 0) - goto err; - } - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - sc_camera_module_release(cam_mod); - return ret; -} - -/* ======================================================================== */ - -int sc_camera_module_try_fmt(struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *fmt) -{ - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(sc_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "format not supported\n"); - return -EINVAL; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, "format supported\n"); - - return 0; -} - -/* ======================================================================== */ - -int sc_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(sc_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "format %dx%d, code 0x%04x, not supported\n", - fmt->width, fmt->height, fmt->code); - ret = -EINVAL; - goto err; - } - cam_mod->frm_fmt_valid = true; - cam_mod->frm_fmt = *fmt; - if (cam_mod->frm_intrvl_valid) { - sc_camera_module_set_active_config(cam_mod, - sc_camera_module_find_config(cam_mod, - fmt, &cam_mod->frm_intrvl)); - } else { - sc_camera_module_set_active_config(cam_mod, - sc_camera_module_find_config(cam_mod, - fmt, NULL)); - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int sc_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->active_config) { - fmt->code = cam_mod->active_config->frm_fmt.code; - fmt->width = cam_mod->active_config->frm_fmt.width; - fmt->height = cam_mod->active_config->frm_fmt.height; - return 0; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "no active config\n"); - - return -1; -} - -/* ======================================================================== */ - -int sc_camera_module_s_frame_interval(struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - struct sc_camera_module_config *config; - unsigned int vts; - int ret = 0; - - if (interval->interval.denominator == 0 || - interval->interval.numerator == 0) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "invalid frame interval %d/%d\n", - interval->interval.numerator, - interval->interval.denominator); - ret = -EINVAL; - goto err; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d/%d (%dfps)\n", - interval->interval.numerator, interval->interval.denominator, - (interval->interval.denominator + - (interval->interval.numerator >> 1)) / - interval->interval.numerator); - - /* normalize interval */ - gcdiv = gcd(interval->interval.numerator, - interval->interval.denominator); - norm_interval.interval.numerator = - interval->interval.numerator / gcdiv; - norm_interval.interval.denominator = - interval->interval.denominator / gcdiv; - - if (!cam_mod->frm_fmt_valid) - goto end; - config = sc_camera_module_find_config(cam_mod, - &cam_mod->active_config->frm_fmt, - &norm_interval); - - if (!IS_ERR_OR_NULL(config) && config != cam_mod->active_config) { - sc_camera_module_set_active_config(cam_mod, config); - if (cam_mod->state == SC_CAMERA_MODULE_STREAMING) { - cam_mod->custom.stop_streaming(cam_mod); - sc_camera_module_write_config(cam_mod); - cam_mod->custom.start_streaming(cam_mod); - } - } else { - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - if (cam_mod->active_config->frm_intrvl.interval.denominator < - norm_interval.interval.denominator) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "%dx%d@%dfps isn't support!", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - norm_interval.interval.denominator); - ret = -EFAULT; - goto err; - } - if (!cam_mod->custom.s_vts) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "custom.s_vts isn't support!"); - ret = -EFAULT; - goto err; - } - - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= norm_interval.interval.denominator; - cam_mod->vts_cur = vts; - - if (cam_mod->state != SC_CAMERA_MODULE_STREAMING) - goto end; - - cam_mod->custom.s_vts(cam_mod, vts); - } - -end: - cam_mod->frm_intrvl_valid = true; - cam_mod->frm_intrvl = norm_interval; - cam_mod->auto_adjust_fps = false; - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -int sc_camera_module_g_frame_interval(struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - - if (cam_mod->active_config) { - if (cam_mod->state == SC_CAMERA_MODULE_STREAMING) { - if (cam_mod->frm_intrvl_valid) { - *interval = cam_mod->frm_intrvl; - return 0; - } else { - *interval = cam_mod->active_config->frm_intrvl; - return 0; - } - } - } - - return -EFAULT; -} - -/* ======================================================================== */ - -int sc_camera_module_s_stream(struct v4l2_subdev *sd, int enable) -{ - int ret = 0; - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - unsigned int vts; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", enable); - - if (enable) { - if (cam_mod->state == SC_CAMERA_MODULE_STREAMING) - return 0; - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration, cannot start streaming\n"); - ret = -EFAULT; - goto err; - } - if (cam_mod->state != SC_CAMERA_MODULE_SW_STANDBY) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "sensor is not powered on (in state %d), cannot start streaming\n", - cam_mod->state); - ret = -EINVAL; - goto err; - } - if (cam_mod->update_config) { - ret = sc_camera_module_write_config(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - } - - ret = cam_mod->custom.start_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - if (cam_mod->frm_intrvl_valid) { - if ((cam_mod->frm_intrvl.interval.numerator != - cam_mod->active_config->frm_intrvl.interval.numerator) || - (cam_mod->frm_intrvl.interval.denominator != - cam_mod->active_config->frm_intrvl.interval.denominator)) { - if (cam_mod->frm_intrvl.interval.denominator > - cam_mod->active_config->frm_intrvl.interval.denominator) { - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "sensor is not support stream: %dx%d@(%d/%d)fps!\n", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - cam_mod->frm_intrvl.interval.denominator, - cam_mod->frm_intrvl.interval.numerator); - goto end; - } - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= cam_mod->frm_intrvl.interval.denominator; - cam_mod->custom.s_vts(cam_mod, vts); - } - } - - if (!cam_mod->inited && cam_mod->update_config) - cam_mod->inited = true; - cam_mod->update_config = false; - cam_mod->ctrl_updt = 0; - mdelay(cam_mod->custom.power_up_delays_ms[2]); - cam_mod->state = SC_CAMERA_MODULE_STREAMING; - } else { - int pclk; - int wait_ms; - struct isp_supplemental_sensor_mode_data timings; - - if (cam_mod->state != SC_CAMERA_MODULE_STREAMING) - return 0; - ret = cam_mod->custom.stop_streaming(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = sc_camera_module_ioctl(sd, - RK_VIDIOC_SENSOR_MODE_DATA, - &timings); - - cam_mod->state = SC_CAMERA_MODULE_SW_STANDBY; - - if (IS_ERR_VALUE(ret)) - goto err; - - pclk = timings.vt_pix_clk_freq_hz / 1000; - - if (!pclk) - goto err; - - wait_ms = - (timings.line_length_pck * - timings.frame_length_lines) / - pclk; - - /* - * wait for a frame period to make sure that there is - * no pending frame left. - */ - - msleep(wait_ms + 1); - } - -end: - cam_mod->state_before_suspend = cam_mod->state; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int sc_camera_module_s_power(struct v4l2_subdev *sd, int on) -{ - int ret = 0; - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - struct v4l2_subdev *af_ctrl; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", on); - - if (on) { - if (cam_mod->state == SC_CAMERA_MODULE_POWER_OFF) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 1); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[0]); - cam_mod->state = SC_CAMERA_MODULE_HW_STANDBY; - } - } - if (cam_mod->state == SC_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[1]); - cam_mod->state = SC_CAMERA_MODULE_SW_STANDBY; - if (!IS_ERR_OR_NULL(cam_mod->custom.init_common) && - cam_mod->custom.init_common(cam_mod)) - usleep_range(1000, 1500); - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - v4l2_subdev_call(af_ctrl, - core, init, 0); - } - } - } - if (cam_mod->update_config) { - sc_camera_module_write_config(cam_mod); - cam_mod->update_config = false; - } - } else { - if (cam_mod->state == SC_CAMERA_MODULE_STREAMING) { - ret = sc_camera_module_s_stream(sd, 0); - if (!IS_ERR_VALUE(ret)) - cam_mod->state = SC_CAMERA_MODULE_SW_STANDBY; - } - if (cam_mod->state == SC_CAMERA_MODULE_SW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - - if (!IS_ERR_VALUE(ret)) - cam_mod->state = SC_CAMERA_MODULE_HW_STANDBY; - } - if (cam_mod->state == SC_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 0); - if (!IS_ERR_VALUE(ret)) { - cam_mod->state = SC_CAMERA_MODULE_POWER_OFF; - sc_camera_module_reset(cam_mod); - } - } - } - - cam_mod->state_before_suspend = cam_mod->state; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "%s failed, camera left in state %d\n", - on ? "on" : "off", cam_mod->state); - goto err; - } else { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "camera powered %s\n", on ? "on" : "off"); - } - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int sc_camera_module_g_ctrl(struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - int ret; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, " id 0x%x\n", ctrl->id); - - if (ctrl->id == V4L2_CID_FLASH_LED_MODE) { - ctrl->value = cam_mod->exp_config.flash_mode; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_HFLIP) { - ctrl->value = cam_mod->hflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_HFLIP %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_VFLIP) { - ctrl->value = cam_mod->vflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_VFLIP %d\n", - ctrl->value); - return 0; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active configuration\n"); - return -EFAULT; - } - - if (ctrl->id == RK_V4L2_CID_VBLANKING) { - ctrl->value = cam_mod->active_config->v_blanking_time_us; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_VBLANKING %d\n", - ctrl->value); - return 0; - } - - if (cam_mod->state != SC_CAMERA_MODULE_SW_STANDBY && - cam_mod->state != SC_CAMERA_MODULE_STREAMING) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cannot get controls when camera is off\n"); - return -EFAULT; - } - - if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - ret = v4l2_subdev_call(af_ctrl, core, g_ctrl, ctrl); - return ret; - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.g_ctrl)) { - ret = cam_mod->custom.g_ctrl(cam_mod, ctrl->id); - if (IS_ERR_VALUE(ret)) - return ret; - } - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl->value = cam_mod->exp_config.gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE: - ctrl->value = cam_mod->exp_config.exp_time; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl->value = cam_mod->wb_config.temperature; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.preset_id; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl->value = cam_mod->exp_config.auto_gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl->value = cam_mod->exp_config.auto_exp; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.auto_wb; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - ctrl->value = cam_mod->af_config.abs_pos; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - default: - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed, unknown ctrl %d\n", ctrl->id); - return -EINVAL; - } - - return 0; -} - -static int flash_light_ctrl(struct v4l2_subdev *sd, - struct sc_camera_module *cam_mod, - int value) -{ - return 0; -} - -/* ======================================================================== */ - -int sc_camera_module_s_ext_ctrls(struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls) -{ - u32 i; - u32 ctrl_cnt = 0; - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - if (ctrls->count == 0) - return -EINVAL; - - for (i = 0; i < ctrls->count; i++) { - struct v4l2_ext_control *ctrl; - u32 ctrl_updt = 0; - - ctrl = &ctrls->controls[i]; - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl_updt = SC_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case RK_V4L2_CID_GAIN_PERCENT: - ctrl_updt = SC_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain_percent = ctrl->value; - break; - case V4L2_CID_FLASH_LED_MODE: - ret = flash_light_ctrl(sd, cam_mod, ctrl->value); - if (ret == 0) { - cam_mod->exp_config.flash_mode = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - } - break; - case V4L2_CID_EXPOSURE: - ctrl_updt = SC_CAMERA_MODULE_CTRL_UPDT_EXP_TIME; - cam_mod->exp_config.exp_time = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_VTS: - ctrl_updt = SC_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE; - cam_mod->exp_config.vts_value = ctrl->value; - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl_updt = SC_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE; - cam_mod->wb_config.temperature = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl_updt = SC_CAMERA_MODULE_CTRL_UPDT_PRESET_WB; - cam_mod->wb_config.preset_id = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl_updt = SC_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl_updt = SC_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl_updt = SC_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_AUTO_FPS: - cam_mod->auto_adjust_fps = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_AUTO_FPS %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - struct v4l2_control single_ctrl; - - single_ctrl.id = - V4L2_CID_FOCUS_ABSOLUTE; - single_ctrl.value = ctrl->value; - ret = v4l2_subdev_call(af_ctrl, - core, s_ctrl, &single_ctrl); - return ret; - } - } - ctrl_updt = - SC_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE; - cam_mod->af_config.abs_pos = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - case V4L2_CID_HFLIP: - if (ctrl->value) - cam_mod->hflip = true; - else - cam_mod->hflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_VFLIP: - if (ctrl->value) - cam_mod->vflip = true; - else - cam_mod->vflip = false; - cam_mod->flip_flg = true; - break; - default: - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "ignoring unknown ctrl 0x%x\n", ctrl->id); - break; - } - - if (cam_mod->state != SC_CAMERA_MODULE_SW_STANDBY && - cam_mod->state != SC_CAMERA_MODULE_STREAMING) - cam_mod->ctrl_updt |= ctrl_updt; - else if (ctrl_updt) - ctrl_cnt++; - } - - /* if camera module is already streaming, write through */ - if (ctrl_cnt && - (cam_mod->state == SC_CAMERA_MODULE_STREAMING || - cam_mod->state == SC_CAMERA_MODULE_SW_STANDBY)) { - struct sc_camera_module_ext_ctrls sc_ctrls; - - sc_ctrls.ctrls = kmalloc_array(ctrls->count, - sizeof(*sc_ctrls.ctrls), - GFP_KERNEL); - - if (sc_ctrls.ctrls) { - for (i = 0; i < ctrl_cnt; i++) { - sc_ctrls.ctrls[i].id = ctrls->controls[i].id; - sc_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - - sc_ctrls.count = ctrl_cnt; - - ret = cam_mod->custom.s_ext_ctrls(cam_mod, &sc_ctrls); - - kfree(sc_ctrls.ctrls); - } else { - ret = -ENOMEM; - } - if (IS_ERR_VALUE(ret)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed with error %d\n", ret); - } - - return ret; -} - -/* ======================================================================== */ - -int sc_camera_module_s_ctrl(struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - struct v4l2_ext_control ext_ctrl[1]; - struct v4l2_ext_controls ext_ctrls; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "0x%x 0x%x\n", ctrl->id, ctrl->value); - - ext_ctrl[0].id = ctrl->id; - ext_ctrl[0].value = ctrl->value; - - ext_ctrls.count = 1; - ext_ctrls.controls = ext_ctrl; - - return sc_camera_module_s_ext_ctrls(sd, &ext_ctrls); -} - -/* ======================================================================== */ - -long sc_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - unsigned int ret, i; - unsigned int flag = 0, val; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "cmd: 0x%x\n", cmd); - - if (cmd == RK_VIDIOC_SENSOR_MODE_DATA) { - struct sc_camera_module_timings sc_timings; - struct isp_supplemental_sensor_mode_data *timings = - (struct isp_supplemental_sensor_mode_data *)arg; - - if (cam_mod->custom.g_timings) - ret = cam_mod->custom.g_timings(cam_mod, &sc_timings); - else - ret = -EPERM; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; - } - - timings->sensor_output_width = sc_timings.sensor_output_width; - timings->sensor_output_height = sc_timings.sensor_output_height; - timings->crop_horizontal_start = - sc_timings.crop_horizontal_start; - timings->crop_vertical_start = sc_timings.crop_vertical_start; - timings->crop_horizontal_end = sc_timings.crop_horizontal_end; - timings->crop_vertical_end = sc_timings.crop_vertical_end; - timings->line_length_pck = sc_timings.line_length_pck; - timings->frame_length_lines = sc_timings.frame_length_lines; - timings->vt_pix_clk_freq_hz = sc_timings.vt_pix_clk_freq_hz; - timings->binning_factor_x = sc_timings.binning_factor_x; - timings->binning_factor_y = sc_timings.binning_factor_y; - timings->coarse_integration_time_max_margin = - sc_timings.coarse_integration_time_max_margin; - timings->coarse_integration_time_min = - sc_timings.coarse_integration_time_min; - timings->fine_integration_time_max_margin = - sc_timings.fine_integration_time_max_margin; - timings->fine_integration_time_min = - sc_timings.fine_integration_time_min; - - timings->exposure_valid_frame[0] = - cam_mod->custom.exposure_valid_frame[0]; - timings->exposure_valid_frame[1] = - cam_mod->custom.exposure_valid_frame[1]; - if (cam_mod->exp_config.exp_time) - timings->exp_time = cam_mod->exp_config.exp_time; - else - timings->exp_time = sc_timings.exp_time; - - if (cam_mod->exp_config.gain) - timings->gain = cam_mod->exp_config.gain; - else - timings->gain = sc_timings.gain; - - if (cam_mod->active_config) { - timings->max_exp_gain_h = - cam_mod->active_config->max_exp_gain_h; - timings->max_exp_gain_l = - cam_mod->active_config->max_exp_gain_l; - } else { - timings->max_exp_gain_h = - cam_mod->custom.configs[0].max_exp_gain_h; - timings->max_exp_gain_l = - cam_mod->custom.configs[0].max_exp_gain_l; - } - return ret; - } else if (cmd == RK_VIDIOC_SENSOR_CONFIGINFO) { - struct sensor_config_info_s *sensor_config = - (struct sensor_config_info_s *)arg; - - sensor_config->config_num = cam_mod->custom.num_configs; - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (i >= SENSOR_CONFIG_NUM) - break; - sensor_config->sensor_fmt[i] = - pltfrm_camera_module_pix_fmt2csi2_dt(cam_mod->custom.configs[i].frm_fmt.code); - sensor_config->reso[i].width = - cam_mod->custom.configs[i].frm_fmt.width; - sensor_config->reso[i].height = - cam_mod->custom.configs[i].frm_fmt.height; - } - return 0; - } else if (cmd == RK_VIDIOC_SENSOR_REG_ACCESS) { - struct sensor_reg_rw_s *sensor_rw = - (struct sensor_reg_rw_s *)arg; - - if (sensor_rw->reg_access_mode == SENSOR_READ_MODE) { - for (i = 0; i < cam_mod->custom.configs[0].reg_table_num_entries; i++) { - flag = - cam_mod->custom.configs[0].reg_table[i].flag; - if (flag != - PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) - break; - } - if (flag == PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "Can not get sensor reg type.\n"); - return -EINVAL; - } - sensor_rw->reg_addr_len = - PLTFRM_CAMERA_MODULE_REG_LEN(flag); - sensor_rw->reg_data_len = - PLTFRM_CAMERA_MODULE_DATA_LEN(flag); - pltfrm_camera_module_read_reg_ex(&cam_mod->sd, - 1, flag, sensor_rw->addr, &val); - sensor_rw->data = val; - } else { - flag = (sensor_rw->reg_addr_len << - PLTFRM_CAMERA_MODULE_REG_LEN_BIT); - flag |= (sensor_rw->reg_data_len << - PLTFRM_CAMERA_MODULE_DATA_LEN_BIT); - pltfrm_camera_module_write_reg_ex(&cam_mod->sd, - flag, sensor_rw->addr, sensor_rw->data); - } - return 0; - } else if (cmd == PLTFRM_CIFCAM_G_ITF_CFG) { - struct pltfrm_cam_itf *itf_cfg = (struct pltfrm_cam_itf *)arg; - struct sc_camera_module_config *config; - - if (cam_mod->custom.num_configs <= 0) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cam_mod->custom.num_configs is NULL, Get interface config failed!\n"); - return -EINVAL; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - config = &cam_mod->custom.configs[0]; - else - config = cam_mod->active_config; - - *itf_cfg = config->itf_cfg; - - pltfrm_camera_module_ioctl(sd, PLTFRM_CIFCAM_G_ITF_CFG, arg); - return 0; - } else if (cmd == PLTFRM_CIFCAM_ATTACH) { - ret = sc_camera_module_init(cam_mod, &cam_mod->custom); - if (!IS_ERR_VALUE(ret)) { - pltfrm_camera_module_ioctl(sd, cmd, arg); - return sc_camera_module_attach(cam_mod); - } else { - sc_camera_module_release(cam_mod); - return ret; - } - } - - ret = pltfrm_camera_module_ioctl(sd, cmd, arg); - return ret; -} - -/* ======================================================================== */ - -int sc_camera_module_get_flip_mirror(struct sc_camera_module *cam_mod) -{ - int mode = 0; - - if (!cam_mod->flip_flg) - return -1; - - if (cam_mod->hflip) - mode |= SC_MIRROR_BIT_MASK; - else - mode &= ~SC_MIRROR_BIT_MASK; - - if (cam_mod->vflip) - mode |= SC_FLIP_BIT_MASK; - else - mode &= ~SC_FLIP_BIT_MASK; - - return mode; -} - -/* ======================================================================== */ - -int sc_camera_module_enum_frameintervals(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie) -{ - struct sc_camera_module *cam_mod = to_sc_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", fie->index); - - if (fie->index >= cam_mod->custom.num_configs) - return -EINVAL; - fie->code = - cam_mod->custom.configs[fie->index].frm_fmt.code; - fie->width = - cam_mod->custom.configs[fie->index].frm_fmt.width; - fie->height = - cam_mod->custom.configs[fie->index].frm_fmt.height; - fie->interval.numerator = - cam_mod->custom.configs[fie->index].frm_intrvl.interval.numerator; - fie->interval.denominator = - cam_mod->custom.configs[fie->index].frm_intrvl.interval.denominator; - return 0; -} - -/* ======================================================================== */ - -int sc_camera_module_write_reglist(struct sc_camera_module *cam_mod, - const struct sc_camera_module_reg reglist[], - int len) -{ - return pltfrm_camera_module_write_reglist(&cam_mod->sd, reglist, len); -} - -/* ======================================================================== */ - -int sc_camera_module_write_reg(struct sc_camera_module *cam_mod, - u16 reg, - u8 val) -{ - return pltfrm_camera_module_write_reg(&cam_mod->sd, reg, val); -} - -/* ======================================================================== */ - -int sc_camera_module_read_reg(struct sc_camera_module *cam_mod, - u16 data_length, - u16 reg, - u32 *val) -{ - return pltfrm_camera_module_read_reg(&cam_mod->sd, - data_length, reg, val); -} - -/* ======================================================================== */ - -int sc_camera_module_read_reg_table(struct sc_camera_module *cam_mod, - u16 reg, - u32 *val) -{ - int i; - - if (cam_mod->state == SC_CAMERA_MODULE_STREAMING) - return pltfrm_camera_module_read_reg(&cam_mod->sd, - 1, reg, val); - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - for (i = cam_mod->active_config->reg_table_num_entries - 1; - i > 0; - i--) { - if (cam_mod->active_config->reg_table[i].reg == reg) { - *val = cam_mod->active_config->reg_table[i].val; - return 0; - } - } - } - - if (cam_mod->state == SC_CAMERA_MODULE_SW_STANDBY) - return pltfrm_camera_module_read_reg(&cam_mod->sd, - 1, reg, val); - - return -EFAULT; -} - -int sc_camera_module_init(struct sc_camera_module *cam_mod, - struct sc_camera_module_custom_config *custom) -{ - int ret = 0; - int mode = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->hflip = false; - cam_mod->vflip = false; - cam_mod->flip_flg = false; - sc_camera_module_reset(cam_mod); - - if (IS_ERR_OR_NULL(custom->start_streaming) || - IS_ERR_OR_NULL(custom->stop_streaming) || - IS_ERR_OR_NULL(custom->s_ctrl) || - IS_ERR_OR_NULL(custom->g_ctrl)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "mandatory callback function is missing\n"); - ret = -EINVAL; - goto err; - } - - ret = pltfrm_camera_module_init(&cam_mod->sd, &cam_mod->pltfm_data); - if (IS_ERR_VALUE(ret)) - goto err; - - ret |= pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - ret |= pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - if (IS_ERR_VALUE(ret)) { - sc_camera_module_release(cam_mod); - goto err; - } - - mode = pltfrm_camera_module_get_flip_mirror(&cam_mod->sd); - if (mode != -1) { - cam_mod->hflip = mode & SC_MIRROR_BIT_MASK ? true : false; - cam_mod->vflip = mode & SC_FLIP_BIT_MASK ? true : false; - cam_mod->flip_flg = true; - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -void sc_camera_module_release(struct sc_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->otp_work.wq) { - flush_workqueue(cam_mod->otp_work.wq); - destroy_workqueue(cam_mod->otp_work.wq); - cam_mod->otp_work.wq = NULL; - } - - cam_mod->custom.configs = NULL; - - pltfrm_camera_module_release(&cam_mod->sd); - v4l2_device_unregister_subdev(&cam_mod->sd); -} diff --git a/drivers/media/i2c/soc_camera/rockchip/sc_camera_module.h b/drivers/media/i2c/soc_camera/rockchip/sc_camera_module.h deleted file mode 100644 index a0cf581522bd..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/sc_camera_module.h +++ /dev/null @@ -1,281 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * sc_camera_module.h - * - * Generic omnivision sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - */ - -#ifndef SC_CAMERA_MODULE_H -#define SC_CAMERA_MODULE_H -#include -#include -#include - -/* - * TODO: references to v4l2 should be reomved from here and go into a - * platform dependent wrapper - */ - -#define SC_CAMERA_MODULE_REG_TYPE_DATA PLTFRM_CAMERA_MODULE_REG_TYPE_DATA -#define SC_CAMERA_MODULE_REG_TYPE_TIMEOUT PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT -#define sc_camera_module_csi_config -#define sc_camera_module_reg pltfrm_camera_module_reg -#define SC_FLIP_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_FLIP_BIT) -#define SC_MIRROR_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_MIRROR_BIT) - -#define SC_CAMERA_MODULE_CTRL_UPDT_GAIN 0x01 -#define SC_CAMERA_MODULE_CTRL_UPDT_EXP_TIME 0x02 -#define SC_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE 0x04 -#define SC_CAMERA_MODULE_CTRL_UPDT_AUTO_WB 0x08 -#define SC_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN 0x10 -#define SC_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP 0x20 -#define SC_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE 0x40 -#define SC_CAMERA_MODULE_CTRL_UPDT_PRESET_WB 0x80 -#define SC_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE 0x100 - -enum sc_camera_module_state { - SC_CAMERA_MODULE_POWER_OFF = 0, - SC_CAMERA_MODULE_HW_STANDBY = 1, - SC_CAMERA_MODULE_SW_STANDBY = 2, - SC_CAMERA_MODULE_STREAMING = 3 -}; - -struct sc_camera_module; - -struct sc_camera_module_timings { - /* public */ - u32 coarse_integration_time_min; - u32 coarse_integration_time_max_margin; - u32 fine_integration_time_min; - u32 fine_integration_time_max_margin; - u32 frame_length_lines; - u32 line_length_pck; - u32 vt_pix_clk_freq_hz; - u32 sensor_output_width; - u32 sensor_output_height; - u32 crop_horizontal_start; /* Sensor crop start cord. (x0,y0) */ - u32 crop_vertical_start; - u32 crop_horizontal_end; /* Sensor crop end cord. (x1,y1) */ - u32 crop_vertical_end; - u8 binning_factor_x; - u8 binning_factor_y; - u32 exp_time; - u32 gain; -}; - -struct sc_camera_module_config { - const char *name; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - u8 auto_exp_enabled; - u8 auto_gain_enabled; - u8 auto_wb_enabled; - struct sc_camera_module_reg *reg_table; - u32 reg_table_num_entries; - struct sc_camera_module_reg *reg_diff_table; - u32 reg_diff_table_num_entries; - u32 v_blanking_time_us; - u32 line_length_pck; - u32 frame_length_lines; - struct sc_camera_module_timings timings; - u8 soft_reset; - u8 ignore_measurement_check; - u8 max_exp_gain_h; - u8 max_exp_gain_l; - struct pltfrm_cam_itf itf_cfg; -}; - -struct sc_camera_module_exp_config { - s32 exp_time; - u8 auto_exp; - u16 gain; - u16 gain_percent; - u8 auto_gain; - enum v4l2_flash_led_mode flash_mode; - u32 vts_value; -}; - -struct sc_camera_module_wb_config { - u32 temperature; - u32 preset_id; - u8 auto_wb; -}; - -struct sc_camera_module_af_config { - u32 abs_pos; - u32 rel_pos; -}; - -struct sc_camera_module_ext_ctrl { - /* public */ - u32 id; - u32 value; - __u32 reserved2[1]; -}; - -struct sc_camera_module_ext_ctrls { - /* public */ - u32 count; - struct sc_camera_module_ext_ctrl *ctrls; -}; - -/* - * start_streaming: (mandatory) will be called when sensor should be - * put into streaming mode right after the base config has been - * written to the sensor. After a successful call of this function - * the sensor should start delivering frame data. - * - * stop_streaming: (mandatory) will be called when sensor should stop - * delivering data. After a successful call of this function the - * sensor should not deliver any more frame data. - * - * check_camera_id: (optional) will be called when the sensor is - * powered on. If provided should check the sensor ID/version - * required by the custom driver. Register access should be - * possible when this function is invoked. - * - * s_ctrl: (mandatory) will be called at the successful end of - * sc_camera_module_s_ctrl with the ctrl_id as argument. - * - * priv: (optional) for private data used by the custom driver. - */ -struct sc_camera_module_custom_config { - int (*start_streaming)(struct sc_camera_module *cam_mod); - int (*stop_streaming)(struct sc_camera_module *cam_mod); - int (*check_camera_id)(struct sc_camera_module *cam_mod); - int (*s_ctrl)(struct sc_camera_module *cam_mod, u32 ctrl_id); - int (*g_ctrl)(struct sc_camera_module *cam_mod, u32 ctrl_id); - int (*g_timings)(struct sc_camera_module *cam_mod, - struct sc_camera_module_timings *timings); - int (*s_vts)(struct sc_camera_module *cam_mod, - u32 vts); - int (*s_ext_ctrls)(struct sc_camera_module *cam_mod, - struct sc_camera_module_ext_ctrls *ctrls); - int (*set_flip)(struct sc_camera_module *cam_mod, - struct pltfrm_camera_module_reg reglist[], - int len); - int (*init_common)(struct sc_camera_module *cam_mod); - int (*read_otp)(struct sc_camera_module *cam_mod); - struct sc_camera_module_config *configs; - u32 num_configs; - u32 power_up_delays_ms[3]; - unsigned short exposure_valid_frame[2]; - void *priv; -}; - -struct sc_camera_module_otp_work { - struct work_struct work; - struct workqueue_struct *wq; - void *cam_mod; -}; - -struct sc_camera_module { - /* public */ - struct v4l2_subdev sd; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - struct sc_camera_module_exp_config exp_config; - struct sc_camera_module_wb_config wb_config; - struct sc_camera_module_af_config af_config; - struct sc_camera_module_custom_config custom; - enum sc_camera_module_state state; - enum sc_camera_module_state state_before_suspend; - struct sc_camera_module_config *active_config; - struct sc_camera_module_otp_work otp_work; - u32 ctrl_updt; - u32 vts_cur; - u32 vts_min; - u8 auto_adjust_fps; - u8 update_config; - u8 frm_fmt_valid; - u8 frm_intrvl_valid; - u8 hflip; - u8 vflip; - u8 flip_flg; - u32 rotation; - void *pltfm_data; - u8 inited; - int as_master; - struct mutex lock; -}; - -#define sc_camera_module_pr_info(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_info(&(cam_mod)->sd, fmt, ## arg) -#define sc_camera_module_pr_debug(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_debug(&(cam_mod)->sd, fmt, ## arg) -#define sc_camera_module_pr_warn(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_warn(&(cam_mod)->sd, fmt, ## arg) -#define sc_camera_module_pr_err(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_err(&(cam_mod)->sd, fmt, ## arg) - -int sc_camera_module_write_reglist(struct sc_camera_module *cam_mod, - const struct sc_camera_module_reg reglist[], - int len); - -int sc_camera_module_write_reg(struct sc_camera_module *cam_mod, - u16 reg, - u8 val); - -int sc_camera_module_read_reg(struct sc_camera_module *cam_mod, - u16 data_length, - u16 reg, - u32 *val); - -int sc_camera_module_read_reg_table(struct sc_camera_module *cam_mod, - u16 reg, - u32 *val); - -int sc_camera_module_try_fmt(struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *fmt); - -int sc_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int sc_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int sc_camera_module_s_frame_interval(struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int sc_camera_module_g_frame_interval(struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int sc_camera_module_s_stream(struct v4l2_subdev *sd, - int enable); - -int sc_camera_module_s_power(struct v4l2_subdev *sd, - int on); - -int sc_camera_module_g_ctrl(struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int sc_camera_module_s_ctrl(struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int sc_camera_module_s_ext_ctrls(struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls); - -int sc_camera_module_enum_frameintervals(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie); - -int sc_camera_module_init(struct sc_camera_module *cam_mod, - struct sc_camera_module_custom_config *custom); - -void sc_camera_module_release(struct sc_camera_module *cam_mod); - -long sc_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg); - -int sc_camera_module_get_flip_mirror(struct sc_camera_module *cam_mod); -#endif diff --git a/drivers/media/i2c/soc_camera/rockchip/tc358749xbg_v4l2-i2c-subdev.c b/drivers/media/i2c/soc_camera/rockchip/tc358749xbg_v4l2-i2c-subdev.c deleted file mode 100644 index 3e30160f32dc..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/tc358749xbg_v4l2-i2c-subdev.c +++ /dev/null @@ -1,1119 +0,0 @@ -/* - * drivers/media/i2c/soc_camera/xgold/tc358749xbg.c - * - * tc358749xbg sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * Copyright (C) 2008 Texas Instruments. - * Author: zhoupeng - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - * Note: - * - * v0.1.0: - * 1. Initialize version; - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "tc_camera_module.h" - -#define TC358749xbg_DRIVER_NAME "tc358749xbg" - -/* product ID */ -#define TC358749xbg_PID_MAGIC 0x4701 -#define TC358749xbg_PID_ADDR 0x0000 - -#define INIT_END 0x854A -#define SYS_STATUS 0x8520 -#define CONFCTL 0x0004 -#define VI_REP 0x8576 -#define MASK_VOUT_COLOR_SEL 0xe0 -#define MASK_VOUT_COLOR_RGB_FULL 0x00 -#define MASK_VOUT_COLOR_RGB_LIMITED 0x20 -#define MASK_VOUT_COLOR_601_YCBCR_FULL 0x40 -#define MASK_VOUT_COLOR_601_YCBCR_LIMITED 0x60 -#define MASK_VOUT_COLOR_709_YCBCR_FULL 0x80 -#define MASK_VOUT_COLOR_709_YCBCR_LIMITED 0xa0 -#define MASK_VOUT_COLOR_FULL_TO_LIMITED 0xc0 -#define MASK_VOUT_COLOR_LIMITED_TO_FULL 0xe0 -#define MASK_IN_REP_HEN 0x10 -#define MASK_IN_REP 0x0f - -/* ======================================================================== */ -/* Base sensor configs */ -/* ======================================================================== */ -/* MCLK:24MHz 1920x1080 30fps mipi 4lane 800Mbps/lane */ -static struct tc_camera_module_reg tc358749xbg_init_tab_1920_1080_60fps[] = { - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0004, 0x0004, 2}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0002, 0x7F80, 2}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0002, 0x0000, 2}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0020, 0x508A, 2}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0022, 0x0203, 2}, - {TC_CAMERA_MODULE_REG_TYPE_TIMEOUT, 0x0000, 0x0001, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0022, 0x0213, 2}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0006, 0x012C, 2}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0060, 0x0001, 2}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x7080, 0x0000, 2}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0014, 0x0000, 2}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0016, 0x05FF, 2}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0100, 0x00000003, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0104, 0x00000003, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0108, 0x00000003, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x010C, 0x00000003, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0110, 0x00000003, 4}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0140, 0x00000000, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0144, 0x00000000, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0148, 0x00000000, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x014C, 0x00000000, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0150, 0x00000000, 4}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0210, 0x00001770, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0214, 0x00000005, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0218, 0x00001505, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x021C, 0x00000001, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0220, 0x00000105, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0224, 0x0000332C, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0228, 0x00000008, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x022C, 0x00000002, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0230, 0x00000005, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0234, 0x0000001F, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0238, 0x00000000, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x023C, 0x00040005, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0204, 0x00000001, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0518, 0x00000001, 4}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0500, 0xA3008086, 4}, - // - // - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8531, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8532, 0x80, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8540, 0x8C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8541, 0x0A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8630, 0xB0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8631, 0x1E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8632, 0x04, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8670, 0x01, 1}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8532, 0x80, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8536, 0x40, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x853F, 0x0A, 1}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8543, 0x32, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8544, 0x10, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8545, 0x31, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8546, 0x2D, 1}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x85C7, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x85CA, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x85CB, 0x01, 1}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C00, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C01, 0xFF, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C02, 0xFF, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C03, 0xFF, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C04, 0xFF, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C05, 0xFF, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C06, 0xFF, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C07, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C08, 0x52, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C09, 0x62, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C0A, 0x88, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C0B, 0x88, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C0C, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C0D, 0x88, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C0E, 0x88, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C0F, 0x88, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C10, 0x1C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C11, 0x15, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C12, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C13, 0x03, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C14, 0x80, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C15, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C16, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C17, 0x78, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C18, 0x0A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C19, 0x0D, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C1A, 0xC9, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C1B, 0xA0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C1C, 0x57, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C1D, 0x47, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C1E, 0x98, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C1F, 0x27, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C20, 0x12, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C21, 0x48, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C22, 0x4C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C23, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C24, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C25, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C26, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C27, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C28, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C29, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C2A, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C2B, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C2C, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C2D, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C2E, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C2F, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C30, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C31, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C32, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C33, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C34, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C35, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C36, 0x02, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C37, 0x3A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C38, 0x80, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C39, 0x18, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C3A, 0x71, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C3B, 0x38, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C3C, 0x2D, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C3D, 0x40, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C3E, 0x58, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C3F, 0x2C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C40, 0x45, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C41, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C42, 0xC4, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C43, 0x8E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C44, 0x21, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C45, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C46, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C47, 0x1E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C48, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C49, 0x1D, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C4A, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C4B, 0x72, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C4C, 0x51, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C4D, 0xD0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C4E, 0x1E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C4F, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C50, 0x6E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C51, 0x28, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C52, 0x55, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C53, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C54, 0xC4, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C55, 0x8E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C56, 0x21, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C57, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C58, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C59, 0x1E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C5A, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C5B, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C5C, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C5D, 0xFC, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C5E, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C5F, 0x54, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C60, 0x6F, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C61, 0x73, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C62, 0x68, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C63, 0x69, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C64, 0x62, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C65, 0x61, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C66, 0x2D, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C67, 0x48, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C68, 0x32, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C69, 0x44, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C6A, 0x0A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C6B, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C6C, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C6D, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C6E, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C6F, 0xFD, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C70, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C71, 0x17, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C72, 0x3D, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C73, 0x0F, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C74, 0x8C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C75, 0x17, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C76, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C77, 0x0A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C78, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C79, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C7A, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C7B, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C7C, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C7D, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C7E, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C7F, 0x92, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C80, 0x02, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C81, 0x03, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C82, 0x1A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C83, 0x74, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C84, 0x47, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C85, 0x10, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C86, 0x04, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C87, 0x02, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C88, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C89, 0x0A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C8A, 0x04, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C8B, 0x04, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C8C, 0x23, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C8D, 0x09, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C8E, 0x07, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C8F, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C90, 0x83, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C91, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C92, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C93, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C94, 0x65, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C95, 0x03, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C96, 0x0C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C97, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C98, 0x10, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C99, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C9A, 0x8C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C9B, 0x0A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C9C, 0xD0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C9D, 0x8A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C9E, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8C9F, 0xE0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA0, 0x2D, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA1, 0x10, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA2, 0x10, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA3, 0x3E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA4, 0x96, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA5, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA6, 0x13, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA7, 0x8E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA8, 0x21, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CA9, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CAA, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CAB, 0x1E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CAC, 0xD8, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CAD, 0x09, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CAE, 0x80, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CAF, 0xA0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB0, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB1, 0xE0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB2, 0x2D, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB3, 0x10, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB4, 0x10, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB5, 0x60, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB6, 0xA2, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB7, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB8, 0xC4, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CB9, 0x8E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CBA, 0x21, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CBB, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CBC, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CBD, 0x18, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CBE, 0x8C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CBF, 0x0A, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC0, 0xD0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC1, 0x90, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC2, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC3, 0x40, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC4, 0x31, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC5, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC6, 0x0C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC7, 0x40, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC8, 0x55, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CC9, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CCA, 0x80, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CCB, 0xB0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CCC, 0x74, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CCD, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CCE, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CCF, 0x18, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD0, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD1, 0x1D, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD2, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD3, 0x72, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD4, 0x51, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD5, 0xD0, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD6, 0x1E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD7, 0x20, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD8, 0x6E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CD9, 0x28, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CDA, 0x55, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CDB, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CDC, 0xC4, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CDD, 0x8E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CDE, 0x21, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CDF, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE0, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE1, 0x1E, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE2, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE3, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE4, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE5, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE6, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE7, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE8, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CE9, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CEA, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CEB, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CEC, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CED, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CEE, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CEF, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF0, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF1, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF2, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF3, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF4, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF5, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF6, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF7, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF8, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CF9, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CFA, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CFB, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CFC, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CFD, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CFE, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8CFF, 0x86, 1}, - // - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8573, 0xC1, 1}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8600, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8602, 0xF3, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8603, 0x02, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8604, 0x0C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8606, 0x05, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8607, 0x00, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8620, 0x22, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8640, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8641, 0x65, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8642, 0x07, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8652, 0x02, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x8665, 0x10, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x85AA, 0x50, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x85AF, 0xC6, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x85AB, 0x00, 1}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x870B, 0x2C, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x870C, 0x53, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x870D, 0x01, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x870E, 0x30, 1}, - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x9007, 0x10, 1}, - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x854A, 0x01, 1}, - // - // - // - // - // - // - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x854A, 0x01, 1}, - // - //85 20 - // - // - {TC_CAMERA_MODULE_REG_TYPE_DATA, 0x0004, 0x0CD7, 2}, -}; - -/* ======================================================================== */ -static struct tc_camera_module_config tc358749xbg_configs[] = { - { - .name = "1920x1080_60fps", - .frm_fmt = { - .width = 1920, - .height = 1080, - .code = MEDIA_BUS_FMT_UYVY8_2X8 - }, - .frm_intrvl = { - .interval = { - .numerator = 1, - .denominator = 60 - } - }, - .auto_exp_enabled = false, - .auto_gain_enabled = false, - .auto_wb_enabled = false, - .reg_table = (void *)tc358749xbg_init_tab_1920_1080_60fps, - .reg_table_num_entries = - sizeof(tc358749xbg_init_tab_1920_1080_60fps) / - sizeof(tc358749xbg_init_tab_1920_1080_60fps[0]), - .v_blanking_time_us = 3078, - .max_exp_gain_h = 16, - .max_exp_gain_l = 0, - .ignore_measurement_check = 1, - PLTFRM_CAM_ITF_MIPI_CFG(0, 4, 800, 24000000) - } -}; - -static struct tc35x_priv tc358749xbg_priv; - -static struct tc_camera_module *to_tc_camera_module(struct v4l2_subdev *sd) -{ - return container_of(sd, struct tc_camera_module, sd); -} - -/*--------------------------------------------------------------------------*/ -static int tc358749xbg_set_flip( - struct tc_camera_module *cam_mod, - struct tc_camera_module_reg reglist[], - int len) -{ - int mode = 0; - - mode = tc_camera_module_get_flip_mirror(cam_mod); - - if (mode == -1) { - tc_camera_module_pr_debug( - cam_mod, - "dts don't set flip, return!\n"); - return 0; - } - - return 0; -} - -static int tc358749xbg_write_aec(struct tc_camera_module *cam_mod) -{ - int ret = 0; - - tc_camera_module_pr_debug(cam_mod, - "exp_time=%d lines, gain=%d, flash_mode=%d\n", - cam_mod->exp_config.exp_time, - cam_mod->exp_config.gain, - cam_mod->exp_config.flash_mode); - - if (IS_ERR_VALUE(ret)) - tc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", ret); - return ret; -} - -int tc358749xbg_enable_stream(struct tc_camera_module *cam_mod, bool enable) -{ - u8 init_end, sys_status; - u16 confctl; - - if (enable) { - init_end = tc_camera_module_read8_reg(cam_mod, INIT_END); - tc_camera_module_pr_debug(cam_mod, - "INIT_END(0x854A) = 0x%02x\n", - init_end); - sys_status = tc_camera_module_read8_reg(cam_mod, SYS_STATUS); - tc_camera_module_pr_debug(cam_mod, - "INIT_END(0x8520) = 0x%02x\n", - sys_status); - } - - confctl = tc_camera_module_read16_reg(cam_mod, CONFCTL); - tc_camera_module_pr_debug(cam_mod, - "CONFCTL(0x0004) = 0x%04x\n", - confctl); - - return 0; -} - -int tc358749xbg_s_power(struct tc_camera_module *cam_mod, bool enable) -{ - tc_camera_module_pr_debug(cam_mod, - "power %d\n", - enable); - - if (enable) { - gpiod_direction_output(tc358749xbg_priv.gpio_reset, 0); - gpiod_direction_output(tc358749xbg_priv.gpio_int, 0); - gpiod_direction_output(tc358749xbg_priv.gpio_stanby, 0); - gpiod_direction_output(tc358749xbg_priv.gpio_power18, 1); - gpiod_direction_output(tc358749xbg_priv.gpio_power33, 1); - gpiod_direction_output(tc358749xbg_priv.gpio_power, 1); - gpiod_direction_output(tc358749xbg_priv.gpio_stanby, 1); - gpiod_direction_output(tc358749xbg_priv.gpio_reset, 1); - } else { - gpiod_direction_output(tc358749xbg_priv.gpio_power, 0); - gpiod_direction_output(tc358749xbg_priv.gpio_reset, 1); - gpiod_direction_output(tc358749xbg_priv.gpio_reset, 0); - } - - return 0; -} - -static int tc358749xbg_g_fmt( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - u8 vi_rep = tc_camera_module_read8_reg(cam_mod, VI_REP); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "read VI_REP return 0x%x\n", vi_rep); - - if (format->pad != 0) - return -EINVAL; - if (cam_mod->active_config) { - fmt->code = cam_mod->active_config->frm_fmt.code; - fmt->width = cam_mod->active_config->frm_fmt.width; - fmt->height = cam_mod->active_config->frm_fmt.height; - fmt->field = V4L2_FIELD_NONE; - - switch (vi_rep & MASK_VOUT_COLOR_SEL) { - case MASK_VOUT_COLOR_RGB_FULL: - case MASK_VOUT_COLOR_RGB_LIMITED: - fmt->colorspace = V4L2_COLORSPACE_SRGB; - break; - case MASK_VOUT_COLOR_601_YCBCR_LIMITED: - case MASK_VOUT_COLOR_601_YCBCR_FULL: - fmt->colorspace = V4L2_COLORSPACE_SMPTE170M; - break; - case MASK_VOUT_COLOR_709_YCBCR_FULL: - case MASK_VOUT_COLOR_709_YCBCR_LIMITED: - fmt->colorspace = V4L2_COLORSPACE_REC709; - break; - default: - fmt->colorspace = 0; - break; - } - - return 0; - } - - pltfrm_camera_module_pr_err(&cam_mod->sd, "no active config\n"); - - return -1; -} - -static int tc358749xbg_g_ctrl(struct tc_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - tc_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - tc_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int tc358749xbg_filltimings( - struct tc_camera_module_custom_config *custom) -{ - return 0; -} - -/*--------------------------------------------------------------------------*/ - -static int tc358749xbg_g_timings( - struct tc_camera_module *cam_mod, - struct tc_camera_module_timings *timings) -{ - int ret = 0; - unsigned int vts; - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - goto err; - - *timings = cam_mod->active_config->timings; - - vts = (!cam_mod->vts_cur) ? - timings->frame_length_lines : - cam_mod->vts_cur; - if (cam_mod->frm_intrvl_valid) - timings->vt_pix_clk_freq_hz = - cam_mod->frm_intrvl.interval.denominator - * vts - * timings->line_length_pck; - else - timings->vt_pix_clk_freq_hz = - cam_mod->active_config->frm_intrvl.interval.denominator * - vts * timings->line_length_pck; - - timings->frame_length_lines = vts; - - return ret; -err: - tc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int tc358749xbg_s_ctrl(struct tc_camera_module *cam_mod, u32 ctrl_id) -{ - int ret = 0; - - tc_camera_module_pr_debug(cam_mod, "\n"); - - switch (ctrl_id) { - case V4L2_CID_GAIN: - case V4L2_CID_EXPOSURE: - ret = tc358749xbg_write_aec(cam_mod); - break; - case V4L2_CID_FLASH_LED_MODE: - /* nothing to be done here */ - break; - case V4L2_CID_FOCUS_ABSOLUTE: - /* todo*/ - break; - /* - * case RK_V4L2_CID_FPS_CTRL: - * if (cam_mod->auto_adjust_fps) - * ret = TC358749xbg_auto_adjust_fps( - * cam_mod, - * cam_mod->exp_config.exp_time); - * break; - */ - default: - ret = -EINVAL; - break; - } - - if (IS_ERR_VALUE(ret)) - tc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", - ret); - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int tc358749xbg_s_ext_ctrls( - struct tc_camera_module *cam_mod, - struct tc_camera_module_ext_ctrls *ctrls) -{ - int ret = 0; - - if ((ctrls->ctrls[0].id == V4L2_CID_GAIN || - ctrls->ctrls[0].id == V4L2_CID_EXPOSURE)) - ret = tc358749xbg_write_aec(cam_mod); - else - ret = -EINVAL; - - if (IS_ERR_VALUE(ret)) - tc_camera_module_pr_debug(cam_mod, - "failed with error (%d)\n", - ret); - - return ret; -} - -/*--------------------------------------------------------------------------*/ - -static int tc358749xbg_check_camera_id(struct tc_camera_module *cam_mod) -{ - u16 pid; - int ret = 0; - - tc_camera_module_pr_debug(cam_mod, "in\n"); - - pid = tc_camera_module_read16_reg(cam_mod, TC358749xbg_PID_ADDR); - tc_camera_module_pr_err(cam_mod, - "read pid return 0x%x\n", - pid); - - if (pid == TC358749xbg_PID_MAGIC) { - tc_camera_module_pr_debug(cam_mod, - "successfully detected camera ID 0x%04x\n", - pid); - } else { - tc_camera_module_pr_err(cam_mod, - "wrong camera ID, expected 0x%04x, detected 0x%04x\n", - TC358749xbg_PID_MAGIC, - pid); - ret = -EINVAL; - goto err; - } - - return 0; -err: - tc_camera_module_pr_err(cam_mod, - "failed with error (%d)\n", - ret); - return ret; -} - -/* ======================================================================== */ -int tc_camera_358749xbg_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - return 0; -} - -/* ======================================================================== */ - -int tc_camera_358749xbg_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls) -{ - return 0; -} - -long tc_camera_358749xbg_module_ioctl( - struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - return 0; -} - -/* ======================================================================== */ -/* This part is platform dependent */ -/* ======================================================================== */ - -static struct v4l2_subdev_core_ops tc358749xbg_camera_module_core_ops = { - .g_ctrl = tc_camera_module_g_ctrl, - .s_ctrl = tc_camera_module_s_ctrl, - .s_ext_ctrls = tc_camera_module_s_ext_ctrls, - .s_power = tc_camera_module_s_power, - .ioctl = tc_camera_module_ioctl -}; - -static struct v4l2_subdev_video_ops tc358749xbg_camera_module_video_ops = { - .s_frame_interval = tc_camera_module_s_frame_interval, - .g_frame_interval = tc_camera_module_g_frame_interval, - .s_stream = tc_camera_module_s_stream -}; - -static struct v4l2_subdev_pad_ops tc358749xbg_camera_module_pad_ops = { - .enum_frame_interval = tc_camera_module_enum_frameintervals, - .get_fmt = tc358749xbg_g_fmt, - .set_fmt = tc_camera_module_s_fmt, -}; - -static struct v4l2_subdev_ops tc358749xbg_camera_module_ops = { - .core = &tc358749xbg_camera_module_core_ops, - .video = &tc358749xbg_camera_module_video_ops, - .pad = &tc358749xbg_camera_module_pad_ops -}; - -static struct tc_camera_module tc358749xbg; - -static struct tc_camera_module_custom_config tc358749xbg_custom_config = { - .s_ctrl = tc358749xbg_s_ctrl, - .g_ctrl = tc358749xbg_g_ctrl, - .s_ext_ctrls = tc358749xbg_s_ext_ctrls, - .g_timings = tc358749xbg_g_timings, - .set_flip = tc358749xbg_set_flip, - .check_camera_id = tc358749xbg_check_camera_id, - .enable_stream = tc358749xbg_enable_stream, - .s_power = tc358749xbg_s_power, - .configs = tc358749xbg_configs, - .num_configs = ARRAY_SIZE(tc358749xbg_configs), - .power_up_delays_ms = {5, 30, 30}, - /* - *0: Exposure time valid fileds; - *1: Exposure gain valid fileds; - *(2 fileds == 1 frames) - */ - .exposure_valid_frame = {4, 4} -}; - -static int test_parse_dts( - struct tc_camera_module *cam_mod, - struct i2c_client *client) -{ - struct device *dev = &client->dev; - struct device_node *np = of_node_get(client->dev.of_node); - - tc_camera_module_pr_debug(cam_mod, "enter!\n"); - - if (!dev) - tc_camera_module_pr_debug(cam_mod, "dev is NULL!"); - - if (!np) - tc_camera_module_pr_debug(cam_mod, "np is NULL"); - - tc358749xbg_priv.gpio_int = devm_gpiod_get_optional(dev, "int", - GPIOD_OUT_HIGH); - tc358749xbg_priv.gpio_power = devm_gpiod_get_optional(dev, "power", - GPIOD_OUT_HIGH); - tc358749xbg_priv.gpio_power18 = devm_gpiod_get_optional(dev, "power18", - GPIOD_OUT_HIGH); - tc358749xbg_priv.gpio_power33 = devm_gpiod_get_optional(dev, "power33", - GPIOD_OUT_HIGH); - tc358749xbg_priv.gpio_csi_ctl = devm_gpiod_get_optional(dev, "csi-ctl", - GPIOD_OUT_LOW); - tc358749xbg_priv.gpio_reset = devm_gpiod_get_optional(dev, "reset", - GPIOD_OUT_HIGH); - tc358749xbg_priv.gpio_stanby = devm_gpiod_get_optional(dev, "stanby", - GPIOD_OUT_LOW); - return 0; -} - -static int test_deparse_dts(struct i2c_client *client) -{ - if (tc358749xbg_priv.gpio_int) { - gpiod_direction_input(tc358749xbg_priv.gpio_int); - gpiod_put(tc358749xbg_priv.gpio_int); - } - - if (tc358749xbg_priv.gpio_reset) { - gpiod_direction_input(tc358749xbg_priv.gpio_reset); - gpiod_put(tc358749xbg_priv.gpio_reset); - } - - if (tc358749xbg_priv.gpio_stanby) { - gpiod_direction_input(tc358749xbg_priv.gpio_stanby); - gpiod_put(tc358749xbg_priv.gpio_stanby); - } - - if (tc358749xbg_priv.gpio_csi_ctl) { - gpiod_direction_input(tc358749xbg_priv.gpio_csi_ctl); - gpiod_put(tc358749xbg_priv.gpio_csi_ctl); - } - - if (tc358749xbg_priv.gpio_power) { - gpiod_direction_input(tc358749xbg_priv.gpio_power); - gpiod_put(tc358749xbg_priv.gpio_power); - } - - if (tc358749xbg_priv.gpio_power18) { - gpiod_direction_input(tc358749xbg_priv.gpio_power18); - gpiod_put(tc358749xbg_priv.gpio_power18); - } - - if (tc358749xbg_priv.gpio_power33) { - gpiod_direction_input(tc358749xbg_priv.gpio_power33); - gpiod_put(tc358749xbg_priv.gpio_power33); - } - - return 0; -} - -static ssize_t tc358749xbg_debugfs_reg_write( - struct file *file, - const char __user *buf, - size_t count, - loff_t *ppos) -{ - struct tc_camera_module *cam_mod = - ((struct seq_file *)file->private_data)->private; - - char kbuf[30]; - char rw; - u32 reg; - u32 reg_value; - int len; - int ret; - int nbytes = min(count, sizeof(kbuf) - 1); - - if (copy_from_user(kbuf, buf, nbytes)) - return -EFAULT; - - kbuf[nbytes] = '\0'; - tc_camera_module_pr_debug(cam_mod, "kbuf is %s\n", kbuf); - ret = sscanf(kbuf, " %c %x %x %d", &rw, ®, ®_value, &len); - tc_camera_module_pr_err(cam_mod, "ret = %d!\n", ret); - if (ret != 4) { - tc_camera_module_pr_err(cam_mod, "sscanf failed!\n"); - return 0; - } - - if (rw == 'w') { - if (len == 1) { - tc_camera_module_write8_reg(cam_mod, reg, reg_value); - tc_camera_module_pr_err(cam_mod, - "%s(%d): write reg 0x%02x ---> 0x%x!\n", - __func__, __LINE__, - reg, reg_value); - } else if (len == 2) { - tc_camera_module_write16_reg(cam_mod, reg, reg_value); - tc_camera_module_pr_err(cam_mod, - "%s(%d): write reg 0x%02x ---> 0x%x!\n", - __func__, __LINE__, - reg, reg_value); - } else if (len == 4) { - tc_camera_module_write32_reg(cam_mod, reg, reg_value); - tc_camera_module_pr_err(cam_mod, - "%s(%d): write reg 0x%02x ---> 0x%x!\n", - __func__, __LINE__, - reg, reg_value); - } else { - tc_camera_module_pr_err(cam_mod, - "len %d is err!\n", - len); - } - } else if (rw == 'r') { - if (len == 1) { - reg_value = tc_camera_module_read8_reg(cam_mod, reg); - tc_camera_module_pr_err(cam_mod, - "%s(%d): read reg 0x%02x ---> 0x%x!\n", - __func__, __LINE__, - reg, reg_value); - } else if (len == 2) { - reg_value = tc_camera_module_read16_reg(cam_mod, reg); - tc_camera_module_pr_err(cam_mod, - "%s(%d): read reg 0x%02x ---> 0x%x!\n", - __func__, __LINE__, - reg, reg_value); - } else if (len == 4) { - reg_value = tc_camera_module_read32_reg(cam_mod, reg); - tc_camera_module_pr_err(cam_mod, - "%s(%d): read reg 0x%02x ---> 0x%x!\n", - __func__, __LINE__, - reg, reg_value); - } else { - tc_camera_module_pr_err(cam_mod, - "len %d is err!\n", - len); - } - } else { - tc_camera_module_pr_err(cam_mod, - "%c command is not support\n", - rw); - } - - return count; -} - -static int tc358749xbg_debugfs_reg_show(struct seq_file *s, void *v) -{ - int i; - u32 value; - int reg_table_num_entries = - sizeof(tc358749xbg_init_tab_1920_1080_60fps) / - sizeof(tc358749xbg_init_tab_1920_1080_60fps[0]); - struct tc_camera_module *cam_mod = s->private; - - for (i = 0; i < reg_table_num_entries; i++) { - switch (tc358749xbg_init_tab_1920_1080_60fps[i].len) { - case 1: - value = tc_camera_module_read8_reg(cam_mod, - tc358749xbg_init_tab_1920_1080_60fps[i].reg); - break; - case 2: - value = tc_camera_module_read16_reg(cam_mod, - tc358749xbg_init_tab_1920_1080_60fps[i].reg); - break; - case 4: - value = tc_camera_module_read32_reg(cam_mod, - tc358749xbg_init_tab_1920_1080_60fps[i].reg); - break; - default: - printk(KERN_ERR "%s(%d): command no support!\n", __func__, __LINE__); - break; - } - printk(KERN_ERR "%s(%d): reg 0x%04x ---> 0x%x\n", __func__, __LINE__, - tc358749xbg_init_tab_1920_1080_60fps[i].reg, value); - } - return 0; -} - -static int tc358749xbg_debugfs_open(struct inode *inode, struct file *file) -{ - struct specific_sensor *spsensor = inode->i_private; - - return single_open(file, tc358749xbg_debugfs_reg_show, spsensor); -} - -static const struct file_operations tc358749xbg_debugfs_fops = { - .owner = THIS_MODULE, - .open = tc358749xbg_debugfs_open, - .read = seq_read, - .write = tc358749xbg_debugfs_reg_write, - .llseek = seq_lseek, - .release = single_release -}; - -static struct dentry *debugfs_dir; - -static int tc358749xbg_probe( - struct i2c_client *client, - const struct i2c_device_id *id) -{ - dev_info(&client->dev, "probing...\n"); - - tc358749xbg_filltimings(&tc358749xbg_custom_config); - v4l2_i2c_subdev_init(&tc358749xbg.sd, client, - &tc358749xbg_camera_module_ops); - - tc358749xbg.custom = tc358749xbg_custom_config; - - test_parse_dts(&tc358749xbg, client); - debugfs_dir = debugfs_create_dir("hdmiin", NULL); - if (IS_ERR(debugfs_dir)) - printk(KERN_ERR "%s(%d): create debugfs dir failed!\n", - __func__, __LINE__); - else - debugfs_create_file("register", S_IRUSR, - debugfs_dir, &tc358749xbg, - &tc358749xbg_debugfs_fops); - - dev_info(&client->dev, "probing successful\n"); - return 0; -} - -/* ======================================================================== */ - -static int tc358749xbg_remove( - struct i2c_client *client) -{ - struct tc_camera_module *cam_mod = i2c_get_clientdata(client); - - dev_info(&client->dev, "remtcing device...\n"); - - if (!client->adapter) - return -ENODEV; /* our client isn't attached */ - - debugfs_remove_recursive(debugfs_dir); - test_deparse_dts(client); - - tc_camera_module_release(cam_mod); - - dev_info(&client->dev, "remtced\n"); - return 0; -} - -static const struct i2c_device_id tc358749xbg_id[] = { - { TC358749xbg_DRIVER_NAME, 0 }, - { } -}; - -static const struct of_device_id tc358749xbg_of_match[] = { - {.compatible = "toshiba,tc358749xbg-v4l2-i2c-subdev"}, - {}, -}; - -MODULE_DEVICE_TABLE(i2c, tc358749xbg_id); - -static struct i2c_driver tc358749xbg_i2c_driver = { - .driver = { - .name = TC358749xbg_DRIVER_NAME, - .of_match_table = tc358749xbg_of_match - }, - .probe = tc358749xbg_probe, - .remove = tc358749xbg_remove, - .id_table = tc358749xbg_id, -}; - -module_i2c_driver(tc358749xbg_i2c_driver); - -MODULE_DESCRIPTION("SoC Camera driver for tc358749xbg"); -MODULE_AUTHOR("Benjo"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/rockchip/tc_camera_module.c b/drivers/media/i2c/soc_camera/rockchip/tc_camera_module.c deleted file mode 100644 index c2b1a6d25d19..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/tc_camera_module.c +++ /dev/null @@ -1,1516 +0,0 @@ -/* - * tc_camera_module.c - * - * Generic toshiba sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * Author:zhoupeng - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tc_camera_module.h" - -#define I2C_M_WR 0 -#define I2C_MSG_MAX 300 - -static struct tc_camera_module *to_tc_camera_module(struct v4l2_subdev *sd) -{ - return container_of(sd, struct tc_camera_module, sd); -} - -/* ======================================================================== */ - -static void tc_camera_module_reset( - struct tc_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->inited = false; - cam_mod->active_config = NULL; - cam_mod->update_config = true; - cam_mod->frm_fmt_valid = false; - cam_mod->frm_intrvl_valid = false; - cam_mod->exp_config.auto_exp = false; - cam_mod->exp_config.auto_gain = false; - cam_mod->wb_config.auto_wb = false; - cam_mod->auto_adjust_fps = true; - cam_mod->rotation = 0; - cam_mod->ctrl_updt = 0; - cam_mod->state = TC_CAMERA_MODULE_POWER_OFF; - cam_mod->state_before_suspend = TC_CAMERA_MODULE_POWER_OFF; - - cam_mod->exp_config.exp_time = 0; - cam_mod->exp_config.gain = 0; - cam_mod->vts_cur = 0; -} - -/* ======================================================================== */ - -static void tc_camera_module_set_active_config( - struct tc_camera_module *cam_mod, - struct tc_camera_module_config *new_config) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(new_config)) { - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active config\n"); - } else { - cam_mod->ctrl_updt &= TC_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP | - TC_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN | - TC_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - if (new_config->auto_exp_enabled != - cam_mod->exp_config.auto_exp) { - cam_mod->ctrl_updt |= - TC_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = - new_config->auto_exp_enabled; - } - if (new_config->auto_gain_enabled != - cam_mod->exp_config.auto_gain) { - cam_mod->ctrl_updt |= - TC_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = - new_config->auto_gain_enabled; - } - if (new_config->auto_wb_enabled != - cam_mod->wb_config.auto_wb) { - cam_mod->ctrl_updt |= - TC_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = - new_config->auto_wb_enabled; - } - if (new_config != cam_mod->active_config) { - cam_mod->update_config = true; - cam_mod->active_config = new_config; - pltfrm_camera_module_pr_err(&cam_mod->sd, - "activating config '%s'\n", - cam_mod->active_config->name); - } - } -} - -/* ======================================================================== */ - -static struct tc_camera_module_config *tc_camera_module_find_config( - struct tc_camera_module *cam_mod, - struct v4l2_mbus_framefmt *fmt, - struct v4l2_subdev_frame_interval *frm_intrvl) -{ - u32 i; - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - - if (!IS_ERR_OR_NULL(fmt)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (!IS_ERR_OR_NULL(frm_intrvl)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "frame interval %d/%d\n", - frm_intrvl->interval.numerator, - frm_intrvl->interval.denominator); - - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (!IS_ERR_OR_NULL(frm_intrvl)) { - gcdiv = gcd(cam_mod->custom.configs[i].frm_intrvl.interval.numerator, - cam_mod->custom.configs[i].frm_intrvl.interval.denominator); - norm_interval.interval.numerator = - cam_mod->custom.configs[i].frm_intrvl.interval.numerator / gcdiv; - norm_interval.interval.denominator = - cam_mod->custom.configs[i].frm_intrvl.interval.denominator / gcdiv; - if ((frm_intrvl->interval.numerator != - norm_interval.interval.numerator) || - (frm_intrvl->interval.denominator != - norm_interval.interval.denominator)) - continue; - } - if (!IS_ERR_OR_NULL(fmt)) { - if ((cam_mod->custom.configs[i].frm_fmt.width != - fmt->width) || - (cam_mod->custom.configs[i].frm_fmt.height != - fmt->height) || - (cam_mod->custom.configs[i].frm_fmt.code != - fmt->code)) { - continue; - } - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "found matching config %s\n", - cam_mod->custom.configs[i].name); - return &cam_mod->custom.configs[i]; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "no matching config found\n"); - - return ERR_PTR(-EINVAL); -} - -/* ======================================================================== */ - -static int tc_camera_module_write_config( - struct tc_camera_module *cam_mod) -{ - int ret = 0; - struct tc_camera_module_reg *reg_table; - u32 reg_table_num_entries; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - - if (!cam_mod->inited) { - cam_mod->active_config->soft_reset = true; - reg_table = cam_mod->active_config->reg_table; - reg_table_num_entries = - cam_mod->active_config->reg_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s\n", - cam_mod->active_config->name); - } else { - if (cam_mod->active_config->reg_diff_table && - cam_mod->active_config->reg_diff_table_num_entries) { - cam_mod->active_config->soft_reset = false; - reg_table = cam_mod->active_config->reg_diff_table; - reg_table_num_entries = - cam_mod->active_config->reg_diff_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s%s\n", - cam_mod->active_config->name, "_diff"); - } else { - cam_mod->active_config->soft_reset = true; - reg_table = cam_mod->active_config->reg_table; - reg_table_num_entries = - cam_mod->active_config->reg_table_num_entries; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "write config %s\n", - cam_mod->active_config->name); - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.set_flip)) - cam_mod->custom.set_flip(cam_mod, - reg_table, reg_table_num_entries); - - ret = tc_camera_module_write_reglist(cam_mod, - reg_table, reg_table_num_entries); - if (IS_ERR_VALUE(ret)) - goto err; - ret = pltfrm_camera_module_patch_config(&cam_mod->sd, - &cam_mod->frm_fmt, - &cam_mod->frm_intrvl); - if (IS_ERR_VALUE(ret)) - goto err; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -static int tc_camera_module_attach( - struct tc_camera_module *cam_mod) -{ - int ret = 0; - struct tc_camera_module_custom_config *custom; - - pltfrm_camera_module_pr_err(&cam_mod->sd, "enter\n"); - - custom = &cam_mod->custom; - - if (custom->check_camera_id) { - tc_camera_module_s_power(&cam_mod->sd, 1); - ret = custom->check_camera_id(cam_mod); - tc_camera_module_s_power(&cam_mod->sd, 0); - if (ret != 0) - goto err; - } - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - tc_camera_module_release(cam_mod); - return ret; -} - -/* ======================================================================== */ - -int tc_camera_module_try_fmt(struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *fmt) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(tc_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "format not supported\n"); - return -EINVAL; - } - pltfrm_camera_module_pr_debug(&cam_mod->sd, "format supported\n"); - - return 0; -} - -/* ======================================================================== */ - -int tc_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%dx%d, fmt code 0x%04x\n", - fmt->width, fmt->height, fmt->code); - - if (IS_ERR_OR_NULL(tc_camera_module_find_config(cam_mod, fmt, NULL))) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "format %dx%d, code 0x%04x, not supported\n", - fmt->width, fmt->height, fmt->code); - ret = -EINVAL; - goto err; - } - cam_mod->frm_fmt_valid = true; - cam_mod->frm_fmt = *fmt; - if (cam_mod->frm_intrvl_valid) { - tc_camera_module_set_active_config(cam_mod, - tc_camera_module_find_config(cam_mod, - fmt, &cam_mod->frm_intrvl)); - } else { - tc_camera_module_set_active_config(cam_mod, - tc_camera_module_find_config(cam_mod, - fmt, NULL)); - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int tc_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - struct v4l2_mbus_framefmt *fmt = &format->format; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->active_config) { - fmt->code = cam_mod->active_config->frm_fmt.code; - fmt->width = cam_mod->active_config->frm_fmt.width; - fmt->height = cam_mod->active_config->frm_fmt.height; - return 0; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "no active config\n"); - - return -1; -} - -/* ======================================================================== */ - -int tc_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - unsigned long gcdiv; - struct v4l2_subdev_frame_interval norm_interval; - struct tc_camera_module_config *config; - unsigned int vts; - int ret = 0; - - if ((interval->interval.denominator == 0) || - (interval->interval.numerator == 0)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "invalid frame interval %d/%d\n", - interval->interval.numerator, - interval->interval.denominator); - ret = -EINVAL; - goto err; - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d/%d (%dfps)\n", - interval->interval.numerator, interval->interval.denominator, - (interval->interval.denominator + - (interval->interval.numerator >> 1)) / - interval->interval.numerator); - - /* normalize interval */ - gcdiv = gcd(interval->interval.numerator, - interval->interval.denominator); - norm_interval.interval.numerator = - interval->interval.numerator / gcdiv; - norm_interval.interval.denominator = - interval->interval.denominator / gcdiv; - - config = tc_camera_module_find_config(cam_mod, - NULL, &norm_interval); - - if (!cam_mod->frm_fmt_valid) - goto end; - config = tc_camera_module_find_config( - cam_mod, - &cam_mod->active_config->frm_fmt, - &norm_interval); - - if (!IS_ERR_OR_NULL(config) && (config != cam_mod->active_config)) { - tc_camera_module_set_active_config(cam_mod, config); - if (cam_mod->state == TC_CAMERA_MODULE_STREAMING) { - cam_mod->custom.enable_stream(cam_mod, false); - tc_camera_module_write_config(cam_mod); - cam_mod->custom.enable_stream(cam_mod, true); - } - } else { - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "no active sensor configuration"); - ret = -EFAULT; - goto err; - } - if (cam_mod->active_config->frm_intrvl.interval.denominator < - norm_interval.interval.denominator) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "%dx%d@%dfps isn't support!", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - norm_interval.interval.denominator); - ret = -EFAULT; - goto err; - } - if (!cam_mod->custom.s_vts) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "custom.s_vts isn't support!"); - ret = -EFAULT; - goto err; - } - - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= norm_interval.interval.denominator; - cam_mod->vts_cur = vts; - - if (cam_mod->state != TC_CAMERA_MODULE_STREAMING) - goto end; - - cam_mod->custom.s_vts(cam_mod, vts); - } - -end: - cam_mod->frm_intrvl_valid = true; - cam_mod->frm_intrvl = norm_interval; - cam_mod->auto_adjust_fps = false; - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -int tc_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - - if (cam_mod->active_config) { - if (cam_mod->state == TC_CAMERA_MODULE_STREAMING) { - if (cam_mod->frm_intrvl_valid) { - *interval = cam_mod->frm_intrvl; - return 0; - } else { - *interval = cam_mod->active_config->frm_intrvl; - return 0; - } - } - } - - return -EFAULT; -} - -/* ======================================================================== */ - -int tc_camera_module_s_stream(struct v4l2_subdev *sd, int enable) -{ - int ret = 0; - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - unsigned int vts; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", enable); - - if (enable) { - if (cam_mod->state == TC_CAMERA_MODULE_STREAMING) - return 0; - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active sensor configuration, cannot start streaming\n"); - ret = -EFAULT; - goto err; - } - if (cam_mod->state != TC_CAMERA_MODULE_SW_STANDBY) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "sensor is not powered on (in state %d), cannot start streaming\n", - cam_mod->state); - ret = -EINVAL; - goto err; - } - if (cam_mod->update_config) { - ret = tc_camera_module_write_config(cam_mod); - if (IS_ERR_VALUE(ret)) - goto err; - } - - ret = cam_mod->custom.enable_stream(cam_mod, true); - if (IS_ERR_VALUE(ret)) - goto err; - - if (cam_mod->frm_intrvl_valid) { - if ((cam_mod->frm_intrvl.interval.numerator != - cam_mod->active_config->frm_intrvl.interval.numerator) || - (cam_mod->frm_intrvl.interval.denominator != - cam_mod->active_config->frm_intrvl.interval.denominator)) { - if (cam_mod->frm_intrvl.interval.denominator > - cam_mod->active_config->frm_intrvl.interval.denominator) { - pltfrm_camera_module_pr_warn(&cam_mod->sd, - "sensor is not support stream: %dx%d@(%d/%d)fps!\n", - cam_mod->active_config->frm_fmt.width, - cam_mod->active_config->frm_fmt.height, - cam_mod->frm_intrvl.interval.denominator, - cam_mod->frm_intrvl.interval.numerator); - goto end; - } - vts = cam_mod->active_config->timings.frame_length_lines; - vts *= cam_mod->active_config->frm_intrvl.interval.denominator; - vts /= cam_mod->frm_intrvl.interval.denominator; - cam_mod->custom.s_vts(cam_mod, vts); - } - } - - if (!cam_mod->inited && cam_mod->update_config) - cam_mod->inited = true; - cam_mod->update_config = false; - cam_mod->ctrl_updt = 0; - mdelay(cam_mod->custom.power_up_delays_ms[2]); - cam_mod->state = TC_CAMERA_MODULE_STREAMING; - } else { - int pclk; - int wait_ms; - struct isp_supplemental_sensor_mode_data timings; - - if (cam_mod->state != TC_CAMERA_MODULE_STREAMING) - return 0; - ret = cam_mod->custom.enable_stream(cam_mod, false); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = tc_camera_module_ioctl(sd, - RK_VIDIOC_SENSOR_MODE_DATA, - &timings); - - cam_mod->state = TC_CAMERA_MODULE_SW_STANDBY; - - if (IS_ERR_VALUE(ret)) - goto err; - - pclk = timings.vt_pix_clk_freq_hz / 1000; - - if (!pclk) - goto err; - - wait_ms = - (timings.line_length_pck * - timings.frame_length_lines) / - pclk; - - /* - * wait for a frame period to make sure that there is - * no pending frame left. - */ - - msleep(wait_ms + 1); - } - -end: - cam_mod->state_before_suspend = cam_mod->state; - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int tc_camera_module_s_power(struct v4l2_subdev *sd, int on) -{ - int ret = 0; - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - struct v4l2_subdev *af_ctrl; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", on); - - if (on) { - if (cam_mod->state == TC_CAMERA_MODULE_POWER_OFF) { - cam_mod->custom.s_power(cam_mod, 1); - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 1); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[0]); - cam_mod->state = TC_CAMERA_MODULE_HW_STANDBY; - } - } - if (cam_mod->state == TC_CAMERA_MODULE_HW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - if (!IS_ERR_VALUE(ret)) { - mdelay(cam_mod->custom.power_up_delays_ms[1]); - cam_mod->state = TC_CAMERA_MODULE_SW_STANDBY; - if (!IS_ERR_OR_NULL( - cam_mod->custom.init_common) && - cam_mod->custom.init_common( - cam_mod)) - usleep_range(1000, 1500); - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - v4l2_subdev_call(af_ctrl, - core, init, 0); - } - } - } - if (cam_mod->update_config) { - tc_camera_module_write_config(cam_mod); - cam_mod->update_config = false; - } - } else { - if (cam_mod->state == TC_CAMERA_MODULE_STREAMING) { - ret = tc_camera_module_s_stream(sd, 0); - if (!IS_ERR_VALUE(ret)) - cam_mod->state = TC_CAMERA_MODULE_SW_STANDBY; - } - if (cam_mod->state == TC_CAMERA_MODULE_SW_STANDBY) { - ret = pltfrm_camera_module_set_pin_state( - &cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - - if (!IS_ERR_VALUE(ret)) - cam_mod->state = TC_CAMERA_MODULE_HW_STANDBY; - } - if (cam_mod->state == TC_CAMERA_MODULE_HW_STANDBY) { - cam_mod->custom.s_power(cam_mod, 0); - ret = pltfrm_camera_module_s_power(&cam_mod->sd, 0); - if (!IS_ERR_VALUE(ret)) { - cam_mod->state = TC_CAMERA_MODULE_POWER_OFF; - tc_camera_module_reset(cam_mod); - } - } - } - - cam_mod->state_before_suspend = cam_mod->state; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "%s failed, camera left in state %d\n", - on ? "on" : "off", cam_mod->state); - goto err; - } else { - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "camera powered %s\n", on ? "on" : "off"); - } - - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -/* ======================================================================== */ - -int tc_camera_module_g_ctrl(struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - int ret; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, " id 0x%x\n", ctrl->id); - - if (ctrl->id == V4L2_CID_MIN_BUFFERS_FOR_CAPTURE) { - ctrl->value = 2; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_MIN_BUFFERS_FOR_CAPTURE %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_HFLIP) { - ctrl->value = cam_mod->hflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_HFLIP %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_VFLIP) { - ctrl->value = cam_mod->vflip; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_VFLIP %d\n", - ctrl->value); - return 0; - } - - if (ctrl->id == V4L2_CID_FLASH_LED_MODE) { - ctrl->value = cam_mod->exp_config.flash_mode; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - return 0; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "no active configuration\n"); - return -EFAULT; - } - - if (ctrl->id == RK_V4L2_CID_VBLANKING) { - ctrl->value = cam_mod->active_config->v_blanking_time_us; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "RK_V4L2_CID_VBLANKING %d\n", - ctrl->value); - return 0; - } - - if ((cam_mod->state != TC_CAMERA_MODULE_SW_STANDBY) && - (cam_mod->state != TC_CAMERA_MODULE_STREAMING)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cannot get controls when camera is off\n"); - return -EFAULT; - } - - if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - ret = v4l2_subdev_call(af_ctrl, core, g_ctrl, ctrl); - return ret; - } - } - - if (!IS_ERR_OR_NULL(cam_mod->custom.g_ctrl)) { - ret = cam_mod->custom.g_ctrl(cam_mod, ctrl->id); - if (IS_ERR_VALUE(ret)) - return ret; - } - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl->value = cam_mod->exp_config.gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE: - ctrl->value = cam_mod->exp_config.exp_time; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl->value = cam_mod->wb_config.temperature; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.preset_id; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl->value = cam_mod->exp_config.auto_gain; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl->value = cam_mod->exp_config.auto_exp; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl->value = cam_mod->wb_config.auto_wb; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - ctrl->value = cam_mod->af_config.abs_pos; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - default: - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed, unknown ctrl %d\n", ctrl->id); - return -EINVAL; - } - - return 0; -} - -static int flash_light_ctrl( - struct v4l2_subdev *sd, - struct tc_camera_module *cam_mod, - int value) -{ - return 0; -} - -/* ======================================================================== */ - -int tc_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls) -{ - int i; - int ctrl_cnt = 0; - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - struct tc_camera_module_ext_ctrls tc_ctrls; - int ret = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - if (ctrls->count == 0) - return -EINVAL; - - for (i = 0; i < ctrls->count; i++) { - struct v4l2_ext_control *ctrl; - u32 ctrl_updt = 0; - - ctrl = &ctrls->controls[i]; - - switch (ctrl->id) { - case V4L2_CID_GAIN: - ctrl_updt = TC_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain = ctrl->value; - pltfrm_camera_module_pr_debug( - &cam_mod->sd, - "V4L2_CID_GAIN %d\n", - ctrl->value); - break; - case RK_V4L2_CID_GAIN_PERCENT: - ctrl_updt = TC_CAMERA_MODULE_CTRL_UPDT_GAIN; - cam_mod->exp_config.gain_percent = ctrl->value; - break; - case V4L2_CID_FLASH_LED_MODE: - ret = flash_light_ctrl(sd, cam_mod, ctrl->value); - if (ret == 0) { - cam_mod->exp_config.flash_mode = ctrl->value; - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "V4L2_CID_FLASH_LED_MODE %d\n", - ctrl->value); - } - break; - case V4L2_CID_EXPOSURE: - ctrl_updt = TC_CAMERA_MODULE_CTRL_UPDT_EXP_TIME; - cam_mod->exp_config.exp_time = ctrl->value; - pltfrm_camera_module_pr_debug - (&cam_mod->sd, - "V4L2_CID_EXPOSURE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_VTS: - ctrl_updt = TC_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE; - cam_mod->exp_config.vts_value = ctrl->value; - break; - case V4L2_CID_WHITE_BALANCE_TEMPERATURE: - ctrl_updt = TC_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE; - cam_mod->wb_config.temperature = ctrl->value; - pltfrm_camera_module_pr_debug( - &cam_mod->sd, - "V4L2_CID_WHITE_BALANCE_TEMPERATURE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE: - ctrl_updt = TC_CAMERA_MODULE_CTRL_UPDT_PRESET_WB; - cam_mod->wb_config.preset_id = ctrl->value; - pltfrm_camera_module_pr_debug( - &cam_mod->sd, - "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE %d\n", - ctrl->value); - break; - case V4L2_CID_AUTOGAIN: - ctrl_updt = TC_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN; - cam_mod->exp_config.auto_gain = ctrl->value; - pltfrm_camera_module_pr_debug( - &cam_mod->sd, - "V4L2_CID_AUTOGAIN %d\n", - ctrl->value); - break; - case V4L2_CID_EXPOSURE_AUTO: - ctrl_updt = TC_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP; - cam_mod->exp_config.auto_exp = ctrl->value; - pltfrm_camera_module_pr_debug( - &cam_mod->sd, - "V4L2_CID_EXPOSURE_AUTO %d\n", - ctrl->value); - break; - case V4L2_CID_AUTO_WHITE_BALANCE: - ctrl_updt = TC_CAMERA_MODULE_CTRL_UPDT_AUTO_WB; - cam_mod->wb_config.auto_wb = ctrl->value; - pltfrm_camera_module_pr_debug( - &cam_mod->sd, - "V4L2_CID_AUTO_WHITE_BALANCE %d\n", - ctrl->value); - break; - case RK_V4L2_CID_AUTO_FPS: - cam_mod->auto_adjust_fps = ctrl->value; - pltfrm_camera_module_pr_debug( - &cam_mod->sd, - "RK_V4L2_CID_AUTO_FPS %d\n", - ctrl->value); - break; - case V4L2_CID_FOCUS_ABSOLUTE: - { - struct v4l2_subdev *af_ctrl; - - af_ctrl = pltfrm_camera_module_get_af_ctrl(sd); - if (!IS_ERR_OR_NULL(af_ctrl)) { - struct v4l2_control single_ctrl; - - single_ctrl.id = - V4L2_CID_FOCUS_ABSOLUTE; - single_ctrl.value = ctrl->value; - ret = v4l2_subdev_call(af_ctrl, - core, s_ctrl, &single_ctrl); - return ret; - } - } - ctrl_updt = - TC_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE; - cam_mod->af_config.abs_pos = ctrl->value; - pltfrm_camera_module_pr_debug( - &cam_mod->sd, - "V4L2_CID_FOCUS_ABSOLUTE %d\n", - ctrl->value); - break; - case V4L2_CID_HFLIP: - if (ctrl->value) - cam_mod->hflip = true; - else - cam_mod->hflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_VFLIP: - if (ctrl->value) - cam_mod->vflip = true; - else - cam_mod->vflip = false; - cam_mod->flip_flg = true; - break; - case V4L2_CID_TEST_PATTERN: - tc_ctrls.ctrls = - kmalloc_array(ctrls->count, - sizeof(*tc_ctrls.ctrls), - GFP_KERNEL); - if (tc_ctrls.ctrls) { - for (i = 0; i < ctrls->count; i++) { - tc_ctrls.ctrls[i].id = - ctrls->controls[i].id; - tc_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - tc_ctrls.count = ctrls->count; - ret = cam_mod->custom.s_ext_ctrls(cam_mod, - &tc_ctrls); - } - kfree(tc_ctrls.ctrls); - break; - default: - pltfrm_camera_module_pr_warn( - &cam_mod->sd, - "ignoring unknown ctrl 0x%x\n", - ctrl->id); - break; - } - - if (cam_mod->state != TC_CAMERA_MODULE_SW_STANDBY && - cam_mod->state != TC_CAMERA_MODULE_STREAMING) - cam_mod->ctrl_updt |= ctrl_updt; - else if (ctrl_updt) - ctrl_cnt++; - } - - /* if camera module is already streaming, write through */ - if (ctrl_cnt && - (cam_mod->state == TC_CAMERA_MODULE_STREAMING || - cam_mod->state == TC_CAMERA_MODULE_SW_STANDBY)) { - struct tc_camera_module_ext_ctrls tc_ctrls; - - tc_ctrls.ctrls = - (struct tc_camera_module_ext_ctrl *) - kmalloc(ctrl_cnt * sizeof(struct tc_camera_module_ext_ctrl), - GFP_KERNEL); - - if (tc_ctrls.ctrls) { - for (i = 0; i < ctrl_cnt; i++) { - tc_ctrls.ctrls[i].id = ctrls->controls[i].id; - tc_ctrls.ctrls[i].value = - ctrls->controls[i].value; - } - - tc_ctrls.count = ctrl_cnt; - - ret = cam_mod->custom.s_ext_ctrls(cam_mod, &tc_ctrls); - - kfree(tc_ctrls.ctrls); - } else { - ret = -ENOMEM; - } - if (IS_ERR_VALUE(ret)) - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "failed with error %d\n", ret); - } - - return ret; -} - -/* ======================================================================== */ - -int tc_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - struct v4l2_ext_control ext_ctrl[1]; - struct v4l2_ext_controls ext_ctrls; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, - "0x%x 0x%x\n", ctrl->id, ctrl->value); - - ext_ctrl[0].id = ctrl->id; - ext_ctrl[0].value = ctrl->value; - - ext_ctrls.count = 1; - ext_ctrls.controls = ext_ctrl; - - return tc_camera_module_s_ext_ctrls(sd, &ext_ctrls); -} - -/* ======================================================================== */ - -long tc_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - int ret, i; - unsigned int flag, val; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "cmd: 0x%x\n", cmd); - - if (cmd == RK_VIDIOC_SENSOR_MODE_DATA) { - struct tc_camera_module_timings tc_timings; - struct isp_supplemental_sensor_mode_data *timings = - (struct isp_supplemental_sensor_mode_data *)arg; - - if (cam_mod->custom.g_timings) - ret = cam_mod->custom.g_timings(cam_mod, &tc_timings); - else - ret = -EPERM; - - if (IS_ERR_VALUE(ret)) { - pltfrm_camera_module_pr_err( - &cam_mod->sd, - "failed with error %d\n", - ret); - return ret; - } - - timings->sensor_output_width = tc_timings.sensor_output_width; - timings->sensor_output_height = tc_timings.sensor_output_height; - timings->crop_horizontal_start = - tc_timings.crop_horizontal_start; - timings->crop_vertical_start = tc_timings.crop_vertical_start; - timings->crop_horizontal_end = tc_timings.crop_horizontal_end; - timings->crop_vertical_end = tc_timings.crop_vertical_end; - timings->line_length_pck = tc_timings.line_length_pck; - timings->frame_length_lines = tc_timings.frame_length_lines; - timings->vt_pix_clk_freq_hz = tc_timings.vt_pix_clk_freq_hz; - timings->binning_factor_x = tc_timings.binning_factor_x; - timings->binning_factor_y = tc_timings.binning_factor_y; - timings->coarse_integration_time_max_margin = - tc_timings.coarse_integration_time_max_margin; - timings->coarse_integration_time_min = - tc_timings.coarse_integration_time_min; - timings->fine_integration_time_max_margin = - tc_timings.fine_integration_time_max_margin; - timings->fine_integration_time_min = - tc_timings.fine_integration_time_min; - - timings->exposure_valid_frame[0] = - cam_mod->custom.exposure_valid_frame[0]; - timings->exposure_valid_frame[1] = - cam_mod->custom.exposure_valid_frame[1]; - if (cam_mod->exp_config.exp_time) - timings->exp_time = cam_mod->exp_config.exp_time; - else - timings->exp_time = tc_timings.exp_time; - if (cam_mod->exp_config.gain) - timings->gain = cam_mod->exp_config.gain; - else - timings->gain = tc_timings.gain; - - if (cam_mod->active_config) { - timings->max_exp_gain_h = cam_mod->active_config->max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->active_config->max_exp_gain_l; - } else { - timings->max_exp_gain_h = cam_mod->custom.configs[0].max_exp_gain_h; - timings->max_exp_gain_l = cam_mod->custom.configs[0].max_exp_gain_l; - } - return ret; - } else if (cmd == RK_VIDIOC_SENSOR_CONFIGINFO) { - struct sensor_config_info_s *sensor_config = (struct sensor_config_info_s *)arg; - - sensor_config->config_num = cam_mod->custom.num_configs; - for (i = 0; i < cam_mod->custom.num_configs; i++) { - if (i >= SENSOR_CONFIG_NUM) - break; - sensor_config->sensor_fmt[i] = - pltfrm_camera_module_pix_fmt2csi2_dt(cam_mod->custom.configs[i].frm_fmt.code); - sensor_config->reso[i].width = cam_mod->custom.configs[i].frm_fmt.width; - sensor_config->reso[i].height = cam_mod->custom.configs[i].frm_fmt.height; - } - return 0; - } else if (cmd == RK_VIDIOC_SENSOR_REG_ACCESS) { - struct sensor_reg_rw_s *sensor_rw = (struct sensor_reg_rw_s *)arg; - - if (sensor_rw->reg_access_mode == SENSOR_READ_MODE) { - for (i = 0; i < cam_mod->custom.configs[0].reg_table_num_entries; i++) { - flag = cam_mod->custom.configs[0].reg_table[i].flag; - if (flag != PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) - break; - } - if (flag == PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "Can not get sensor reg type.\n"); - return -EINVAL; - } - sensor_rw->reg_addr_len = PLTFRM_CAMERA_MODULE_REG_LEN(flag); - sensor_rw->reg_data_len = PLTFRM_CAMERA_MODULE_DATA_LEN(flag); - pltfrm_camera_module_read_reg_ex(&cam_mod->sd, 1, flag, sensor_rw->addr, &val); - sensor_rw->data = val; - } else { - flag = (sensor_rw->reg_addr_len << PLTFRM_CAMERA_MODULE_REG_LEN_BIT); - flag |= (sensor_rw->reg_data_len << PLTFRM_CAMERA_MODULE_DATA_LEN_BIT); - pltfrm_camera_module_write_reg_ex(&cam_mod->sd, flag, sensor_rw->addr, sensor_rw->data); - } - return 0; - } else if (cmd == PLTFRM_CIFCAM_G_ITF_CFG) { - struct pltfrm_cam_itf *itf_cfg = (struct pltfrm_cam_itf *)arg; - struct tc_camera_module_config *config; - - if (cam_mod->custom.num_configs <= 0) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "cam_mod->custom.num_configs is NULL, Get interface config failed!\n"); - return -EINVAL; - } - - if (IS_ERR_OR_NULL(cam_mod->active_config)) - config = &cam_mod->custom.configs[0]; - else - config = cam_mod->active_config; - - *itf_cfg = config->itf_cfg; - - pltfrm_camera_module_ioctl(sd, PLTFRM_CIFCAM_G_ITF_CFG, arg); - return 0; - } else if (cmd == PLTFRM_CIFCAM_ATTACH) { - ret = tc_camera_module_init(cam_mod, &cam_mod->custom); - if (!IS_ERR_VALUE(ret)) { - pltfrm_camera_module_ioctl(sd, cmd, arg); - return tc_camera_module_attach(cam_mod); - } else { - tc_camera_module_release(cam_mod); - return ret; - } - } - - ret = pltfrm_camera_module_ioctl(sd, cmd, arg); - return ret; -} - -/* ======================================================================== */ - -int tc_camera_module_get_flip_mirror( - struct tc_camera_module *cam_mod) -{ - int mode = 0; - - if (!cam_mod->flip_flg) - return -1; - - if (cam_mod->hflip) - mode |= TC_MIRROR_BIT_MASK; - else - mode &= ~TC_MIRROR_BIT_MASK; - - if (cam_mod->vflip) - mode |= TC_FLIP_BIT_MASK; - else - mode &= ~TC_FLIP_BIT_MASK; - - return mode; -} - -/* ======================================================================== */ - -int tc_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie) -{ - struct tc_camera_module *cam_mod = to_tc_camera_module(sd); - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "%d\n", fie->index); - - if (fie->index >= cam_mod->custom.num_configs) - return -EINVAL; - fie->code = - cam_mod->custom.configs[fie->index].frm_fmt.code; - fie->width = - cam_mod->custom.configs[fie->index].frm_fmt.width; - fie->height = - cam_mod->custom.configs[fie->index].frm_fmt.height; - fie->interval.numerator = cam_mod->custom.configs[fie->index].frm_intrvl.interval.numerator; - fie->interval.denominator = cam_mod->custom.configs[fie->index].frm_intrvl.interval.denominator; - return 0; -} - -/* ======================================================================== */ -static int tc_camera_module_i2c_write(struct v4l2_subdev *sd, u16 reg, - u8 *values, u32 len) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret, i; - struct i2c_msg msg[1]; - unsigned char data[32]; - int retries; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(sd, "client->adapter NULL\n"); - return -ENODEV; - } - - for (retries = 0; retries < 5; retries++) { - msg->addr = client->addr; - msg->flags = I2C_M_WR; - msg->len = 2 + len; - msg->buf = data; - - /* high byte goes out first */ - data[0] = (u8)(reg >> 8); - data[1] = (u8)(reg & 0xff); - for (i = 0; i < len; i++) - data[2 + i] = values[i]; - - ret = i2c_transfer(client->adapter, msg, 1); - if (ret == 1) { - pltfrm_camera_module_pr_debug(sd, - "i2c write to offset 0x%08x success\n", reg); - return 0; - } - - pltfrm_camera_module_pr_err(sd, - "retrying I2C... %d\n", retries); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(msecs_to_jiffies(20)); - } - pltfrm_camera_module_pr_err(sd, - "i2c write to offset 0x%08x failed with error %d\n", reg, ret); - return ret; -} - -/* ======================================================================== */ -static int tc_camera_module_i2c_read(struct v4l2_subdev *sd, u16 reg, - u32 *value, u32 len) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - unsigned char data[4] = {0, 0, 0, 0}; - struct i2c_msg msg[1]; - - if (!client->adapter) { - pltfrm_camera_module_pr_err(sd, "client->adapter NULL\n"); - return -ENODEV; - } - - msg->addr = client->addr; - msg->flags = I2C_M_WR; - msg->len = 2; - msg->buf = data; - - /* High byte goes out first */ - data[0] = (u8)(reg >> 8); - data[1] = (u8)(reg & 0xff); - - ret = i2c_transfer(client->adapter, msg, 1); - if (ret >= 0) { - mdelay(3); - msg->flags = I2C_M_RD; - msg->len = len; - msg->buf = data; - i2c_transfer(client->adapter, msg, 1); - } - if (ret >= 0) { - if (len == 1) - *value = data[0]; - else if (len == 2) - *value = data[0] + (data[1] << 8); - else - *value = data[0] + (data[1] << 8) + - (data[2] << 16) + (data[3] << 24); - return 0; - } - - return ret; -} - -/* ===============================I2c==================================== */ - -int tc_camera_module_write8_reg( - struct tc_camera_module *cam_mod, - u16 reg, - u8 val) -{ - return tc_camera_module_i2c_write(&cam_mod->sd, reg, &val, 1); -} - -int tc_camera_module_write16_reg( - struct tc_camera_module *cam_mod, - u16 reg, - u16 val) -{ - return tc_camera_module_i2c_write(&cam_mod->sd, reg, (u8 *)&val, 2); -} - -int tc_camera_module_write32_reg( - struct tc_camera_module *cam_mod, - u16 reg, - u32 val) -{ - return tc_camera_module_i2c_write(&cam_mod->sd, reg, (u8 *)&val, 4); -} - -u8 tc_camera_module_read8_reg( - struct tc_camera_module *cam_mod, - u16 reg) -{ - u32 val; - u8 ret; - - tc_camera_module_i2c_read(&cam_mod->sd, reg, &val, 1); - ret = val & 0xff; - - return ret; -} - -u16 tc_camera_module_read16_reg( - struct tc_camera_module *cam_mod, - u16 reg) -{ - u32 val; - u16 ret; - - tc_camera_module_i2c_read(&cam_mod->sd, reg, &val, 2); - ret = val & 0xffff; - - return ret; -} - -u32 tc_camera_module_read32_reg( - struct tc_camera_module *cam_mod, - u16 reg) -{ - u32 val; - - tc_camera_module_i2c_read(&cam_mod->sd, reg, &val, 4); - - return val; -} - -int tc_camera_module_read_reg_table( - struct tc_camera_module *cam_mod, - u16 reg, - u32 *val) -{ - int i; - - if (cam_mod->state == TC_CAMERA_MODULE_STREAMING) - return tc_camera_module_i2c_read(&cam_mod->sd, - reg, val, 1); - - if (!IS_ERR_OR_NULL(cam_mod->active_config)) { - for ( - i = cam_mod->active_config->reg_table_num_entries - 1; - i > 0; - i--) { - if (cam_mod->active_config->reg_table[i].reg == reg) { - *val = cam_mod->active_config->reg_table[i].val; - return 0; - } - } - } - - if (cam_mod->state == TC_CAMERA_MODULE_SW_STANDBY) - return tc_camera_module_i2c_read(&cam_mod->sd, - reg, val, 1); - - return -EFAULT; -} - -int tc_camera_module_write_reglist( - struct tc_camera_module *cam_mod, - const struct tc_camera_module_reg reglist[], - int len) -{ - int i = 0; - - for (i = 0; i < len; i++) { - switch (reglist[i].flag) { - case TC_CAMERA_MODULE_REG_TYPE_DATA: - switch (reglist[i].len) { - case TC_CAMERA_MOUDLE_REG_VALUE_LEN_8BIT: - tc_camera_module_write8_reg(cam_mod, reglist[i].reg, (u8)reglist[i].val); - break; - case TC_CAMERA_MOUDLE_REG_VALUE_LEN_16BIT: - tc_camera_module_write16_reg(cam_mod, reglist[i].reg, (u16)reglist[i].val); - break; - case TC_CAMERA_MOUDLE_REG_VALUE_LEN_32BIT: - tc_camera_module_write32_reg(cam_mod, reglist[i].reg, (u32)reglist[i].val); - break; - default: - pltfrm_camera_module_pr_err(&cam_mod->sd, "unknown value len, default 8bit\n"); - tc_camera_module_write8_reg(cam_mod, reglist[i].reg, (u8)reglist[i].val); - break; - } - break; - case PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT: - mdelay(reglist[i].val); - break; - default: - pltfrm_camera_module_pr_err(&cam_mod->sd, "unknown command\n"); - return -1; - } - } - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "write reg list len %d\n", len); - return 0; -} - -int tc_camera_module_init(struct tc_camera_module *cam_mod, - struct tc_camera_module_custom_config *custom) -{ - int ret = 0; - int mode = 0; - - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - cam_mod->hflip = false; - cam_mod->vflip = false; - cam_mod->flip_flg = false; - tc_camera_module_reset(cam_mod); - - if (IS_ERR_OR_NULL(custom->s_ctrl) || - IS_ERR_OR_NULL(custom->g_ctrl)) { - pltfrm_camera_module_pr_err(&cam_mod->sd, - "mandatory callback function is missing\n"); - ret = -EINVAL; - goto err; - } - - ret = pltfrm_camera_module_init(&cam_mod->sd, &cam_mod->pltfm_data); - if (IS_ERR_VALUE(ret)) - goto err; - - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_PD, - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE); - ret = pltfrm_camera_module_set_pin_state(&cam_mod->sd, - PLTFRM_CAMERA_MODULE_PIN_RESET, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE); - if (IS_ERR_VALUE(ret)) { - tc_camera_module_release(cam_mod); - goto err; - } - - mode = pltfrm_camera_module_get_flip_mirror(&cam_mod->sd); - if (mode != -1) { - cam_mod->hflip = mode & TC_MIRROR_BIT_MASK ? true : false; - cam_mod->vflip = mode & TC_FLIP_BIT_MASK ? true : false; - cam_mod->flip_flg = true; - } - return 0; -err: - pltfrm_camera_module_pr_err(&cam_mod->sd, - "failed with error %d\n", ret); - return ret; -} - -void tc_camera_module_release(struct tc_camera_module *cam_mod) -{ - pltfrm_camera_module_pr_debug(&cam_mod->sd, "\n"); - - if (cam_mod->otp_work.wq) { - flush_workqueue(cam_mod->otp_work.wq); - destroy_workqueue(cam_mod->otp_work.wq); - cam_mod->otp_work.wq = NULL; - } - - cam_mod->custom.configs = NULL; - - pltfrm_camera_module_release(&cam_mod->sd); - v4l2_device_unregister_subdev(&cam_mod->sd); -} diff --git a/drivers/media/i2c/soc_camera/rockchip/tc_camera_module.h b/drivers/media/i2c/soc_camera/rockchip/tc_camera_module.h deleted file mode 100644 index 673f6c284bf4..000000000000 --- a/drivers/media/i2c/soc_camera/rockchip/tc_camera_module.h +++ /dev/null @@ -1,336 +0,0 @@ -/* - * tc_camera_module.h - * - * Generic toshiba sensor driver - * - * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd. - * - * Copyright (C) 2012-2014 Intel Mobile Communications GmbH - * - * Copyright (C) 2008 Texas Instruments. - * - * Author:zhoupeng - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - * - */ - -#ifndef TC_CAMERA_MODULE_H -#define TC_CAMERA_MODULE_H -#include -#include -#include -#include - -/* - * TODO: references to v4l2 should be reomved from here and go into a - * platform dependent wrapper - */ - -#define TC_CAMERA_MODULE_REG_TYPE_DATA PLTFRM_CAMERA_MODULE_REG_TYPE_DATA -#define TC_CAMERA_MODULE_REG_TYPE_TIMEOUT PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT -#define TC_CAMERA_MOUDLE_REG_VALUE_LEN_8BIT 1 -#define TC_CAMERA_MOUDLE_REG_VALUE_LEN_16BIT 2 -#define TC_CAMERA_MOUDLE_REG_VALUE_LEN_32BIT 4 -#define tc_camera_module_csi_config -#define TC_FLIP_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_FLIP_BIT) -#define TC_MIRROR_BIT_MASK (1 << PLTFRM_CAMERA_MODULE_MIRROR_BIT) - -#define TC_CAMERA_MODULE_CTRL_UPDT_GAIN 0x01 -#define TC_CAMERA_MODULE_CTRL_UPDT_EXP_TIME 0x02 -#define TC_CAMERA_MODULE_CTRL_UPDT_WB_TEMPERATURE 0x04 -#define TC_CAMERA_MODULE_CTRL_UPDT_AUTO_WB 0x08 -#define TC_CAMERA_MODULE_CTRL_UPDT_AUTO_GAIN 0x10 -#define TC_CAMERA_MODULE_CTRL_UPDT_AUTO_EXP 0x20 -#define TC_CAMERA_MODULE_CTRL_UPDT_FOCUS_ABSOLUTE 0x40 -#define TC_CAMERA_MODULE_CTRL_UPDT_PRESET_WB 0x80 -#define TC_CAMERA_MODULE_CTRL_UPDT_VTS_VALUE 0x100 - -enum tc_camera_module_state { - TC_CAMERA_MODULE_POWER_OFF = 0, - TC_CAMERA_MODULE_HW_STANDBY = 1, - TC_CAMERA_MODULE_SW_STANDBY = 2, - TC_CAMERA_MODULE_STREAMING = 3 -}; - -struct tc_camera_module; - -struct tc_camera_module_reg { - u32 flag; - u16 reg; - u32 val; - u8 len; -}; - -struct tc_camera_module_timings { - /* public */ - u32 coarse_integration_time_min; - u32 coarse_integration_time_max_margin; - u32 fine_integration_time_min; - u32 fine_integration_time_max_margin; - u32 frame_length_lines; - u32 line_length_pck; - u32 vt_pix_clk_freq_hz; - u32 sensor_output_width; - u32 sensor_output_height; - u32 crop_horizontal_start; /* Sensor crop start cord. (x0,y0) */ - u32 crop_vertical_start; - u32 crop_horizontal_end; /* Sensor crop end cord. (x1,y1) */ - u32 crop_vertical_end; - u8 binning_factor_x; - u8 binning_factor_y; - u32 exp_time; - u32 gain; -}; - -struct tc_camera_module_config { - const char *name; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - bool auto_exp_enabled; - bool auto_gain_enabled; - bool auto_wb_enabled; - struct tc_camera_module_reg *reg_table; - u32 reg_table_num_entries; - struct tc_camera_module_reg *reg_diff_table; - u32 reg_diff_table_num_entries; - u32 v_blanking_time_us; - u32 line_length_pck; - u32 frame_length_lines; - struct tc_camera_module_timings timings; - bool soft_reset; - bool ignore_measurement_check; - u8 max_exp_gain_h; - u8 max_exp_gain_l; - struct pltfrm_cam_itf itf_cfg; -}; - -struct tc_camera_module_exp_config { - s32 exp_time; - bool auto_exp; - u16 gain; - u16 gain_percent; - bool auto_gain; - enum v4l2_flash_led_mode flash_mode; - u32 vts_value; -}; - -struct tc_camera_module_wb_config { - u32 temperature; - u32 preset_id; - bool auto_wb; -}; - -struct tc_camera_module_af_config { - u32 abs_pos; - u32 rel_pos; -}; - -struct tc_camera_module_ext_ctrl { - /* public */ - u32 id; - u32 value; - __u32 reserved2[1]; -}; - -struct tc_camera_module_ext_ctrls { - /* public */ - u32 count; - struct tc_camera_module_ext_ctrl *ctrls; -}; - -/* - * start_streaming: (mandatory) will be called when sensor should be - * put into streaming mode right after the base config has been - * written to the sensor. After a successful call of this function - * the sensor should start delivering frame data. - * - * stop_streaming: (mandatory) will be called when sensor should stop - * delivering data. After a successful call of this function the - * sensor should not deliver any more frame data. - * - * check_camera_id: (optional) will be called when the sensor is - * powered on. If prtcided should check the sensor ID/version - * required by the custom driver. Register access should be - * possible when this function is invoked. - * - * s_ctrl: (mandatory) will be called at the successful end of - * tc_camera_module_s_ctrl with the ctrl_id as argument. - * - * priv: (optional) for private data used by the custom driver. - */ -struct tc_camera_module_custom_config { - int (*check_camera_id)(struct tc_camera_module *cam_mod); - int (*s_ctrl)(struct tc_camera_module *cam_mod, u32 ctrl_id); - int (*g_ctrl)(struct tc_camera_module *cam_mod, u32 ctrl_id); - int (*g_timings)(struct tc_camera_module *cam_mod, - struct tc_camera_module_timings *timings); - int (*s_vts)(struct tc_camera_module *cam_mod, - u32 vts); - int (*s_ext_ctrls)(struct tc_camera_module *cam_mod, - struct tc_camera_module_ext_ctrls *ctrls); - int (*set_flip)( - struct tc_camera_module *cam_mod, - struct tc_camera_module_reg reglist[], - int len); - int (*init_common)(struct tc_camera_module *cam_mod); - int (*read_otp)(struct tc_camera_module *cam_mod); - int (*enable_stream)(struct tc_camera_module *cam_mod, bool enable); - int (*s_power)(struct tc_camera_module *cam_mod, bool enable); - struct tc_camera_module_config *configs; - u32 num_configs; - u32 power_up_delays_ms[3]; - unsigned short exposure_valid_frame[2]; - void *priv; -}; - -struct tc_camera_module_otp_work { - struct work_struct work; - struct workqueue_struct *wq; - void *cam_mod; -}; - -struct tc_camera_module { - /* public */ - struct v4l2_subdev sd; - struct v4l2_mbus_framefmt frm_fmt; - struct v4l2_subdev_frame_interval frm_intrvl; - struct tc_camera_module_exp_config exp_config; - struct tc_camera_module_wb_config wb_config; - struct tc_camera_module_af_config af_config; - struct tc_camera_module_custom_config custom; - enum tc_camera_module_state state; - enum tc_camera_module_state state_before_suspend; - struct tc_camera_module_config *active_config; - struct tc_camera_module_otp_work otp_work; - u32 ctrl_updt; - u32 vts_cur; - u32 vts_min; - bool auto_adjust_fps; - bool update_config; - bool frm_fmt_valid; - bool frm_intrvl_valid; - bool hflip; - bool vflip; - bool flip_flg; - u32 rotation; - void *pltfm_data; - bool inited; - struct mutex lock; -}; - -struct tc35x_priv { - struct regmap *regmap; - struct i2c_client *client; - struct device *dev; - struct gpio_desc *gpio_power; - struct gpio_desc *gpio_power18; - struct gpio_desc *gpio_power33; - struct gpio_desc *gpio_csi_ctl; - struct gpio_desc *gpio_reset; - struct gpio_desc *gpio_stanby; - struct gpio_desc *gpio_int; -}; - -#define tc_camera_module_pr_info(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_info(&(cam_mod)->sd, fmt, ## arg) -#define tc_camera_module_pr_debug(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_debug(&(cam_mod)->sd, fmt, ## arg) -#define tc_camera_module_pr_warn(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_warn(&(cam_mod)->sd, fmt, ## arg) -#define tc_camera_module_pr_err(cam_mod, fmt, arg...) \ - pltfrm_camera_module_pr_err(&(cam_mod)->sd, fmt, ## arg) - -int tc_camera_module_write8_reg( - struct tc_camera_module *cam_mod, - u16 reg, - u8 val); - -int tc_camera_module_write16_reg( - struct tc_camera_module *cam_mod, - u16 reg, - u16 val); - -int tc_camera_module_write32_reg( - struct tc_camera_module *cam_mod, - u16 reg, - u32 val); - -u8 tc_camera_module_read8_reg( - struct tc_camera_module *cam_mod, - u16 reg); - -u16 tc_camera_module_read16_reg( - struct tc_camera_module *cam_mod, - u16 reg); - -u32 tc_camera_module_read32_reg( - struct tc_camera_module *cam_mod, - u16 reg); - -int tc_camera_module_read_reg_table( - struct tc_camera_module *cam_mod, - u16 reg, - u32 *val); - -int tc_camera_module_write_reglist( - struct tc_camera_module *cam_mod, - const struct tc_camera_module_reg reglist[], - int len); - -int tc_camera_module_s_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int tc_camera_module_g_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format); - -int tc_camera_module_s_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int tc_camera_module_g_frame_interval( - struct v4l2_subdev *sd, - struct v4l2_subdev_frame_interval *interval); - -int tc_camera_module_s_stream( - struct v4l2_subdev *sd, - int enable); - -int tc_camera_module_s_power( - struct v4l2_subdev *sd, - int on); - -int tc_camera_module_g_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int tc_camera_module_s_ctrl( - struct v4l2_subdev *sd, - struct v4l2_control *ctrl); - -int tc_camera_module_s_ext_ctrls( - struct v4l2_subdev *sd, - struct v4l2_ext_controls *ctrls); - -int tc_camera_module_enum_frameintervals( - struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_interval_enum *fie); - -int tc_camera_module_init( - struct tc_camera_module *cam_mod, - struct tc_camera_module_custom_config *custom); - -void tc_camera_module_release( - struct tc_camera_module *cam_mod); - -long tc_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg); - -int tc_camera_module_get_flip_mirror( - struct tc_camera_module *cam_mod); -#endif diff --git a/include/linux/platform_data/rk_isp10_platform_camera_module.h b/include/linux/platform_data/rk_isp10_platform_camera_module.h deleted file mode 100644 index 41c6c03dd488..000000000000 --- a/include/linux/platform_data/rk_isp10_platform_camera_module.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - ************************************************************************* - * Rockchip driver for CIF ISP 1.0 - * (Based on Intel driver for sofiaxxx) - * - * Copyright (C) 2015 Intel Mobile Communications GmbH - * Copyright (C) 2016 Fuzhou Rockchip 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 as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - ************************************************************************* - */ - -#ifndef PLATFORM_CAMERA_MODULE_H -#define PLATFORM_CAMERA_MODULE_H -#include - -#define PLTFRM_CAMERA_MODULE_REG_CODE_MASK 0xff -#define PLTFRM_CAMERA_MODULE_REG_LEN_BIT 8 -#define PLTFRM_CAMERA_MODULE_REG_LEN_MASK (0x03 << PLTFRM_CAMERA_MODULE_REG_LEN_BIT) -#define PLTFRM_CAMERA_MODULE_REG_LEN(flag) \ - (((flag & PLTFRM_CAMERA_MODULE_REG_LEN_MASK) >> PLTFRM_CAMERA_MODULE_REG_LEN_BIT) + 1) - -#define PLTFRM_CAMERA_MODULE_DATA_LEN_BIT 10 -#define PLTFRM_CAMERA_MODULE_DATA_LEN_MASK (0x03 << PLTFRM_CAMERA_MODULE_DATA_LEN_BIT) -#define PLTFRM_CAMERA_MODULE_DATA_LEN(flag) \ - (((flag & PLTFRM_CAMERA_MODULE_DATA_LEN_MASK) >> PLTFRM_CAMERA_MODULE_DATA_LEN_BIT) + 1) - -#define PLTFRM_CAMERA_MODULE_WR_CONTINUE_MASK 0x1000 -#define PLTFRM_CAMERA_MODULE_WR_CONTINUE 0x0000 -#define PLTFRM_CAMERA_MODULE_WR_SINGLE 0x1000 - -#define PLTFRM_CAMERA_MODULE_RD_CONTINUE_MASK 0x2000 -#define PLTFRM_CAMERA_MODULE_RD_CONTINUE 0x2000 -#define PLTFRM_CAMERA_MODULE_RD_SINGLE 0x0000 - -#define PLTFRM_CAMERA_MODULE_REG1_TYPE_DATA1 0x000 -#define PLTFRM_CAMERA_MODULE_REG2_TYPE_DATA1 0x100 -#define PLTFRM_CAMERA_MODULE_REG1_TYPE_DATA2 0x400 -#define PLTFRM_CAMERA_MODULE_REG2_TYPE_DATA2 0x500 - -#define PLTFRM_CAMERA_MODULE_REG_TYPE_DATA PLTFRM_CAMERA_MODULE_REG2_TYPE_DATA1 -#define PLTFRM_CAMERA_MODULE_REG_TYPE_TIMEOUT 0x01 -#define PLTFRM_CAMERA_MODULE_REG_TYPE_DATA_SINGLE 0x1100 - -#define PLTFRM_CAMERA_MODULE_MIRROR_BIT 0 -#define PLTFRM_CAMERA_MODULE_FLIP_BIT 1 -#define PLTFRM_CAMERA_MODULE_IS_MIRROR(a) \ - ((a & PLTFRM_CAMERA_MODULE_MIRROR_BIT) == PLTFRM_CAMERA_MODULE_MIRROR_BIT) -#define PLTFRM_CAMERA_MODULE_IS_FLIP(a) \ - ((a & PLTFRM_CAMERA_MODULE_FLIP_BIT) == PLTFRM_CAMERA_MODULE_FLIP_BIT) - -extern const char *PLTFRM_CAMERA_MODULE_PIN_PD; -extern const char *PLTFRM_CAMERA_MODULE_PIN_PWR; -extern const char *PLTFRM_CAMERA_MODULE_PIN_FLASH; -extern const char *PLTFRM_CAMERA_MODULE_PIN_TORCH; -extern const char *PLTFRM_CAMERA_MODULE_PIN_RESET; -extern const char *PLTFRM_CAMERA_MODULE_PIN_VSYNC; - -enum pltfrm_camera_module_pin_state { - PLTFRM_CAMERA_MODULE_PIN_STATE_INACTIVE = 0, - PLTFRM_CAMERA_MODULE_PIN_STATE_ACTIVE = 1 -}; - -struct pltfrm_camera_module_reg { - u32 flag; - u16 reg; - u16 val; -}; - -struct pltfrm_camera_module_reg_table { - u32 reg_table_num_entries; - struct pltfrm_camera_module_reg *reg_table; -}; - -int pltfrm_camera_module_set_pm_state( - struct v4l2_subdev *sd, - int on); - -int pltfrm_camera_module_set_pin_state( - struct v4l2_subdev *sd, - const char *pin, - enum pltfrm_camera_module_pin_state state); - -int pltfrm_camera_module_get_pin_state( - struct v4l2_subdev *sd, - const char *pin); - -int pltfrm_camera_module_s_power( - struct v4l2_subdev *sd, - int on); - -int pltfrm_camera_module_patch_config( - struct v4l2_subdev *sd, - struct v4l2_mbus_framefmt *frm_fmt, - struct v4l2_subdev_frame_interval *frm_intrvl); - -struct v4l2_subdev *pltfrm_camera_module_get_af_ctrl( - struct v4l2_subdev *sd); - -struct v4l2_subdev *pltfrm_camera_module_get_fl_ctrl( - struct v4l2_subdev *sd); - -char *pltfrm_camera_module_get_flash_driver_name( - struct v4l2_subdev *sd); - -int pltfrm_camera_module_init( - struct v4l2_subdev *sd, - void **pldata); - -void pltfrm_camera_module_release( - struct v4l2_subdev *sd); - -int pltfrm_camera_module_read_reg(struct v4l2_subdev *sd, - u16 data_length, - u16 reg, - u32 *val); - -int pltfrm_superpix_camera_module_read_reg(struct v4l2_subdev *sd, - u16 data_length, - u8 reg, - u8 *val); - -int pltfrm_camera_module_write_reg(struct v4l2_subdev *sd, - u16 reg, u8 val); - -int pltfrm_camera_module_read_reg_ex(struct v4l2_subdev *sd, - u16 data_length, - u32 flag, - u16 reg, - u32 *val); - -int pltfrm_camera_module_write_reg_ex(struct v4l2_subdev *sd, - u32 flag, u16 reg, u16 val); - -int pltfrm_camera_module_write_reglist( - struct v4l2_subdev *sd, - const struct pltfrm_camera_module_reg reglist[], - int len); - -long pltfrm_camera_module_ioctl(struct v4l2_subdev *sd, - unsigned int cmd, - void *arg); - -const char *pltfrm_dev_string(struct v4l2_subdev *sd); - -int pltfrm_camera_module_get_flip_mirror( - struct v4l2_subdev *sd); - -int pltfrm_camera_module_pix_fmt2csi2_dt(int src_pix_fmt); - -#define pltfrm_camera_module_pr_debug(dev, fmt, arg...) \ - pr_debug("%s.%s: " fmt, \ - pltfrm_dev_string(dev), __func__, ## arg) -#define pltfrm_camera_module_pr_info(dev, fmt, arg...) \ - pr_info("%s.%s: " fmt, \ - pltfrm_dev_string(dev), __func__, ## arg) -#define pltfrm_camera_module_pr_warn(dev, fmt, arg...) \ - pr_warn("%s.%s WARN: " fmt, \ - pltfrm_dev_string(dev), __func__, ## arg) -#define pltfrm_camera_module_pr_err(dev, fmt, arg...) \ - pr_err("%s.%s(%d) ERR: " fmt, \ - pltfrm_dev_string(dev), __func__, __LINE__, \ - ## arg) - -#endif