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

Commit 0c9bd286 authored by shiwgupt's avatar shiwgupt
Browse files

msm: camera: flash: Add support for flash stream off



- Apply flash off register settings at the time of stream off.
- Add support to send fire command in initial config command.

CRs-Fixed: 2998772
Change-Id: I8897a68e637d283afd98e386b6a7b1fbaaf63c61
Signed-off-by: default avatarshiwgupt <shiwgupt@codeaurora.org>
parent 5ab24d0f
Loading
Loading
Loading
Loading
+80 −3
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
 */

#include <linux/module.h>
@@ -505,6 +505,8 @@ static int cam_flash_ops(struct cam_flash_ctrl *flash_ctrl,

int cam_flash_off(struct cam_flash_ctrl *flash_ctrl)
{
	int rc = 0;

	if (!flash_ctrl) {
		CAM_ERR(CAM_FLASH, "Flash control Null");
		return -EINVAL;
@@ -515,6 +517,17 @@ int cam_flash_off(struct cam_flash_ctrl *flash_ctrl)
			(enum led_brightness)LED_SWITCH_OFF);

	flash_ctrl->flash_state = CAM_FLASH_STATE_START;

	if ((flash_ctrl->i2c_data.streamoff_settings.is_settings_valid) &&
		(flash_ctrl->i2c_data.streamoff_settings.request_id == 0)) {
		flash_ctrl->apply_streamoff = true;
		rc = cam_flash_i2c_apply_setting(flash_ctrl, 0);
		if (rc < 0) {
			CAM_ERR(CAM_SENSOR,
			"cannot apply streamoff settings");
		}
	}

	return 0;
}

@@ -702,7 +715,24 @@ int cam_flash_i2c_apply_setting(struct cam_flash_ctrl *fctrl,

	if (req_id == 0) {
		/* NonRealTime Init settings*/
		if (fctrl->i2c_data.init_settings.is_settings_valid == true) {
		if (fctrl->apply_streamoff == true) {
			fctrl->apply_streamoff = false;
			i2c_set = &fctrl->i2c_data.streamoff_settings;
			list_for_each_entry(i2c_list,
				&(i2c_set->list_head),
				list) {
				rc = cam_sensor_util_i2c_apply_setting
					(&(fctrl->io_master_info), i2c_list);
				if (rc) {
					CAM_ERR(CAM_FLASH,
					"Failed to apply stream on settings: %d",
					rc);
					return rc;
				}
				break;
			}
		} else if (fctrl->i2c_data.init_settings.is_settings_valid ==
			true) {
			list_for_each_entry(i2c_list,
				&(fctrl->i2c_data.init_settings.list_head),
				list) {
@@ -1180,7 +1210,8 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)

		rc = fctrl->func_tbl.apply_setting(fctrl, 0);
		if (rc) {
			CAM_ERR(CAM_FLASH, "cannot apply settings rc = %d", rc);
			CAM_ERR(CAM_FLASH,
			"cannot apply settings rc = %d", rc);
			return rc;
		}

@@ -1212,6 +1243,18 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
			"Failed in parsing i2c packets");
			return rc;
		}
		if ((fctrl->flash_state == CAM_FLASH_STATE_ACQUIRE) ||
			(fctrl->flash_state == CAM_FLASH_STATE_CONFIG)) {
			fctrl->flash_state = CAM_FLASH_STATE_CONFIG;
			rc = fctrl->func_tbl.apply_setting(fctrl, 1);
			if (rc) {
				CAM_ERR(CAM_FLASH,
				"cannot apply fire settings rc = %d",
				rc);
				return rc;
			}
			return rc;
		}
		break;
	}
	case CAM_FLASH_PACKET_OPCODE_NON_REALTIME_SET_OPS: {
@@ -1265,6 +1308,29 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
			csl_packet->header.request_id);
		goto update_req_mgr;
	}
	case CAM_FLASH_PACKET_OPCODE_STREAM_OFF: {
		if (fctrl->streamoff_count > 0)
			return rc;

		CAM_DBG(CAM_FLASH, "Received Stream off Settings");
		i2c_data = &(fctrl->i2c_data);
		fctrl->streamoff_count = fctrl->streamoff_count + 1;
		i2c_reg_settings       = &i2c_data->streamoff_settings;
		i2c_reg_settings->request_id = 0;
		i2c_reg_settings->is_settings_valid = 1;
		offset = (uint32_t *)((uint8_t *)&csl_packet->payload +
			csl_packet->cmd_buf_offset);
		cmd_desc = (struct cam_cmd_buf_desc *)(offset);
		rc = cam_sensor_i2c_command_parser(&fctrl->io_master_info,
				i2c_reg_settings,
				cmd_desc, 1, NULL);
		if (rc) {
			CAM_ERR(CAM_FLASH,
			"Failed in parsing i2c Stream off packets");
			return rc;
		}
		break;
	}
	default:
		CAM_ERR(CAM_FLASH, "Wrong Opcode : %d",
			(csl_packet->header.op_code & 0xFFFFFF));
@@ -1805,6 +1871,16 @@ int cam_flash_release_dev(struct cam_flash_ctrl *fctrl)
{
	int rc = 0;

	if (fctrl->i2c_data.streamoff_settings.is_settings_valid == true) {
		fctrl->i2c_data.streamoff_settings.is_settings_valid = false;
		rc = delete_request(&fctrl->i2c_data.streamoff_settings);
		if (rc) {
			CAM_WARN(CAM_FLASH,
				"Failed to delete Stream off i2c_setting: %d",
				rc);
		}
	}

	if (fctrl->bridge_intf.device_hdl != 1) {
		rc = cam_destroy_device_hdl(fctrl->bridge_intf.device_hdl);
		if (rc)
@@ -1815,6 +1891,7 @@ int cam_flash_release_dev(struct cam_flash_ctrl *fctrl)
		fctrl->bridge_intf.link_hdl = -1;
		fctrl->bridge_intf.session_hdl = -1;
		fctrl->last_flush_req = 0;
		fctrl->streamoff_count = 0;
	}

	return rc;
+5 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
			flash_acq_dev.device_handle;
		fctrl->bridge_intf.session_hdl =
			flash_acq_dev.session_handle;
		fctrl->apply_streamoff = false;

		rc = copy_to_user(u64_to_user_ptr(cmd->handle),
			&flash_acq_dev,
@@ -123,6 +124,7 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
		if (fctrl->func_tbl.power_ops(fctrl, false))
			CAM_WARN(CAM_FLASH, "Power Down Failed");

		fctrl->streamoff_count = 0;
		fctrl->flash_state = CAM_FLASH_STATE_INIT;
		break;
	}
@@ -162,6 +164,7 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl,
			goto release_mutex;
		}

		fctrl->apply_streamoff = false;
		fctrl->flash_state = CAM_FLASH_STATE_START;
		break;
	}
