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

Commit 19791049 authored by Soumya Managoli's avatar Soumya Managoli
Browse files

soc: swr-mstr-ctrl: add new lock to sync runtime_resume and runtime_suspend



runtime_suspend may get from multi functions and reslock is
unlock and lock inbetween which may cause clk count mismatch
with multi rutime_suspend called. Add new lock to make sure
runtime_suspend is run in sequence.

Change-Id: Ie465ded6dc1db1244035e9f4d216466b630df82b
Signed-off-by: default avatarMeng Wang <mengw@codeaurora.org>
Signed-off-by: default avatarSoumya Managoli <quic_c_smanag@quicinc.com>
parent 5b1fd595
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -2850,6 +2850,7 @@ static int swrm_probe(struct platform_device *pdev)
	mutex_init(&swrm->clklock);
	mutex_init(&swrm->devlock);
	mutex_init(&swrm->pm_lock);
	mutex_init(&swrm->runtime_lock);
	swrm->wlock_holders = 0;
	swrm->pm_state = SWRM_PM_SLEEPABLE;
	init_waitqueue_head(&swrm->pm_wq);
@@ -3022,6 +3023,7 @@ static int swrm_probe(struct platform_device *pdev)
	mutex_destroy(&swrm->clklock);
	mutex_destroy(&swrm->pm_lock);
	pm_qos_remove_request(&swrm->pm_qos_req);
	mutex_destroy(&swrm->runtime_lock);

err_pdata_fail:
err_memory_fail:
@@ -3061,6 +3063,7 @@ static int swrm_remove(struct platform_device *pdev)
	mutex_destroy(&swrm->force_down_lock);
	mutex_destroy(&swrm->pm_lock);
	pm_qos_remove_request(&swrm->pm_qos_req);
	mutex_destroy(&swrm->runtime_lock);
	devm_kfree(&pdev->dev, swrm);
	return 0;
}
@@ -3092,6 +3095,7 @@ static int swrm_runtime_resume(struct device *dev)

	dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n",
		__func__, swrm->state);
	mutex_lock(&swrm->runtime_lock);
	mutex_lock(&swrm->reslock);

	if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) {
@@ -3103,6 +3107,7 @@ static int swrm_runtime_resume(struct device *dev)
		if (swrm->req_clk_switch)
			swrm->req_clk_switch = false;
		mutex_unlock(&swrm->reslock);
		mutex_unlock(&swrm->runtime_lock);
		return 0;
	}
	if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) {
@@ -3120,6 +3125,7 @@ static int swrm_runtime_resume(struct device *dev)
					pr_err("%s: irq data is NULL\n",
						__func__);
					mutex_unlock(&swrm->reslock);
					mutex_unlock(&swrm->runtime_lock);
					return IRQ_NONE;
				}
				mutex_lock(&swrm->irq_lock);
@@ -3211,6 +3217,7 @@ static int swrm_runtime_resume(struct device *dev)
	if (swrm->req_clk_switch)
		swrm->req_clk_switch = false;
	mutex_unlock(&swrm->reslock);
	mutex_unlock(&swrm->runtime_lock);

	return ret;
}
@@ -3232,6 +3239,7 @@ static int swrm_runtime_suspend(struct device *dev)
		swrm->state = SWR_MSTR_SSR;
		return 0;
	}
	mutex_lock(&swrm->runtime_lock);
	mutex_lock(&swrm->reslock);
	mutex_lock(&swrm->force_down_lock);
	current_state = swrm->state;
@@ -3329,6 +3337,7 @@ static int swrm_runtime_suspend(struct device *dev)
	if (!hw_core_err)
		swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
	mutex_unlock(&swrm->reslock);
	mutex_unlock(&swrm->runtime_lock);
	dev_dbg(dev, "%s: pm_runtime: suspend done state: %d\n",
			__func__, swrm->state);
	pm_runtime_set_autosuspend_delay(dev, auto_suspend_timer);
+2 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
 * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
 */

#ifndef _SWR_WCD_CTRL_H
@@ -134,6 +135,7 @@ struct swr_mstr_ctrl {
	struct mutex reslock;
	struct mutex pm_lock;
	struct mutex irq_lock;
	struct mutex runtime_lock;
	u32 swrm_base_reg;
	char __iomem *swrm_dig_base;
	char __iomem *swrm_hctl_reg;