Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d85d2a2 authored by Jigarkumar Zala's avatar Jigarkumar Zala
Browse files

msm: camera: Move power up sensor submodules in acquire state



Move power up sequence for image sensor, ois and actuator while acquire
happens. This change will allow image sensor to stream on/off without
powering up/down.

Change-Id: Id58cdcc435c3e6b5b55949a6d38d9f8bf69d52d1
Signed-off-by: default avatarJigarkumar Zala <jzala@codeaurora.org>
parent e9012ff7
Loading
Loading
Loading
Loading
+23 −27
Original line number Original line Diff line number Diff line
@@ -74,6 +74,10 @@ static int32_t cam_actuator_power_up(struct cam_actuator_ctrl_t *a_ctrl)
	/* VREG needs some delay to power up */
	/* VREG needs some delay to power up */
	usleep_range(2000, 2050);
	usleep_range(2000, 2050);


	rc = camera_io_init(&a_ctrl->io_master_info);
	if (rc < 0)
		CAM_ERR(CAM_ACTUATOR, "cci_init failed: rc: %d", rc);

	return rc;
	return rc;
}
}


@@ -99,8 +103,11 @@ static int32_t cam_actuator_power_down(struct cam_actuator_ctrl_t *a_ctrl)
	if (rc < 0)
	if (rc < 0)
		CAM_ERR(CAM_ACTUATOR, "Disable Regulator Failed: %d", rc);
		CAM_ERR(CAM_ACTUATOR, "Disable Regulator Failed: %d", rc);


	camera_io_release(&a_ctrl->io_master_info);

	return rc;
	return rc;
}
}

static int32_t cam_actuator_i2c_modes_util(
static int32_t cam_actuator_i2c_modes_util(
	struct camera_io_master *io_master_info,
	struct camera_io_master *io_master_info,
	struct i2c_settings_list *i2c_list)
	struct i2c_settings_list *i2c_list)
@@ -410,17 +417,6 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
			return rc;
			return rc;
		}
		}


		rc = cam_actuator_power_up(a_ctrl);
		if (rc < 0) {
			CAM_ERR(CAM_ACTUATOR, " Actuator Power up failed");
			return rc;
		}
		rc = camera_io_init(&a_ctrl->io_master_info);
		if (rc < 0) {
			CAM_ERR(CAM_ACTUATOR, "cci_init failed");
			cam_actuator_power_down(a_ctrl);
			return rc;
		}
		rc = cam_actuator_apply_settings(a_ctrl,
		rc = cam_actuator_apply_settings(a_ctrl,
			&a_ctrl->i2c_data.init_settings);
			&a_ctrl->i2c_data.init_settings);
		if (rc < 0)
		if (rc < 0)
@@ -499,17 +495,12 @@ void cam_actuator_shutdown(struct cam_actuator_ctrl_t *a_ctrl)
	if (a_ctrl->cam_act_state == CAM_ACTUATOR_INIT)
	if (a_ctrl->cam_act_state == CAM_ACTUATOR_INIT)
		return;
		return;


	if (a_ctrl->cam_act_state == CAM_ACTUATOR_START) {
	if ((a_ctrl->cam_act_state == CAM_ACTUATOR_START) ||
		rc = camera_io_release(&a_ctrl->io_master_info);
		(a_ctrl->cam_act_state == CAM_ACTUATOR_ACQUIRE)) {
		if (rc < 0)
			CAM_ERR(CAM_ACTUATOR, "Failed in releasing CCI");
		rc = cam_actuator_power_down(a_ctrl);
		rc = cam_actuator_power_down(a_ctrl);
		if (rc < 0)
		if (rc < 0)
			CAM_ERR(CAM_ACTUATOR, "Actuator Power down failed");
			CAM_ERR(CAM_ACTUATOR, "Actuator Power down failed");
		a_ctrl->cam_act_state = CAM_ACTUATOR_ACQUIRE;
	}


	if (a_ctrl->cam_act_state == CAM_ACTUATOR_ACQUIRE) {
		rc = cam_destroy_device_hdl(a_ctrl->bridge_intf.device_hdl);
		rc = cam_destroy_device_hdl(a_ctrl->bridge_intf.device_hdl);
		if (rc < 0)
		if (rc < 0)
			CAM_ERR(CAM_ACTUATOR, "destroying  dhdl failed");
			CAM_ERR(CAM_ACTUATOR, "destroying  dhdl failed");
@@ -531,7 +522,7 @@ int32_t cam_actuator_driver_cmd(struct cam_actuator_ctrl_t *a_ctrl,
		return -EINVAL;
		return -EINVAL;
	}
	}


	pr_debug("Opcode to Actuator: %d", cmd->op_code);
	CAM_DBG(CAM_ACTUATOR, "Opcode to Actuator: %d", cmd->op_code);


	mutex_lock(&(a_ctrl->actuator_mutex));
	mutex_lock(&(a_ctrl->actuator_mutex));
	switch (cmd->op_code) {
	switch (cmd->op_code) {
@@ -572,6 +563,13 @@ int32_t cam_actuator_driver_cmd(struct cam_actuator_ctrl_t *a_ctrl,
			rc = -EFAULT;
			rc = -EFAULT;
			goto release_mutex;
			goto release_mutex;
		}
		}

		rc = cam_actuator_power_up(a_ctrl);
		if (rc < 0) {
			CAM_ERR(CAM_ACTUATOR, " Actuator Power up failed");
			goto release_mutex;
		}

		a_ctrl->cam_act_state = CAM_ACTUATOR_ACQUIRE;
		a_ctrl->cam_act_state = CAM_ACTUATOR_ACQUIRE;
	}
	}
		break;
		break;
