OV8825_V4L2.C
module_init(msm_sensor_init_module);
msm_sensor_init_module -->
i2c_add_driver(&ov8825_i2c_driver);
&ov8825_i2c_driver -->
static struct i2c_driver ov8825_i2c_driver = {
.id_table = ov8825_i2c_id,
.probe = ov8825_sensor_i2c_probe,
.driver = {
.name = SENSOR_NAME,
},
};
.id_table = ov8825_i2c_id, -->
static const struct i2c_device_id ov8825_i2c_id[] = {
{SENSOR_NAME, (kernel_ulong_t)&ov8825_s_ctrl},
{ }
};
&ov8825_s_ctrl -->
static struct msm_sensor_ctrl_t ov8825_s_ctrl = {
.msm_sensor_reg = &ov8825_regs,
.sensor_i2c_client = &ov8825_sensor_i2c_client,
.sensor_i2c_addr = 0x6C,
.sensor_output_reg_addr = &ov8825_reg_addr,
.sensor_id_info = &ov8825_id_info,
.sensor_exp_gain_info = &ov8825_exp_gain_info,
.cam_mode = MSM_SENSOR_MODE_INVALID,
.csic_params = &ov8825_csi_params_array[0],
.msm_sensor_mutex = &ov8825_mut,
.sensor_i2c_driver = &ov8825_i2c_driver,
.sensor_v4l2_subdev_info = ov8825_subdev_info,
.sensor_v4l2_subdev_info_size = ARRAY_SIZE(ov8825_subdev_info),
.sensor_v4l2_subdev_ops = &ov8825_subdev_ops,
.func_tbl = &ov8825_func_tbl,
};
ov8825_sensor_i2c_probe, -->
int32_t ov8825_sensor_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
int32_t rc = 0;
//struct msm_sensor_ctrl_t *s_ctrl;
CDBG("\n in ov8825_sensor_i2c_probe\n");
rc = msm_sensor_i2c_probe(client, id);
if (client->dev.platform_data == NULL) {
pr_err("%s: NULL sensor data\n", __func__);
return -EFAULT;
}
//move the powerdown operation to sensor_power_down function
//s_ctrl = client->dev.platform_data;
//if (s_ctrl->sensordata->pmic_gpio_enable)
// lcd_camera_power_onoff(0);
return rc;
}
msm_sensor_i2c_probe(client, id); -->
Msm_sensor.c
int32_t msm_sensor_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
int rc = 0;
struct msm_sensor_ctrl_t *s_ctrl;
CDBG("%s %s_i2c_probe called\n", __func__, client->name);
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
pr_err("%s %s i2c_check_functionality failed\n",
__func__, client->name);
rc = -EFAULT;
return rc;
}
s_ctrl = (struct msm_sensor_ctrl_t *)(id->driver_data);
if (s_ctrl->sensor_i2c_client != NULL) {
s_ctrl->sensor_i2c_client->client = client;
if (s_ctrl->sensor_i2c_addr != 0)
s_ctrl->sensor_i2c_client->client->addr =
s_ctrl->sensor_i2c_addr;
} else {
pr_err("%s %s sensor_i2c_client NULL\n",
__func__, client->name);
rc = -EFAULT;
return rc;
}
s_ctrl->sensordata = client->dev.platform_data;
if (s_ctrl->sensordata == NULL) {
pr_err("%s %s NULL sensor data\n", __func__, client->name);
return -EFAULT;
}
rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
if (rc < 0) {
pr_err("%s %s power up failed\n", __func__, client->name);
return rc;
}
if (s_ctrl->func_tbl->sensor_match_id)
rc = s_ctrl->func_tbl->sensor_match_id(s_ctrl);
else
rc = msm_sensor_match_id(s_ctrl);
if (rc < 0)
goto probe_fail;
snprintf(s_ctrl->sensor_v4l2_subdev.name,
sizeof(s_ctrl->sensor_v4l2_subdev.name), "%s", id->name);
v4l2_i2c_subdev_init(&s_ctrl->sensor_v4l2_subdev, client,
s_ctrl->sensor_v4l2_subdev_ops);
msm_sensor_register(&s_ctrl->sensor_v4l2_subdev);
goto power_down;
probe_fail:
pr_err("%s %s_i2c_probe failed\n", __func__, client->name);
power_down:
if (rc > 0)
rc = 0;
s_ctrl->func_tbl->sensor_power_down(s_ctrl);
s_ctrl->sensor_state = MSM_SENSOR_POWER_DOWN;
return rc;
QC8225Q/OV8825 torch
最新推荐文章于 2018-09-12 11:31:00 发布