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

Commit c6db3362 authored by Mohammed Javid's avatar Mohammed Javid
Browse files

msm: ipa4: prevent power collapse until uC is loaded



For IPA 4.0 offline charge is not needed and add a condition to
not devote the clock until IPA uC is loaded.

Change-Id: Ic52d788518235daaa9b8ded024d93a6070f11f25
Acked-by: default avatarAshok Vuyyuru <avuyyuru@qti.qualcomm.com>
Signed-off-by: default avatarMohammed Javid <mjavid@codeaurora.org>
parent d8136467
Loading
Loading
Loading
Loading
+21 −7
Original line number Diff line number Diff line
@@ -4394,8 +4394,12 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p,
	/* Prevent consequent calls from trying to load the FW again. */
	if (ipa3_ctx->ipa_initialization_complete)
		return 0;

	IPADBG("active clients = %d\n",
			atomic_read(&ipa3_ctx->ipa3_active_clients.cnt));
	/* move proxy vote for modem on ipa3_post_init */
	IPA_ACTIVE_CLIENTS_INC_SPECIAL("PROXY_CLK_VOTE");
	if (ipa3_ctx->ipa_hw_type != IPA_HW_v4_0)
		ipa3_proxy_clk_vote();

	/*
	 * indication whether working in MHI config or non MHI config is given
@@ -4532,9 +4536,6 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p,

	ipa3_register_panic_hdlr();

	ipa3_ctx->q6_proxy_clk_vote_valid = true;
	ipa3_ctx->q6_proxy_clk_vote_cnt++;

	mutex_lock(&ipa3_ctx->lock);
	ipa3_ctx->ipa_initialization_complete = true;
	mutex_unlock(&ipa3_ctx->lock);
@@ -4551,6 +4552,7 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p,
	gsi_deregister_device(ipa3_ctx->gsi_dev_hdl, false);
fail_register_device:
	ipa3_destroy_flt_tbl_idrs();
	ipa3_proxy_clk_unvote();
	return result;
}

@@ -4860,6 +4862,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,
	int result = 0;
	int i;
	struct ipa3_rt_tbl_set *rset;
	struct ipa_active_client_logging_info log_info;

	IPADBG("IPA Driver initialization started\n");

@@ -5050,7 +5053,13 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,
	}

	mutex_init(&ipa3_ctx->ipa3_active_clients.mutex);
	/* move proxy vote for modem to ipa3_post_init() */

	IPA_ACTIVE_CLIENTS_PREP_SPECIAL(log_info, "PROXY_CLK_VOTE");
	ipa3_active_clients_log_inc(&log_info, false);
	ipa3_ctx->q6_proxy_clk_vote_valid = true;
	ipa3_ctx->q6_proxy_clk_vote_cnt = 1;

	/*Updating the proxy vote cnt 1 */
	atomic_set(&ipa3_ctx->ipa3_active_clients.cnt, 1);

	/* Create workqueues for power management */
@@ -5181,7 +5190,6 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,
	mutex_init(&ipa3_ctx->lock);
	mutex_init(&ipa3_ctx->q6_proxy_clk_vote_mutex);
	mutex_init(&ipa3_ctx->ipa_cne_evt_lock);
	ipa3_ctx->q6_proxy_clk_vote_cnt = 0;

	idr_init(&ipa3_ctx->ipa_idr);
	spin_lock_init(&ipa3_ctx->idr_lock);
@@ -5296,8 +5304,14 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,
	IPADBG("ipa cdev added successful. major:%d minor:%d\n",
			MAJOR(ipa3_ctx->dev_num),
			MINOR(ipa3_ctx->dev_num));
	/*
	 * for IPA 4.0 offline charge is not needed and we need to prevent
	 * power collapse until IPA uC is loaded.
	 */

	/* proxy vote for modem is added in ipa3_post_init() phase */
	IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
	if (ipa3_ctx->ipa_hw_type != IPA_HW_v4_0)
		ipa3_proxy_clk_unvote();
	return 0;

fail_cdev_add:
+2 −4
Original line number Diff line number Diff line
@@ -4168,9 +4168,8 @@ bool ipa3_is_client_handle_valid(u32 clnt_hdl)
 */
void ipa3_proxy_clk_unvote(void)
{
	if (!ipa3_is_ready())
	if (ipa3_ctx == NULL)
		return;

	mutex_lock(&ipa3_ctx->q6_proxy_clk_vote_mutex);
	if (ipa3_ctx->q6_proxy_clk_vote_valid) {
		IPA_ACTIVE_CLIENTS_DEC_SPECIAL("PROXY_CLK_VOTE");
@@ -4188,9 +4187,8 @@ void ipa3_proxy_clk_unvote(void)
 */
void ipa3_proxy_clk_vote(void)
{
	if (!ipa3_is_ready())
	if (ipa3_ctx == NULL)
		return;

	mutex_lock(&ipa3_ctx->q6_proxy_clk_vote_mutex);
	if (!ipa3_ctx->q6_proxy_clk_vote_valid ||
		(ipa3_ctx->q6_proxy_clk_vote_cnt > 0)) {