@@ -584,6 +582,12 @@ int32_t cam_actuator_driver_cmd(struct cam_actuator_ctrl_t *a_ctrl,
			goto release_mutex;
			goto release_mutex;
		}
		}


		rc = cam_actuator_power_down(a_ctrl);
		if (rc < 0) {
			CAM_ERR(CAM_ACTUATOR, "Actuator Power down failed");
			goto release_mutex;
		}

		if (a_ctrl->bridge_intf.device_hdl == -1) {
		if (a_ctrl->bridge_intf.device_hdl == -1) {
			CAM_ERR(CAM_ACTUATOR, "link hdl: %d device hdl: %d",
			CAM_ERR(CAM_ACTUATOR, "link hdl: %d device hdl: %d",
				a_ctrl->bridge_intf.device_hdl,
				a_ctrl->bridge_intf.device_hdl,
@@ -635,14 +639,6 @@ int32_t cam_actuator_driver_cmd(struct cam_actuator_ctrl_t *a_ctrl,
			goto release_mutex;
			goto release_mutex;
		}
		}


		rc = camera_io_release(&a_ctrl->io_master_info);
		if (rc < 0)
			CAM_ERR(CAM_ACTUATOR, "Failed in releasing CCI");
		rc = cam_actuator_power_down(a_ctrl);
		if (rc < 0) {
			CAM_ERR(CAM_ACTUATOR, "Actuator Power down failed");
			goto release_mutex;
		}
		for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
		for (i = 0; i < MAX_PER_FRAME_ARRAY; i++) {
			i2c_set = &(a_ctrl->i2c_data.per_frame[i]);
			i2c_set = &(a_ctrl->i2c_data.per_frame[i]);


+21 −28
Original line number Original line Diff line number Diff line
@@ -117,6 +117,10 @@ static int cam_ois_power_up(struct cam_ois_ctrl_t *o_ctrl)
	/* VREG needs some delay to power up */
	/* VREG needs some delay to power up */
	usleep_range(2000, 2050);
	usleep_range(2000, 2050);


	rc = camera_io_init(&o_ctrl->io_master_info);
	if (rc)
		CAM_ERR(CAM_OIS, "cci_init failed: rc: %d", rc);

	return rc;
	return rc;
}
}


@@ -142,6 +146,8 @@ static int cam_ois_power_down(struct cam_ois_ctrl_t *o_ctrl)
	if (rc < 0)
	if (rc < 0)
		CAM_ERR(CAM_OIS, "Disable regualtor Failed %d", rc);
		CAM_ERR(CAM_OIS, "Disable regualtor Failed %d", rc);


	camera_io_release(&o_ctrl->io_master_info);

	return rc;
	return rc;
}
}


@@ -437,18 +443,6 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
			}
			}
		}
		}


		rc = cam_ois_power_up(o_ctrl);
		if (rc) {
			CAM_ERR(CAM_OIS, " OIS Power up failed");
			return rc;
		}

		rc = camera_io_init(&o_ctrl->io_master_info);
		if (rc) {
			CAM_ERR(CAM_OIS, "cci_init failed");
			goto pwr_dwn;
		}

		if (o_ctrl->ois_fw_flag) {
		if (o_ctrl->ois_fw_flag) {
			rc = cam_ois_fw_download(o_ctrl);
			rc = cam_ois_fw_download(o_ctrl);
			if (rc) {
			if (rc) {
@@ -526,17 +520,12 @@ void cam_ois_shutdown(struct cam_ois_ctrl_t *o_ctrl)
	if (o_ctrl->cam_ois_state == CAM_OIS_INIT)
	if (o_ctrl->cam_ois_state == CAM_OIS_INIT)
		return;
		return;


	if (o_ctrl->cam_ois_state == CAM_OIS_START) {
	if ((o_ctrl->cam_ois_state == CAM_OIS_START) ||
		rc = camera_io_release(&o_ctrl->io_master_info);
		(o_ctrl->cam_ois_state == CAM_OIS_ACQUIRE)) {
		if (rc < 0)
			CAM_ERR(CAM_OIS, "Failed in releasing CCI");
		rc = cam_ois_power_down(o_ctrl);
		rc = cam_ois_power_down(o_ctrl);
		if (rc < 0)
		if (rc < 0)
			CAM_ERR(CAM_OIS, "OIS Power down failed");
			CAM_ERR(CAM_OIS, "OIS Power down failed");
		o_ctrl->cam_ois_state = CAM_OIS_ACQUIRE;
	}


	if (o_ctrl->cam_ois_state == CAM_OIS_ACQUIRE) {
		rc = cam_destroy_device_hdl(o_ctrl->bridge_intf.device_hdl);
		rc = cam_destroy_device_hdl(o_ctrl->bridge_intf.device_hdl);
		if (rc < 0)
		if (rc < 0)
			CAM_ERR(CAM_OIS, "destroying the device hdl");
			CAM_ERR(CAM_OIS, "destroying the device hdl");
@@ -586,6 +575,13 @@ int cam_ois_driver_cmd(struct cam_ois_ctrl_t *o_ctrl, void *arg)
			CAM_ERR(CAM_OIS, "Failed to acquire dev");
			CAM_ERR(CAM_OIS, "Failed to acquire dev");
			goto release_mutex;
			goto release_mutex;
		}
		}

		rc = cam_ois_power_up(o_ctrl);
		if (rc) {
			CAM_ERR(CAM_OIS, " OIS Power up failed");
			goto release_mutex;
		}

		o_ctrl->cam_ois_state = CAM_OIS_ACQUIRE;
		o_ctrl->cam_ois_state = CAM_OIS_ACQUIRE;
		break;
		break;
	case CAM_START_DEV:
	case CAM_START_DEV:
@@ -614,6 +610,12 @@ int cam_ois_driver_cmd(struct cam_ois_ctrl_t *o_ctrl, void *arg)
			goto release_mutex;
			goto release_mutex;
		}
		}


		rc = cam_ois_power_down(o_ctrl);
		if (rc < 0) {
			CAM_ERR(CAM_OIS, "OIS Power down failed");
			goto release_mutex;
		}

		if (o_ctrl->bridge_intf.device_hdl == -1) {
		if (o_ctrl->bridge_intf.device_hdl == -1) {
			CAM_ERR(CAM_OIS, "link hdl: %d device hdl: %d",
			CAM_ERR(CAM_OIS, "link hdl: %d device hdl: %d",
				o_ctrl->bridge_intf.device_hdl,
				o_ctrl->bridge_intf.device_hdl,
@@ -636,15 +638,6 @@ int cam_ois_driver_cmd(struct cam_ois_ctrl_t *o_ctrl, void *arg)
			"Not in right state for stop : %d",
			"Not in right state for stop : %d",
			o_ctrl->cam_ois_state);
			o_ctrl->cam_ois_state);
		}
		}

		rc = camera_io_release(&o_ctrl->io_master_info);
		if (rc < 0)
			CAM_ERR(CAM_OIS, "Failed in releasing CCI");
		rc = cam_ois_power_down(o_ctrl);
		if (rc < 0) {
			CAM_ERR(CAM_OIS, "OIS Power down failed");
			goto release_mutex;
		}
		o_ctrl->cam_ois_state = CAM_OIS_ACQUIRE;
		o_ctrl->cam_ois_state = CAM_OIS_ACQUIRE;
		break;
		break;
	default:
	default:
+20 −24
Original line number Original line Diff line number Diff line
@@ -473,12 +473,9 @@ void cam_sensor_shutdown(struct cam_sensor_ctrl_t *s_ctrl)


	cam_sensor_release_resource(s_ctrl);
	cam_sensor_release_resource(s_ctrl);


	if (s_ctrl->sensor_state == CAM_SENSOR_START) {
	if ((s_ctrl->sensor_state == CAM_SENSOR_START) ||
		(s_ctrl->sensor_state == CAM_SENSOR_ACQUIRE)) {
		cam_sensor_power_down(s_ctrl);
		cam_sensor_power_down(s_ctrl);
		s_ctrl->sensor_state = CAM_SENSOR_ACQUIRE;
	}

	if (s_ctrl->sensor_state == CAM_SENSOR_ACQUIRE) {
		rc = cam_destroy_device_hdl(s_ctrl->bridge_intf.device_hdl);
		rc = cam_destroy_device_hdl(s_ctrl->bridge_intf.device_hdl);
		if (rc < 0)
		if (rc < 0)
			CAM_ERR(CAM_SENSOR, " failed destroying dhdl");
			CAM_ERR(CAM_SENSOR, " failed destroying dhdl");
@@ -686,6 +683,13 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
			rc = -EFAULT;
			rc = -EFAULT;
			goto release_mutex;
			goto release_mutex;
		}
		}

		rc = cam_sensor_power_up(s_ctrl);
		if (rc < 0) {
			CAM_ERR(CAM_SENSOR, "Sensor Power up failed");
			goto release_mutex;
		}

		s_ctrl->sensor_state = CAM_SENSOR_ACQUIRE;
		s_ctrl->sensor_state = CAM_SENSOR_ACQUIRE;
	}
	}
		break;
		break;
@@ -698,6 +702,12 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
			goto release_mutex;
			goto release_mutex;
		}
		}


		rc = cam_sensor_power_down(s_ctrl);
		if (rc < 0) {
			CAM_ERR(CAM_SENSOR, "Sensor Power Down failed");
			goto release_mutex;
		}

		cam_sensor_release_resource(s_ctrl);
		cam_sensor_release_resource(s_ctrl);
		if (s_ctrl->bridge_intf.device_hdl == -1) {
		if (s_ctrl->bridge_intf.device_hdl == -1) {
			CAM_ERR(CAM_SENSOR,
			CAM_ERR(CAM_SENSOR,
@@ -770,11 +780,6 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
				"cannot apply streamoff settings");
				"cannot apply streamoff settings");
			}
			}
		}
		}
		rc = cam_sensor_power_down(s_ctrl);
		if (rc < 0) {
			CAM_ERR(CAM_SENSOR, "Sensor Power Down failed");
			goto release_mutex;
		}
		s_ctrl->sensor_state = CAM_SENSOR_ACQUIRE;
		s_ctrl->sensor_state = CAM_SENSOR_ACQUIRE;
	}
	}
		break;
		break;
@@ -786,11 +791,7 @@ int32_t cam_sensor_driver_cmd(struct cam_sensor_ctrl_t *s_ctrl,
		}
		}
		if (s_ctrl->i2c_data.init_settings.is_settings_valid &&
		if (s_ctrl->i2c_data.init_settings.is_settings_valid &&
			(s_ctrl->i2c_data.init_settings.request_id == 0)) {
			(s_ctrl->i2c_data.init_settings.request_id == 0)) {
			rc = cam_sensor_power_up(s_ctrl);

			if (rc < 0) {
				CAM_ERR(CAM_SENSOR, "Sensor Power up failed");
				goto release_mutex;
			}
			rc = cam_sensor_apply_settings(s_ctrl, 0,
			rc = cam_sensor_apply_settings(s_ctrl, 0,
				CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG);
				CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG);
			if (rc < 0) {
			if (rc < 0) {
@@ -917,13 +918,9 @@ int cam_sensor_power_up(struct cam_sensor_ctrl_t *s_ctrl)
		return rc;
		return rc;
	}
	}


	if (s_ctrl->io_master_info.master_type == CCI_MASTER) {
	rc = camera_io_init(&(s_ctrl->io_master_info));
	rc = camera_io_init(&(s_ctrl->io_master_info));
		if (rc < 0) {
	if (rc < 0)
			CAM_ERR(CAM_SENSOR, "cci_init failed");
		CAM_ERR(CAM_SENSOR, "cci_init failed: rc: %d", rc);
			return -EINVAL;
		}
	}


	return rc;
	return rc;
}
}
@@ -952,7 +949,6 @@ int cam_sensor_power_down(struct cam_sensor_ctrl_t *s_ctrl)
		return rc;
		return rc;
	}
	}


	if (s_ctrl->io_master_info.master_type == CCI_MASTER)
	camera_io_release(&(s_ctrl->io_master_info));
	camera_io_release(&(s_ctrl->io_master_info));


	return rc;
	return rc;