@@ -490,6 +493,7 @@ static int32_t cam_flash_platform_probe(struct platform_device *pdev)

		INIT_LIST_HEAD(&(fctrl->i2c_data.init_settings.list_head));
		INIT_LIST_HEAD(&(fctrl->i2c_data.config_settings.list_head));
		INIT_LIST_HEAD(&(fctrl->i2c_data.streamoff_settings.list_head));
		for (i = 0; i < MAX_PER_FRAME_ARRAY; i++)
			INIT_LIST_HEAD(
				&(fctrl->i2c_data.per_frame[i].list_head));
@@ -592,6 +596,7 @@ static int32_t cam_flash_i2c_driver_probe(struct i2c_client *client,

	INIT_LIST_HEAD(&(fctrl->i2c_data.init_settings.list_head));
	INIT_LIST_HEAD(&(fctrl->i2c_data.config_settings.list_head));
	INIT_LIST_HEAD(&(fctrl->i2c_data.streamoff_settings.list_head));
	for (i = 0; i < MAX_PER_FRAME_ARRAY; i++)
		INIT_LIST_HEAD(&(fctrl->i2c_data.per_frame[i].list_head));

+5 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@
#define CAM_FLASH_PACKET_OPCODE_INIT                 0
#define CAM_FLASH_PACKET_OPCODE_SET_OPS              1
#define CAM_FLASH_PACKET_OPCODE_NON_REALTIME_SET_OPS 2
#define CAM_FLASH_PACKET_OPCODE_STREAM_OFF           3

struct cam_flash_ctrl;

@@ -182,6 +183,8 @@ struct cam_flash_func_tbl {
 * @io_master_info      : Information about the communication master
 * @i2c_data            : I2C register settings
 * @last_flush_req      : last request to flush
 * @streamoff_count     : Count to hold the number of times stream off called
 * @apply_streamoff     : variable to store when to apply stream off
 */
struct cam_flash_ctrl {
	char device_name[CAM_CTX_DEV_NAME_MAX_LENGTH];
@@ -210,6 +213,8 @@ struct cam_flash_ctrl {
	struct camera_io_master             io_master_info;
	struct i2c_data_settings            i2c_data;
	uint32_t                            last_flush_req;
	uint32_t                            streamoff_count;
	int32_t                             apply_streamoff;
};

int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg);