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

Commit 8d0c29c1 authored by Ravi Kishore Tanuku's avatar Ravi Kishore Tanuku Committed by Gerrit - the friendly Code Review server
Browse files

msm: camera: Free power setting pointer during shutdown



Free power up and power down setting pointers during
power down of sensor modules. Also, add check to avoid
memory allocation in multiple calls.

Change-Id: I469453af060fb832e1b6e286fdb3c2954f6c9fe4
Signed-off-by: default avatarRavi Kishore Tanuku <rktanuku@codeaurora.org>
parent 57d5499b
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -603,7 +603,11 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,

void cam_actuator_shutdown(struct cam_actuator_ctrl_t *a_ctrl)
{
	int rc;
	int rc = 0;
	struct cam_actuator_soc_private  *soc_private =
		(struct cam_actuator_soc_private *)a_ctrl->soc_info.soc_private;
	struct cam_sensor_power_ctrl_t *power_info =
		&soc_private->power_info;

	if (a_ctrl->cam_act_state == CAM_ACTUATOR_INIT)
		return;
@@ -612,6 +616,7 @@ void cam_actuator_shutdown(struct cam_actuator_ctrl_t *a_ctrl)
		rc = cam_actuator_power_down(a_ctrl);
		if (rc < 0)
			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) {
@@ -622,6 +627,12 @@ void cam_actuator_shutdown(struct cam_actuator_ctrl_t *a_ctrl)
		a_ctrl->bridge_intf.link_hdl = -1;
		a_ctrl->bridge_intf.session_hdl = -1;
	}

	kfree(power_info->power_setting);
	kfree(power_info->power_down_setting);
	power_info->power_setting = NULL;
	power_info->power_down_setting = NULL;

	a_ctrl->cam_act_state = CAM_ACTUATOR_INIT;
}

+11 −1
Original line number Diff line number Diff line
@@ -636,7 +636,11 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)

void cam_ois_shutdown(struct cam_ois_ctrl_t *o_ctrl)
{
	int rc;
	int rc = 0;
	struct cam_ois_soc_private  *soc_private =
		(struct cam_ois_soc_private *)o_ctrl->soc_info.soc_private;
	struct cam_sensor_power_ctrl_t *power_info =
		&soc_private->power_info;

	if (o_ctrl->cam_ois_state == CAM_OIS_INIT)
		return;
@@ -645,6 +649,7 @@ void cam_ois_shutdown(struct cam_ois_ctrl_t *o_ctrl)
		rc = cam_ois_power_down(o_ctrl);
		if (rc < 0)
			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) {
@@ -656,6 +661,11 @@ void cam_ois_shutdown(struct cam_ois_ctrl_t *o_ctrl)
		o_ctrl->bridge_intf.session_hdl = -1;
	}

	kfree(power_info->power_setting);
	kfree(power_info->power_down_setting);
	power_info->power_setting = NULL;
	power_info->power_down_setting = NULL;

	o_ctrl->cam_ois_state = CAM_OIS_INIT;
}

+19 −15
Original line number Diff line number Diff line
@@ -698,14 +698,17 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
	}

	power_info->power_setting_size = 0;
	if (power_info->power_setting == NULL) {
		power_info->power_setting =
			(struct cam_sensor_power_setting *)
			kzalloc(sizeof(struct cam_sensor_power_setting) *
				MAX_POWER_CONFIG, GFP_KERNEL);
		if (!power_info->power_setting)
			return -ENOMEM;
	}

	power_info->power_down_setting_size = 0;
	if (power_info->power_down_setting == NULL) {
		power_info->power_down_setting =
			(struct cam_sensor_power_setting *)
			kzalloc(sizeof(struct cam_sensor_power_setting) *
@@ -714,6 +717,7 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
			rc = -ENOMEM;
			goto free_power_settings;
		}
	}

	while (tot_size < cmd_length) {
		if (cmm_hdr->cmd_type ==
@@ -1553,7 +1557,7 @@ int cam_sensor_core_power_up(struct cam_sensor_power_ctrl_t *ctrl,
		if (ret)
			CAM_ERR(CAM_SENSOR, "cannot set pin to suspend state");
		cam_res_mgr_shared_pinctrl_select_state(false);
		pinctrl_put(ctrl->pinctrl_info.pinctrl);
		devm_pinctrl_put(ctrl->pinctrl_info.pinctrl);
		cam_res_mgr_shared_pinctrl_put();
	}

@@ -1766,7 +1770,7 @@ int msm_camera_power_down(struct cam_sensor_power_ctrl_t *ctrl,
			CAM_ERR(CAM_SENSOR, "cannot set pin to suspend state");

		cam_res_mgr_shared_pinctrl_select_state(false);
		pinctrl_put(ctrl->pinctrl_info.pinctrl);
		devm_pinctrl_put(ctrl->pinctrl_info.pinctrl);
		cam_res_mgr_shared_pinctrl_put();
	}