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

Commit 44516500 authored by Camera Software Integration's avatar Camera Software Integration Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: isp: Notify CRM to pause SOF timer after flush" into camera-kernel.lnx.3.1

parents 1fc6c891 1a732aa4
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -2216,6 +2216,7 @@ static int __cam_isp_ctx_flush_req_in_top_state(
	struct cam_hw_stop_args           stop_args;
	struct cam_hw_reset_args          reset_args;
	struct cam_hw_cmd_args            hw_cmd_args;
	struct cam_req_mgr_timer_notify    timer;

	ctx_isp = (struct cam_isp_context *) ctx->ctx_priv;

@@ -2261,6 +2262,14 @@ static int __cam_isp_ctx_flush_req_in_top_state(

		CAM_INFO(CAM_ISP, "Stop HW complete. Reset HW next.");
		CAM_DBG(CAM_ISP, "Flush wait and active lists");

		if (ctx->ctx_crm_intf && ctx->ctx_crm_intf->notify_timer) {
			timer.link_hdl = ctx->link_hdl;
			timer.dev_hdl = ctx->dev_hdl;
			timer.state = false;
			ctx->ctx_crm_intf->notify_timer(&timer);
		}

		spin_lock_bh(&ctx->lock);
		if (!list_empty(&ctx->wait_req_list))
			rc = __cam_isp_ctx_flush_req(ctx, &ctx->wait_req_list,
+55 −0
Original line number Diff line number Diff line
@@ -1744,6 +1744,10 @@ static void __cam_req_mgr_sof_freeze(struct timer_list *timer_data)
	}

	link = (struct cam_req_mgr_core_link *)timer->parent;

	if (link->watchdog->pause_timer)
		return;

	task = cam_req_mgr_workq_get_task(link->workq);
	if (!task) {
		CAM_ERR(CAM_CRM, "No empty task");
@@ -2643,6 +2647,52 @@ static int cam_req_mgr_cb_notify_err(
	return rc;
}

/**
 * cam_req_mgr_cb_notify_timer()
 *
 * @brief      : Notify SOF timer to pause after flush
 * @timer_data : contains information about frame_id, link etc.
 *
 * @return  : 0 on success
 *
 */
static int cam_req_mgr_cb_notify_timer(
	struct cam_req_mgr_timer_notify *timer_data)
{
	int                              rc = 0;
	struct cam_req_mgr_core_link    *link = NULL;

	if (!timer_data) {
		CAM_ERR(CAM_CRM, "timer data  is NULL");
		rc = -EINVAL;
		goto end;
	}

	link = (struct cam_req_mgr_core_link *)
		cam_get_device_priv(timer_data->link_hdl);
	if (!link) {
		CAM_DBG(CAM_CRM, "link ptr NULL %x", timer_data->link_hdl);
		rc = -EINVAL;
		goto end;
	}

	spin_lock_bh(&link->link_state_spin_lock);
	if (link->state < CAM_CRM_LINK_STATE_READY) {
		CAM_WARN(CAM_CRM, "invalid link state:%d", link->state);
		spin_unlock_bh(&link->link_state_spin_lock);
		rc = -EPERM;
		goto end;
	}
	spin_unlock_bh(&link->link_state_spin_lock);


	if (!timer_data->state)
		link->watchdog->pause_timer = true;

end:
	return rc;
}

/**
 * cam_req_mgr_cb_notify_trigger()
 *
@@ -2682,6 +2732,10 @@ static int cam_req_mgr_cb_notify_trigger(
		rc = -EPERM;
		goto end;
	}

	if (link->watchdog->pause_timer)
		link->watchdog->pause_timer = false;

	crm_timer_reset(link->watchdog);
	spin_unlock_bh(&link->link_state_spin_lock);

@@ -2711,6 +2765,7 @@ static struct cam_req_mgr_crm_cb cam_req_mgr_ops = {
	.notify_trigger = cam_req_mgr_cb_notify_trigger,
	.notify_err     = cam_req_mgr_cb_notify_err,
	.add_req        = cam_req_mgr_cb_add_req,
	.notify_timer   = cam_req_mgr_cb_notify_timer,
};

/**
+16 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
struct cam_req_mgr_trigger_notify;
struct cam_req_mgr_error_notify;
struct cam_req_mgr_add_request;
struct cam_req_mgr_timer_notify;
struct cam_req_mgr_device_info;
struct cam_req_mgr_core_dev_link_setup;
struct cam_req_mgr_apply_request;
@@ -35,6 +36,7 @@ typedef int (*cam_req_mgr_notify_trigger)(
	struct cam_req_mgr_trigger_notify *);
typedef int (*cam_req_mgr_notify_err)(struct cam_req_mgr_error_notify *);
typedef int (*cam_req_mgr_add_req)(struct cam_req_mgr_add_request *);
typedef int (*cam_req_mgr_notify_timer)(struct cam_req_mgr_timer_notify *);

/**
 * @brief: cam req mgr to camera device drivers
@@ -64,6 +66,7 @@ struct cam_req_mgr_crm_cb {
	cam_req_mgr_notify_trigger  notify_trigger;
	cam_req_mgr_notify_err      notify_err;
	cam_req_mgr_add_req         add_req;
	cam_req_mgr_notify_timer    notify_timer;
};

/**
@@ -206,6 +209,19 @@ struct cam_req_mgr_trigger_notify {
	uint64_t sof_timestamp_val;
};

/**
 * struct cam_req_mgr_timer_notify
 * @link_hdl : link identifier
 * @dev_hdl  : device handle which has sent this req id
 * @frame_id : frame id for internal tracking
 * @state    : timer state i.e ON or OFF
 */
struct cam_req_mgr_timer_notify {
	int32_t  link_hdl;
	int32_t  dev_hdl;
	bool     state;
};

/**
 * struct cam_req_mgr_error_notify
 * @link_hdl : link identifier
+7 −5
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 */

#ifndef _CAM_REQ_MGR_TIMER_H_
@@ -16,12 +16,14 @@
 * @sys_timer    : system timer variable
 * @parent       : priv data - link pointer
 * @timer_cb     : callback func which will be called when timeout expires
 * @pause_timer  : flag to pause SOF timer
 */
struct cam_req_mgr_timer {
	int32_t            expires;
	struct timer_list  sys_timer;
	void               *parent;
	void               (*timer_cb)(struct timer_list *timer_data);
	bool                pause_timer;
};

/**