blob: fda59db1a1bc98e88e2642180cb5de00d173310e [file] [log] [blame]
/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include "msm_sensor.h"
#define SENSOR_NAME "s5k3l1yx"
#define PLATFORM_DRIVER_NAME "msm_camera_s5k3l1yx"
DEFINE_MUTEX(s5k3l1yx_mut);
static struct msm_sensor_ctrl_t s5k3l1yx_s_ctrl;
static struct msm_camera_i2c_reg_conf s5k3l1yx_start_settings[] = {
{0x0100, 0x01},
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_stop_settings[] = {
{0x0100, 0x00},
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_groupon_settings[] = {
{0x104, 0x01},
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_groupoff_settings[] = {
{0x104, 0x00},
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_snap_settings[] = {
{0x0501, 0x00}, /* compression_algorithim_L(1d) */
{0x0112, 0x0A}, /* CCP_data_format_H */
{0x0113, 0x0A}, /* CCP_data_format_L raw8=0808 ,DCPM10 -->8= 0A08 */
{0x0306, 0x00}, /* pll_multiplier */
{0x0307, 0xA5}, /* pll_multiplier */
{0x0202, 0x09}, /* coarse_integration_time */
{0x0203, 0x32}, /* coarse_integration_time */
{0x0340, 0x0B}, /* frame_length_lines */
{0x0341, 0xEC}, /* frame_length_lines */
{0x0342, 0x14}, /* line_length_pck */
{0x0343, 0xD8}, /* line_length_pck */
{0x0344, 0x00}, /* x_addr_start */
{0x0345, 0x08}, /* x_addr_start */
{0x0346, 0x00}, /* y_addr_start */
{0x0347, 0x00}, /* y_addr_start */
{0x0348, 0x0F}, /* x_addr_end */
{0x0349, 0xA7}, /* x_addr_end */
{0x034A, 0x0B}, /* y_addr_end */
{0x034B, 0xC7}, /* y_addr_end */
{0x034C, 0x0F}, /* x_output_size */
{0x034D, 0xA0}, /* x_output_size */
{0x034E, 0x0B}, /* y_output_size */
{0x034F, 0xC8}, /* y_output_size */
{0x0380, 0x00}, /* x_even_inc */
{0x0381, 0x01}, /* x_even_inc */
{0x0382, 0x00}, /* x_odd_inc */
{0x0383, 0x01}, /* x_odd_inc */
{0x0384, 0x00}, /* y_even_inc */
{0x0385, 0x01}, /* y_even_inc */
{0x0386, 0x00}, /* y_odd_inc */
{0x0387, 0x01}, /* y_odd_inc */
{0x0900, 0x00}, /* binning_mode */
{0x0901, 0x22}, /* binning_type */
{0x0902, 0x01}, /* binning_weighting */
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_prev_settings[] = {
{0x0501, 0x00}, /* compression_algorithim_L(1d) */
{0x0112, 0x0A}, /* CCP_data_format_H */
{0x0113, 0x0A}, /* CCP_data_format_L raw8=0808 ,DCPM10 -->8= 0A08 */
{0x0306, 0x00}, /* pll_multiplier */
{0x0307, 0xA5}, /* pll_multiplier */
{0x0202, 0x06}, /* coarse_integration_time */
{0x0203, 0x00}, /* coarse_integration_time */
{0x0340, 0x09}, /* frame_length_lines */
{0x0341, 0x6C}, /* frame_length_lines */
{0x0342, 0x11}, /* line_length_pck */
{0x0343, 0x80}, /* line_length_pck */
{0x0344, 0x00}, /* x_addr_start */
{0x0345, 0x18}, /* x_addr_start */
{0x0346, 0x00}, /* y_addr_start */
{0x0347, 0x00}, /* y_addr_start */
{0x0348, 0x0F}, /* x_addr_end */
{0x0349, 0x97}, /* x_addr_end */
{0x034A, 0x0B}, /* y_addr_end */
{0x034B, 0xC7}, /* y_addr_end */
{0x034C, 0x07}, /* x_output_size */
{0x034D, 0xC0}, /* x_output_size */
{0x034E, 0x05}, /* y_output_size */
{0x034F, 0xE4}, /* y_output_size */
{0x0380, 0x00}, /* x_even_inc */
{0x0381, 0x01}, /* x_even_inc */
{0x0382, 0x00}, /* x_odd_inc */
{0x0383, 0x03}, /* x_odd_inc */
{0x0384, 0x00}, /* y_even_inc */
{0x0385, 0x01}, /* y_even_inc */
{0x0386, 0x00}, /* y_odd_inc */
{0x0387, 0x03}, /* y_odd_inc */
{0x0900, 0x01}, /* binning_mode */
{0x0901, 0x22}, /* binning_type */
{0x0902, 0x01}, /* binning_weighting */
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_video_60fps_settings[] = {
{0x0501, 0x00}, /* compression_algorithim_L(1d) */
{0x0112, 0x0A}, /* CCP_data_format_H */
{0x0113, 0x0A}, /* CCP_data_format_L raw8=0808 ,DCPM10 -->8= 0A08 */
{0x0306, 0x00}, /* pll_multiplier */
{0x0307, 0xA5}, /* pll_multiplier */
{0x0202, 0x03}, /* coarse_integration_time */
{0x0203, 0xD8}, /* coarse_integration_time */
{0x0340, 0x03}, /* frame_length_lines */
{0x0341, 0xE0}, /* frame_length_lines */
{0x0342, 0x14}, /* line_length_pck */
{0x0343, 0xD8}, /* line_length_pck */
{0x0344, 0x01}, /* x_addr_start */
{0x0345, 0x20}, /* x_addr_start */
{0x0346, 0x02}, /* y_addr_start */
{0x0347, 0x24}, /* y_addr_start */
{0x0348, 0x0E}, /* x_addr_end */
{0x0349, 0xA0}, /* x_addr_end */
{0x034A, 0x09}, /* y_addr_end */
{0x034B, 0xA4}, /* y_addr_end */
{0x034C, 0x03}, /* x_output_size */
{0x034D, 0x60}, /* x_output_size */
{0x034E, 0x01}, /* y_output_size */
{0x034F, 0xE0}, /* y_output_size */
{0x0380, 0x00}, /* x_even_inc */
{0x0381, 0x01}, /* x_even_inc */
{0x0382, 0x00}, /* x_odd_inc */
{0x0383, 0x07}, /* x_odd_inc */
{0x0384, 0x00}, /* y_even_inc */
{0x0385, 0x01}, /* y_even_inc */
{0x0386, 0x00}, /* y_odd_inc */
{0x0387, 0x07}, /* y_odd_inc */
{0x0900, 0x01}, /* binning_mode */
{0x0901, 0x44}, /* binning_type */
{0x0902, 0x01}, /* binning_weighting */
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_video_90fps_settings[] = {
{0x0501, 0x00}, /* compression_algorithim_L(1d) */
{0x0112, 0x0A}, /* CCP_data_format_H */
{0x0113, 0x0A}, /* CCP_data_format_L raw8=0808 ,DCPM10 -->8= 0A08 */
{0x0306, 0x00}, /* pll_multiplier */
{0x0307, 0xA5}, /* pll_multiplier */
{0x0202, 0x02}, /* coarse_integration_time */
{0x0203, 0x90}, /* coarse_integration_time */
{0x0340, 0x02}, /* frame_length_lines */
{0x0341, 0x98}, /* frame_length_lines */
{0x0342, 0x14}, /* line_length_pck */
{0x0343, 0xD8}, /* line_length_pck */
{0x0344, 0x01}, /* x_addr_start */
{0x0345, 0x20}, /* x_addr_start */
{0x0346, 0x02}, /* y_addr_start */
{0x0347, 0x24}, /* y_addr_start */
{0x0348, 0x0E}, /* x_addr_end */
{0x0349, 0xA0}, /* x_addr_end */
{0x034A, 0x09}, /* y_addr_end */
{0x034B, 0xA4}, /* y_addr_end */
{0x034C, 0x03}, /* x_output_size */
{0x034D, 0x60}, /* x_output_size */
{0x034E, 0x01}, /* y_output_size */
{0x034F, 0xE0}, /* y_output_size */
{0x0380, 0x00}, /* x_even_inc */
{0x0381, 0x01}, /* x_even_inc */
{0x0382, 0x00}, /* x_odd_inc */
{0x0383, 0x07}, /* x_odd_inc */
{0x0384, 0x00}, /* y_even_inc */
{0x0385, 0x01}, /* y_even_inc */
{0x0386, 0x00}, /* y_odd_inc */
{0x0387, 0x07}, /* y_odd_inc */
{0x0900, 0x01}, /* binning_mode */
{0x0901, 0x44}, /* binning_type */
{0x0902, 0x01}, /* binning_weighting */
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_video_120fps_settings[] = {
{0x0501, 0x00}, /* compression_algorithim_L(1d) */
{0x0112, 0x0A}, /* CCP_data_format_H */
{0x0113, 0x0A}, /* CCP_data_format_L raw8=0808 ,DCPM10 -->8= 0A08 */
{0x0306, 0x00}, /* pll_multiplier */
{0x0307, 0xA5}, /* pll_multiplier */
{0x0202, 0x01}, /* coarse_integration_time */
{0x0203, 0xFA}, /* coarse_integration_time */
{0x0340, 0x02}, /* frame_length_lines */
{0x0341, 0x02}, /* frame_length_lines */
{0x0342, 0x14}, /* line_length_pck */
{0x0343, 0xD8}, /* line_length_pck */
{0x0344, 0x01}, /* x_addr_start */
{0x0345, 0x20}, /* x_addr_start */
{0x0346, 0x02}, /* y_addr_start */
{0x0347, 0x24}, /* y_addr_start */
{0x0348, 0x0E}, /* x_addr_end */
{0x0349, 0xA0}, /* x_addr_end */
{0x034A, 0x09}, /* y_addr_end */
{0x034B, 0xA4}, /* y_addr_end */
{0x034C, 0x03}, /* x_output_size */
{0x034D, 0x60}, /* x_output_size */
{0x034E, 0x01}, /* y_output_size */
{0x034F, 0xE0}, /* y_output_size */
{0x0380, 0x00}, /* x_even_inc */
{0x0381, 0x01}, /* x_even_inc */
{0x0382, 0x00}, /* x_odd_inc */
{0x0383, 0x07}, /* x_odd_inc */
{0x0384, 0x00}, /* y_even_inc */
{0x0385, 0x01}, /* y_even_inc */
{0x0386, 0x00}, /* y_odd_inc */
{0x0387, 0x07}, /* y_odd_inc */
{0x0900, 0x01}, /* binning_mode */
{0x0901, 0x44}, /* binning_type */
{0x0902, 0x01}, /* binning_weighting */
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_dpcm_settings[] = {
{0x0501, 0x01}, /* compression_algorithim_L(1d) */
{0x0112, 0x0A}, /* CCP_data_format_H */
{0x0113, 0x08}, /* CCP_data_format_L raw8=0808 ,DCPM10 -->8= 0A08 */
{0x0306, 0x00}, /* pll_multiplier */
{0x0307, 0xA0}, /* pll_multiplier */
{0x0202, 0x09}, /* coarse_integration_time */
{0x0203, 0x32}, /* coarse_integration_time */
{0x0340, 0x0B}, /* frame_length_lines */
{0x0341, 0xEC}, /* frame_length_lines */
{0x0342, 0x11}, /* line_length_pck */
{0x0343, 0x80}, /* line_length_pck */
{0x0344, 0x00}, /* x_addr_start */
{0x0345, 0x08}, /* x_addr_start */
{0x0346, 0x00}, /* y_addr_start */
{0x0347, 0x00}, /* y_addr_start */
{0x0348, 0x0F}, /* x_addr_end */
{0x0349, 0xA7}, /* x_addr_end */
{0x034A, 0x0B}, /* y_addr_end */
{0x034B, 0xC7}, /* y_addr_end */
{0x034C, 0x0F}, /* x_output_size */
{0x034D, 0xA0}, /* x_output_size */
{0x034E, 0x0B}, /* y_output_size */
{0x034F, 0xC8}, /* y_output_size */
{0x0380, 0x00}, /* x_even_inc */
{0x0381, 0x01}, /* x_even_inc */
{0x0382, 0x00}, /* x_odd_inc */
{0x0383, 0x01}, /* x_odd_inc */
{0x0384, 0x00}, /* y_even_inc */
{0x0385, 0x01}, /* y_even_inc */
{0x0386, 0x00}, /* y_odd_inc */
{0x0387, 0x01}, /* y_odd_inc */
{0x0900, 0x00}, /* binning_mode */
{0x0901, 0x22}, /* binning_type */
{0x0902, 0x01}, /* binning_weighting */
};
static struct msm_camera_i2c_reg_conf s5k3l1yx_recommend_settings[] = {
{0x0100, 0x00},
{0x0103, 0x01}, /* software_reset */
{0x0104, 0x00}, /* grouped_parameter_hold */
{0x0114, 0x03}, /* CSI_lane_mode, 4 lane setting */
{0x0120, 0x00}, /* gain_mode, global analogue gain*/
{0x0121, 0x00}, /* exposure_mode, global exposure */
{0x0136, 0x18}, /* Extclk_frequency_mhz */
{0x0137, 0x00}, /* Extclk_frequency_mhz */
{0x0200, 0x08}, /* fine_integration_time */
{0x0201, 0x88}, /* fine_integration_time */
{0x0204, 0x00}, /* analogue_gain_code_global */
{0x0205, 0x20}, /* analogue_gain_code_global */
{0x020E, 0x01}, /* digital_gain_greenR */
{0x020F, 0x00}, /* digital_gain_greenR */
{0x0210, 0x01}, /* digital_gain_red */
{0x0211, 0x00}, /* digital_gain_red */
{0x0212, 0x01}, /* digital_gain_blue */
{0x0213, 0x00}, /* digital_gain_blue */
{0x0214, 0x01}, /* digital_gain_greenB */
{0x0215, 0x00}, /* digital_gain_greenB */
{0x0300, 0x00}, /* vt_pix_clk_div */
{0x0301, 0x02}, /* vt_pix_clk_div */
{0x0302, 0x00}, /* vt_sys_clk_div */
{0x0303, 0x01}, /* vt_sys_clk_div */
{0x0304, 0x00}, /* pre_pll_clk_div */
{0x0305, 0x06}, /* pre_pll_clk_div */
{0x0308, 0x00}, /* op_pix_clk_div */
{0x0309, 0x02}, /* op_pix_clk_div */
{0x030A, 0x00}, /* op_sys_clk_div */
{0x030B, 0x01}, /* op_sys_clk_div */
{0x0800, 0x00}, /* tclk_post for D-PHY control */
{0x0801, 0x00}, /* ths_prepare for D-PHY control */
{0x0802, 0x00}, /* ths_zero_min for D-PHY control */
{0x0803, 0x00}, /* ths_trail for D-PHY control */
{0x0804, 0x00}, /* tclk_trail_min for D-PHY control */
{0x0805, 0x00}, /* tclk_prepare for D-PHY control */
{0x0806, 0x00}, /* tclk_zero_zero for D-PHY control */
{0x0807, 0x00}, /* tlpx for D-PHY control */
{0x0820, 0x02}, /* requested_link_bit_rate_mbps */
{0x0821, 0x94}, /* requested_link_bit_rate_mbps */
{0x0822, 0x00}, /* requested_link_bit_rate_mbps */
{0x0823, 0x00}, /* requested_link_bit_rate_mbps */
{0x3000, 0x0A},
{0x3001, 0xF7},
{0x3002, 0x0A},
{0x3003, 0xF7},
{0x3004, 0x08},
{0x3005, 0xF8},
{0x3006, 0x5B},
{0x3007, 0x73},
{0x3008, 0x49},
{0x3009, 0x0C},
{0x300A, 0xF8},
{0x300B, 0x4E},
{0x300C, 0x64},
{0x300D, 0x5C},
{0x300E, 0x71},
{0x300F, 0x0C},
{0x3010, 0x6A},
{0x3011, 0x14},
{0x3012, 0x14},
{0x3013, 0x0C},
{0x3014, 0x24},
{0x3015, 0x4F},
{0x3016, 0x86},
{0x3017, 0x0E},
{0x3018, 0x2C},
{0x3019, 0x30},
{0x301A, 0x31},
{0x301B, 0x32},
{0x301C, 0xFF},
{0x301D, 0x33},
{0x301E, 0x5C},
{0x301F, 0xFA},
{0x3020, 0x36},
{0x3021, 0x46},
{0x3022, 0x92},
{0x3023, 0xF5},
{0x3024, 0x6E},
{0x3025, 0x19},
{0x3026, 0x32},
{0x3027, 0x4B},
{0x3028, 0x04},
{0x3029, 0x50},
{0x302A, 0x0C},
{0x302B, 0x04},
{0x302C, 0xEF},
{0x302D, 0xC1},
{0x302E, 0x74},
{0x302F, 0x40},
{0x3030, 0x00},
{0x3031, 0x00},
{0x3032, 0x00},
{0x3033, 0x00},
{0x3034, 0x0F},
{0x3035, 0x01},
{0x3036, 0x00},
{0x3037, 0x00},
{0x3038, 0x88},
{0x3039, 0x98},
{0x303A, 0x1F},
{0x303B, 0x01},
{0x303C, 0x00},
{0x303D, 0x03},
{0x303E, 0x2F},
{0x303F, 0x09},
{0x3040, 0xFF},
{0x3041, 0x22},
{0x3042, 0x03},
{0x3043, 0x03},
{0x3044, 0x20},
{0x3045, 0x10},
{0x3046, 0x10},
{0x3047, 0x08},
{0x3048, 0x10},
{0x3049, 0x01},
{0x304A, 0x00},
{0x304B, 0x80},
{0x304C, 0x80},
{0x304D, 0x00},
{0x304E, 0x00},
{0x304F, 0x00},
{0x3051, 0x09},
{0x3052, 0xC4},
{0x305A, 0xE0},
{0x323D, 0x04},
{0x323E, 0x38},
{0x3305, 0xDD},
{0x3050, 0x01},
{0x3202, 0x01},
{0x3203, 0x01},
{0x3204, 0x01},
{0x3205, 0x01},
{0x3206, 0x01},
{0x3207, 0x01},
{0x320A, 0x05},
{0x320B, 0x20},
{0x3235, 0xB7},
{0x324C, 0x04},
{0x324A, 0x07},
{0x3902, 0x01},
{0x3915, 0x70},
{0x3916, 0x80},
{0x3A00, 0x01},
{0x3A06, 0x03},
{0x3B29, 0x01},
{0x3C11, 0x08},
{0x3C12, 0x7B},
{0x3C13, 0xC0},
{0x3C14, 0x70},
{0x3C15, 0x80},
{0x3C20, 0x04},
{0x3C23, 0x03},
{0x3C24, 0x00},
{0x3C50, 0x72},
{0x3C51, 0x85},
{0x3C53, 0x40},
{0x3C55, 0xA0},
{0x3D00, 0x00},
{0x3D01, 0x00},
{0x3D11, 0x01},
{0x3486, 0x05},
{0x3B35, 0x06},
{0x3A05, 0x01},
{0x3A07, 0x2B},
{0x3A09, 0x01},
{0x3940, 0xFF},
{0x3300, 0x00},
{0x3900, 0xFF},
{0x3914, 0x08},
{0x3A01, 0x0F},
{0x3A02, 0xA0},
{0x3A03, 0x0B},
{0x3A04, 0xC8},
{0x3701, 0x00},
{0x3702, 0x00},
{0x3703, 0x00},
{0x3704, 0x00},
{0x0101, 0x00}, /* image_orientation, mirror & flip off*/
{0x0105, 0x01}, /* mask_corrupted_frames */
{0x0110, 0x00}, /* CSI-2_channel_identifier */
{0x3942, 0x01}, /* [0] 1:mipi, 0:pvi */
{0x0B00, 0x00},
};
static struct v4l2_subdev_info s5k3l1yx_subdev_info[] = {
{
.code = V4L2_MBUS_FMT_SBGGR10_1X10,
.colorspace = V4L2_COLORSPACE_JPEG,
.fmt = 1,
.order = 0,
},
/* more can be supported, to be added later */
};
static struct msm_camera_i2c_conf_array s5k3l1yx_init_conf[] = {
{&s5k3l1yx_recommend_settings[0],
ARRAY_SIZE(s5k3l1yx_recommend_settings), 0, MSM_CAMERA_I2C_BYTE_DATA}
};
static struct msm_camera_i2c_conf_array s5k3l1yx_confs[] = {
{&s5k3l1yx_snap_settings[0],
ARRAY_SIZE(s5k3l1yx_snap_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
{&s5k3l1yx_prev_settings[0],
ARRAY_SIZE(s5k3l1yx_prev_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
{&s5k3l1yx_video_60fps_settings[0],
ARRAY_SIZE(s5k3l1yx_video_60fps_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
{&s5k3l1yx_video_90fps_settings[0],
ARRAY_SIZE(s5k3l1yx_video_90fps_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
{&s5k3l1yx_video_120fps_settings[0],
ARRAY_SIZE(s5k3l1yx_video_120fps_settings), 0,
MSM_CAMERA_I2C_BYTE_DATA},
{&s5k3l1yx_dpcm_settings[0],
ARRAY_SIZE(s5k3l1yx_dpcm_settings), 0, MSM_CAMERA_I2C_BYTE_DATA},
};
static struct msm_sensor_output_info_t s5k3l1yx_dimensions[] = {
/* 20 fps snapshot */
{
.x_output = 4000,
.y_output = 3016,
.line_length_pclk = 5336,
.frame_length_lines = 3052,
.vt_pixel_clk = 330000000,
.op_pixel_clk = 320000000,
.binning_factor = 1,
},
/* 30 fps preview */
{
.x_output = 1984,
.y_output = 1508,
.line_length_pclk = 4480,
.frame_length_lines = 2412,
.vt_pixel_clk = 330000000,
.op_pixel_clk = 320000000,
.binning_factor = 1,
},
/* 60 fps video */
{
.x_output = 864,
.y_output = 480,
.line_length_pclk = 5336,
.frame_length_lines = 992,
.vt_pixel_clk = 330000000,
.op_pixel_clk = 320000000,
.binning_factor = 1,
},
/* 90 fps video */
{
.x_output = 864,
.y_output = 480,
.line_length_pclk = 5336,
.frame_length_lines = 664,
.vt_pixel_clk = 330000000,
.op_pixel_clk = 320000000,
.binning_factor = 1,
},
/* 120 fps video */
{
.x_output = 864,
.y_output = 480,
.line_length_pclk = 5336,
.frame_length_lines = 514,
.vt_pixel_clk = 330000000,
.op_pixel_clk = 320000000,
.binning_factor = 1,
},
/* 24 fps snapshot */
{
.x_output = 4000,
.y_output = 3016,
.line_length_pclk = 4480,
.frame_length_lines = 3052,
.vt_pixel_clk = 330000000,
.op_pixel_clk = 320000000,
.binning_factor = 1,
},
};
static struct msm_sensor_output_reg_addr_t s5k3l1yx_reg_addr = {
.x_output = 0x34C,
.y_output = 0x34E,
.line_length_pclk = 0x342,
.frame_length_lines = 0x340,
};
static enum msm_camera_vreg_name_t s5k3l1yx_veg_seq[] = {
CAM_VDIG,
CAM_VANA,
CAM_VIO,
CAM_VAF,
};
static struct msm_sensor_id_info_t s5k3l1yx_id_info = {
.sensor_id_reg_addr = 0x0,
.sensor_id = 0x3121,
};
static struct msm_sensor_exp_gain_info_t s5k3l1yx_exp_gain_info = {
.coarse_int_time_addr = 0x202,
.global_gain_addr = 0x204,
.vert_offset = 8,
};
static const struct i2c_device_id s5k3l1yx_i2c_id[] = {
{SENSOR_NAME, (kernel_ulong_t)&s5k3l1yx_s_ctrl},
{ }
};
static struct i2c_driver s5k3l1yx_i2c_driver = {
.id_table = s5k3l1yx_i2c_id,
.probe = msm_sensor_i2c_probe,
.driver = {
.name = SENSOR_NAME,
},
};
static struct msm_camera_i2c_client s5k3l1yx_sensor_i2c_client = {
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
};
static const struct of_device_id s5k3l1yx_dt_match[] = {
{.compatible = "qcom,s5k3l1yx", .data = &s5k3l1yx_s_ctrl},
{}
};
MODULE_DEVICE_TABLE(of, s5k3l1yx_dt_match);
static struct platform_driver s5k3l1yx_platform_driver = {
.driver = {
.name = "qcom,s5k3l1yx",
.owner = THIS_MODULE,
.of_match_table = s5k3l1yx_dt_match,
},
};
static int32_t s5k3l1yx_platform_probe(struct platform_device *pdev)
{
int32_t rc = 0;
const struct of_device_id *match;
match = of_match_device(s5k3l1yx_dt_match, &pdev->dev);
rc = msm_sensor_platform_probe(pdev, match->data);
return rc;
}
static int __init msm_sensor_init_module(void)
{
int32_t rc = 0;
rc = platform_driver_probe(&s5k3l1yx_platform_driver,
s5k3l1yx_platform_probe);
if (!rc)
return rc;
return i2c_add_driver(&s5k3l1yx_i2c_driver);
}
static void __exit msm_sensor_exit_module(void)
{
if (s5k3l1yx_s_ctrl.pdev) {
msm_sensor_free_sensor_data(&s5k3l1yx_s_ctrl);
platform_driver_unregister(&s5k3l1yx_platform_driver);
} else
i2c_del_driver(&s5k3l1yx_i2c_driver);
return;
}
static struct v4l2_subdev_core_ops s5k3l1yx_subdev_core_ops = {
.ioctl = msm_sensor_subdev_ioctl,
.s_power = msm_sensor_power,
};
static struct v4l2_subdev_video_ops s5k3l1yx_subdev_video_ops = {
.enum_mbus_fmt = msm_sensor_v4l2_enum_fmt,
};
static struct v4l2_subdev_ops s5k3l1yx_subdev_ops = {
.core = &s5k3l1yx_subdev_core_ops,
.video = &s5k3l1yx_subdev_video_ops,
};
static struct msm_sensor_fn_t s5k3l1yx_func_tbl = {
.sensor_start_stream = msm_sensor_start_stream,
.sensor_stop_stream = msm_sensor_stop_stream,
.sensor_group_hold_on = msm_sensor_group_hold_on,
.sensor_group_hold_off = msm_sensor_group_hold_off,
.sensor_set_fps = msm_sensor_set_fps,
.sensor_write_exp_gain = msm_sensor_write_exp_gain1,
.sensor_write_snapshot_exp_gain = msm_sensor_write_exp_gain1,
.sensor_setting = msm_sensor_setting,
.sensor_set_sensor_mode = msm_sensor_set_sensor_mode,
.sensor_mode_init = msm_sensor_mode_init,
.sensor_get_output_info = msm_sensor_get_output_info,
.sensor_config = msm_sensor_config,
.sensor_power_up = msm_sensor_power_up,
.sensor_power_down = msm_sensor_power_down,
.sensor_adjust_frame_lines = msm_sensor_adjust_frame_lines1,
.sensor_get_csi_params = msm_sensor_get_csi_params,
};
static struct msm_sensor_reg_t s5k3l1yx_regs = {
.default_data_type = MSM_CAMERA_I2C_BYTE_DATA,
.start_stream_conf = s5k3l1yx_start_settings,
.start_stream_conf_size = ARRAY_SIZE(s5k3l1yx_start_settings),
.stop_stream_conf = s5k3l1yx_stop_settings,
.stop_stream_conf_size = ARRAY_SIZE(s5k3l1yx_stop_settings),
.group_hold_on_conf = s5k3l1yx_groupon_settings,
.group_hold_on_conf_size = ARRAY_SIZE(s5k3l1yx_groupon_settings),
.group_hold_off_conf = s5k3l1yx_groupoff_settings,
.group_hold_off_conf_size =
ARRAY_SIZE(s5k3l1yx_groupoff_settings),
.init_settings = &s5k3l1yx_init_conf[0],
.init_size = ARRAY_SIZE(s5k3l1yx_init_conf),
.mode_settings = &s5k3l1yx_confs[0],
.output_settings = &s5k3l1yx_dimensions[0],
.num_conf = ARRAY_SIZE(s5k3l1yx_confs),
};
static struct msm_sensor_ctrl_t s5k3l1yx_s_ctrl = {
.msm_sensor_reg = &s5k3l1yx_regs,
.sensor_i2c_client = &s5k3l1yx_sensor_i2c_client,
.sensor_i2c_addr = 0x6E,
.vreg_seq = s5k3l1yx_veg_seq,
.num_vreg_seq = ARRAY_SIZE(s5k3l1yx_veg_seq),
.sensor_output_reg_addr = &s5k3l1yx_reg_addr,
.sensor_id_info = &s5k3l1yx_id_info,
.sensor_exp_gain_info = &s5k3l1yx_exp_gain_info,
.cam_mode = MSM_SENSOR_MODE_INVALID,
.msm_sensor_mutex = &s5k3l1yx_mut,
.sensor_i2c_driver = &s5k3l1yx_i2c_driver,
.sensor_v4l2_subdev_info = s5k3l1yx_subdev_info,
.sensor_v4l2_subdev_info_size = ARRAY_SIZE(s5k3l1yx_subdev_info),
.sensor_v4l2_subdev_ops = &s5k3l1yx_subdev_ops,
.func_tbl = &s5k3l1yx_func_tbl,
.clk_rate = MSM_SENSOR_MCLK_24HZ,
};
module_init(msm_sensor_init_module);
module_exit(msm_sensor_exit_module);
MODULE_DESCRIPTION("Samsung 12MP Bayer sensor driver");
MODULE_LICENSE("GPL v2");