int32_t mt9m114_msm_sensor_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { int rc = 0; struct msm_sensor_ctrl_t *s_ctrl; pr_err("%s %s_i2c_probe \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); s_ctrl->sensor_device_type = MSM_SENSOR_I2C_DEVICE; 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; #ifdef CONFIG_SENSOR_INFO msm_sensorinfo_set_front_sensor_id(s_ctrl->sensor_id_info->sensor_id); #else //do nothing here #endif if (!s_ctrl->wait_num_frames) s_ctrl->wait_num_frames = 1 * Q10; pr_err("%s %s probe succeeded\n", __func__, client->name); 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); s_ctrl->sensor_v4l2_subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; media_entity_init(&s_ctrl->sensor_v4l2_subdev.entity, 0, NULL, 0); s_ctrl->sensor_v4l2_subdev.entity.type = MEDIA_ENT_T_V4L2_SUBDEV; s_ctrl->sensor_v4l2_subdev.entity.group_id = SENSOR_DEV; s_ctrl->sensor_v4l2_subdev.entity.name = s_ctrl->sensor_v4l2_subdev.name; msm_sensor_register(&s_ctrl->sensor_v4l2_subdev); s_ctrl->sensor_v4l2_subdev.entity.revision = s_ctrl->sensor_v4l2_subdev.devnode->num; msm_sensor_enable_debugfs(s_ctrl); 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; }
int32_t msm_ov9740_sensor_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { int rc = 0; struct msm_sensor_ctrl_t *s_ctrl; pr_err("%s_i2c_probe called\n", client->name); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { pr_err("i2c_check_functionality failed\n"); 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 { rc = -EFAULT; return rc; } s_ctrl->sensordata = client->dev.platform_data; if (s_ctrl->sensordata == NULL) { pr_err("%s: NULL sensor data\n", __func__); return -EFAULT; } s_ctrl->reg_ptr = kzalloc(sizeof(struct regulator *) * s_ctrl->sensordata->sensor_platform_info->num_vreg, GFP_KERNEL); if (!s_ctrl->reg_ptr) { pr_err("%s: could not allocate mem for regulators\n", __func__); return -ENOMEM; } pr_err("%s: %d\n", __func__, __LINE__); s_ctrl->func_tbl->sensor_power_up(s_ctrl); #ifdef CONFIG_SENSOR_INFO msm_sensorinfo_set_front_sensor_id(s_ctrl->sensor_id_info->sensor_id); #else //do nothing here #endif rc = msm_sensor_match_id(s_ctrl); if (rc < 0) goto probe_fail; if (s_ctrl->sensor_eeprom_client != NULL) { struct msm_camera_eeprom_client *eeprom_client = s_ctrl->sensor_eeprom_client; if (eeprom_client->func_tbl.eeprom_init != NULL && eeprom_client->func_tbl.eeprom_release != NULL) { rc = eeprom_client->func_tbl.eeprom_init( eeprom_client, s_ctrl->sensor_i2c_client->client->adapter); if (rc < 0) goto probe_fail; rc = msm_camera_eeprom_read_tbl(eeprom_client, eeprom_client->read_tbl, eeprom_client->read_tbl_size); eeprom_client->func_tbl.eeprom_release(eeprom_client); 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_i2c_probe failed\n", client->name); power_down: if (rc > 0) rc = 0; s_ctrl->func_tbl->sensor_power_down(s_ctrl); s_ctrl->func_tbl->sensor_power_up(s_ctrl); if (s_ctrl->func_tbl->sensor_setting(s_ctrl, MSM_SENSOR_REG_INIT, 0) < 0) { pr_err("%s sensor_setting init failed\n",__func__); return rc; } if (s_ctrl->func_tbl->sensor_setting(s_ctrl, MSM_SENSOR_UPDATE_PERIODIC, 0) < 0) { pr_err("%s sensor_setting init failed\n",__func__); return rc; } msleep(10); s_ctrl->func_tbl->sensor_power_down(s_ctrl); return rc; }