mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-15 01:01:56 -04:00
camera: distinguish sensor version
distinguish sensor version by read sensor version address, and apply extra setting when sensor version is 0x02. Change-Id: I9d0fc6eee906e345d4ee3a67ed26c8ed3517f8e7 Signed-off-by: liuwang2 <liuwang2@lenovo.com> Reviewed-on: https://gerrit.mot.com/2282942 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Shuo Wang <wangsh18@motorola.com> Reviewed-by: <huqian4@motorola.com> Reviewed-by: Long Cheng <chengl1@motorola.com> Reviewed-by: Zhichao Chen <chenzc2@motorola.com> Submit-Approved: Jira Key
This commit is contained in:
parent
38d2fda173
commit
e7b5115b4d
1 changed files with 117 additions and 0 deletions
|
|
@ -6,6 +6,27 @@
|
|||
#include "cam_sensor_io.h"
|
||||
#include "cam_sensor_i2c.h"
|
||||
|
||||
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
|
||||
|
||||
#define SPECIAL_SENSOR_ID 0x5041
|
||||
#define SPECIAL_SENSOR_ADDR_ID 0x300B
|
||||
#define SPECIAL_SENSOR_ADDR_VERSION 0x900E
|
||||
#define SPECIAL_SENSOR_IIC_ADDR 0x10
|
||||
|
||||
static uint32_t s_r900e_val = 0;
|
||||
|
||||
struct cam_sensor_i2c_reg_array special_on_write_settings = {0x0100, 0x01, 0x05, 0xFF};
|
||||
struct cam_sensor_i2c_reg_array special_off_write_settings = {0x0100, 0x00, 0x00, 0xFF};
|
||||
|
||||
struct cam_sensor_i2c_reg_array special_streamon_write_settings[] =
|
||||
{
|
||||
{0x7278, 0x00, 0x00, 0xFF},
|
||||
{0x727a, 0x01, 0x00, 0xFF},
|
||||
{0x7280, 0x07, 0x00, 0xFF},
|
||||
{0x0100, 0x01, 0x00, 0xFF}
|
||||
};
|
||||
#endif
|
||||
|
||||
int32_t camera_io_dev_poll(struct camera_io_master *io_master_info,
|
||||
uint32_t addr, uint16_t data, uint32_t data_mask,
|
||||
enum camera_sensor_i2c_type addr_type,
|
||||
|
|
@ -68,14 +89,25 @@ int32_t camera_io_dev_read(struct camera_io_master *io_master_info,
|
|||
enum camera_sensor_i2c_type addr_type,
|
||||
enum camera_sensor_i2c_type data_type)
|
||||
{
|
||||
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
|
||||
int32_t retval = 0;
|
||||
uint32_t r900e = 0;
|
||||
struct cam_sensor_i2c_reg_setting write_setting = {0};
|
||||
#endif
|
||||
|
||||
if (!io_master_info) {
|
||||
CAM_ERR(CAM_SENSOR, "Invalid Args");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (io_master_info->master_type == CCI_MASTER) {
|
||||
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
|
||||
retval = cam_cci_i2c_read(io_master_info->cci_client,
|
||||
addr, data, addr_type, data_type);
|
||||
#else
|
||||
return cam_cci_i2c_read(io_master_info->cci_client,
|
||||
addr, data, addr_type, data_type);
|
||||
#endif
|
||||
} else if (io_master_info->master_type == I2C_MASTER) {
|
||||
return cam_qup_i2c_read(io_master_info->client,
|
||||
addr, data, addr_type, data_type);
|
||||
|
|
@ -87,7 +119,50 @@ int32_t camera_io_dev_read(struct camera_io_master *io_master_info,
|
|||
io_master_info->master_type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
|
||||
if (retval == 0 &&
|
||||
data != NULL &&
|
||||
*data == SPECIAL_SENSOR_ID &&
|
||||
addr == SPECIAL_SENSOR_ADDR_ID &&
|
||||
io_master_info->cci_client != NULL &&
|
||||
io_master_info->cci_client->cci_i2c_master == 0 &&
|
||||
io_master_info->cci_client->sid == SPECIAL_SENSOR_IIC_ADDR)
|
||||
{
|
||||
write_setting.size = 1;
|
||||
write_setting.addr_type = CAMERA_SENSOR_I2C_TYPE_WORD;
|
||||
write_setting.data_type = CAMERA_SENSOR_I2C_TYPE_BYTE;
|
||||
write_setting.delay = 21;
|
||||
write_setting.read_buff = NULL;
|
||||
write_setting.read_buff_len = 0;
|
||||
write_setting.reg_setting = &special_on_write_settings;
|
||||
retval = cam_cci_i2c_write_table(io_master_info, &write_setting);
|
||||
|
||||
retval = cam_cci_i2c_read(io_master_info->cci_client,
|
||||
SPECIAL_SENSOR_ADDR_VERSION,
|
||||
&r900e,
|
||||
CAMERA_SENSOR_I2C_TYPE_WORD,
|
||||
CAMERA_SENSOR_I2C_TYPE_BYTE);
|
||||
|
||||
CAM_INFO(CAM_SENSOR, "retval = %d, r900e = %d", retval, r900e);
|
||||
|
||||
if(retval == 0)
|
||||
s_r900e_val = r900e;
|
||||
|
||||
write_setting.size = 1;
|
||||
write_setting.addr_type = CAMERA_SENSOR_I2C_TYPE_WORD;
|
||||
write_setting.data_type = CAMERA_SENSOR_I2C_TYPE_BYTE;
|
||||
write_setting.delay = 0;
|
||||
write_setting.read_buff = NULL;
|
||||
write_setting.read_buff_len = 0;
|
||||
write_setting.reg_setting = &special_off_write_settings;
|
||||
retval = cam_cci_i2c_write_table(io_master_info, &write_setting);
|
||||
}
|
||||
|
||||
return retval;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int32_t camera_io_dev_read_seq(struct camera_io_master *io_master_info,
|
||||
|
|
@ -143,6 +218,10 @@ int32_t camera_io_dev_ois_read_seq(struct camera_io_master *io_master_info,
|
|||
int32_t camera_io_dev_write(struct camera_io_master *io_master_info,
|
||||
struct cam_sensor_i2c_reg_setting *write_setting)
|
||||
{
|
||||
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
|
||||
int32_t retval = 0;
|
||||
#endif
|
||||
|
||||
if (!write_setting || !io_master_info) {
|
||||
CAM_ERR(CAM_SENSOR,
|
||||
"Input parameters not valid ws: %pK ioinfo: %pK",
|
||||
|
|
@ -155,6 +234,44 @@ int32_t camera_io_dev_write(struct camera_io_master *io_master_info,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
|
||||
if (io_master_info->cci_client != NULL &&
|
||||
io_master_info->cci_client->sid== SPECIAL_SENSOR_IIC_ADDR &&
|
||||
io_master_info->cci_client->cci_device == 1 &&
|
||||
io_master_info->cci_client->cci_i2c_master == 0 &&
|
||||
write_setting->reg_setting->reg_addr == 0x0100 &&
|
||||
write_setting->reg_setting->reg_data == 0x01)
|
||||
{
|
||||
CAM_INFO(CAM_SENSOR, "Detect stream on setting, r900e = %d", s_r900e_val);
|
||||
|
||||
if (s_r900e_val == 0x02)
|
||||
{
|
||||
write_setting->reg_setting->reg_addr = special_streamon_write_settings[0].reg_addr;
|
||||
write_setting->reg_setting->reg_data = special_streamon_write_settings[0].reg_data;
|
||||
write_setting->reg_setting->delay = special_streamon_write_settings[0].delay;
|
||||
write_setting->reg_setting->data_mask = special_streamon_write_settings[0].data_mask;
|
||||
retval = cam_cci_i2c_write_table(io_master_info, write_setting);
|
||||
|
||||
write_setting->reg_setting->reg_addr = special_streamon_write_settings[1].reg_addr;
|
||||
write_setting->reg_setting->reg_data = special_streamon_write_settings[1].reg_data;
|
||||
write_setting->reg_setting->delay = special_streamon_write_settings[1].delay;
|
||||
write_setting->reg_setting->data_mask = special_streamon_write_settings[1].data_mask;
|
||||
retval = cam_cci_i2c_write_table(io_master_info, write_setting);
|
||||
|
||||
write_setting->reg_setting->reg_addr = special_streamon_write_settings[2].reg_addr;
|
||||
write_setting->reg_setting->reg_data = special_streamon_write_settings[2].reg_data;
|
||||
write_setting->reg_setting->delay = special_streamon_write_settings[2].delay;
|
||||
write_setting->reg_setting->data_mask = special_streamon_write_settings[2].data_mask;
|
||||
retval = cam_cci_i2c_write_table(io_master_info, write_setting);
|
||||
|
||||
write_setting->reg_setting->reg_addr = special_streamon_write_settings[3].reg_addr;
|
||||
write_setting->reg_setting->reg_data = special_streamon_write_settings[3].reg_data;
|
||||
write_setting->reg_setting->delay = special_streamon_write_settings[3].delay;
|
||||
write_setting->reg_setting->data_mask = special_streamon_write_settings[3].data_mask;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (io_master_info->master_type == CCI_MASTER) {
|
||||
return cam_cci_i2c_write_table(io_master_info,
|
||||
write_setting);
|
||||
|
|
|
|||
Loading…
Reference in a new issue