Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}