From: Roger Lu <roger.lu@mediatek.com>
To: Matthias Brugger <matthias.bgg@gmail.com>,
Enric Balletbo Serra <eballetbo@gmail.com>,
Kevin Hilman <khilman@kernel.org>,
Nicolas Boichat <drinkcat@google.com>
Cc: Fan Chen <fan.chen@mediatek.com>,
Roger Lu <roger.lu@mediatek.com>,
Jia-wei Chang <jia-wei.chang@mediatek.com>,
<devicetree@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-mediatek@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <linux-pm@vger.kernel.org>,
<Project_Global_Chrome_Upstream_Group@mediatek.com>
Subject: [PATCH v4 05/14] soc: mediatek: mtk-svs: use svs clk control APIs
Date: Wed, 11 Jan 2023 15:45:19 +0800 [thread overview]
Message-ID: <20230111074528.29354-6-roger.lu@mediatek.com> (raw)
In-Reply-To: <20230111074528.29354-1-roger.lu@mediatek.com>
In MediaTek HW design, svs and thermal both use the same clk source.
It means that svs clk reference count from CCF includes thermal control
counts. That makes svs driver confuse whether it disabled svs's main clk
or not from CCF's perspective and lead to turn off their shared clk
unexpectedly. Therefore, we add svs clk control APIs to make sure svs's
main clk is controlled well by svs driver itself.
Here is a NG example. Rely on CCF's reference count and cause problem.
thermal probe (clk ref = 1)
-> svs probe (clk ref = 2)
-> svs suspend (clk ref = 1)
-> thermal suspend (clk ref = 0)
-> thermal resume (clk ref = 1)
-> svs resume (encounter error, clk ref = 1)
-> svs suspend (clk ref = 0)
-> thermal suspend (Fail here, thermal HW control w/o clk)
Fixes: a825d72f74a3 ("soc: mediatek: fix missing clk_disable_unprepare() on err in svs_resume()")
Signed-off-by: Roger Lu <roger.lu@mediatek.com>
---
drivers/soc/mediatek/mtk-svs.c | 57 ++++++++++++++++++++++++++--------
1 file changed, 44 insertions(+), 13 deletions(-)
diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
index 9575aa645643..830263bad81e 100644
--- a/drivers/soc/mediatek/mtk-svs.c
+++ b/drivers/soc/mediatek/mtk-svs.c
@@ -326,6 +326,7 @@ static const u32 svs_regs_v2[] = {
* @bank_max: total number of svs banks
* @efuse: svs efuse data received from NVMEM framework
* @tefuse: thermal efuse data received from NVMEM framework
+ * @clk_cnt: clock count shows the clk enable/disable times by svs driver
*/
struct svs_platform {
char *name;
@@ -343,6 +344,7 @@ struct svs_platform {
u32 bank_max;
u32 *efuse;
u32 *tefuse;
+ s32 clk_cnt;
};
struct svs_platform_data {
@@ -502,6 +504,32 @@ static void svs_switch_bank(struct svs_platform *svsp)
svs_writel_relaxed(svsp, svsb->core_sel, CORESEL);
}
+static bool svs_is_clk_enabled(struct svs_platform *svsp)
+{
+ return svsp->clk_cnt > 0 ? true : false;
+}
+
+static int svs_clk_enable(struct svs_platform *svsp)
+{
+ int ret;
+
+ ret = clk_prepare_enable(svsp->main_clk);
+ if (ret) {
+ dev_err(svsp->dev, "cannot enable main_clk: %d\n", ret);
+ return ret;
+ }
+
+ svsp->clk_cnt++;
+
+ return 0;
+}
+
+static void svs_clk_disable(struct svs_platform *svsp)
+{
+ clk_disable_unprepare(svsp->main_clk);
+ svsp->clk_cnt--;
+}
+
static u32 svs_bank_volt_to_opp_volt(u32 svsb_volt, u32 svsb_volt_step,
u32 svsb_volt_base)
{
@@ -1569,6 +1597,12 @@ static int svs_suspend(struct device *dev)
int ret;
u32 idx;
+ if (!svs_is_clk_enabled(svsp)) {
+ dev_err(svsp->dev, "svs clk is disabled already (%d)\n",
+ svsp->clk_cnt);
+ return 0;
+ }
+
for (idx = 0; idx < svsp->bank_max; idx++) {
svsb = &svsp->banks[idx];
@@ -1590,7 +1624,7 @@ static int svs_suspend(struct device *dev)
return ret;
}
- clk_disable_unprepare(svsp->main_clk);
+ svs_clk_disable(svsp);
return 0;
}
@@ -1600,16 +1634,14 @@ static int svs_resume(struct device *dev)
struct svs_platform *svsp = dev_get_drvdata(dev);
int ret;
- ret = clk_prepare_enable(svsp->main_clk);
- if (ret) {
- dev_err(svsp->dev, "cannot enable main_clk, disable svs\n");
+ ret = svs_clk_enable(svsp);
+ if (ret)
return ret;
- }
ret = reset_control_deassert(svsp->rst);
if (ret) {
dev_err(svsp->dev, "cannot deassert reset %d\n", ret);
- goto out_of_resume;
+ goto svs_resume_clk_disable;
}
ret = svs_init02(svsp);
@@ -1624,8 +1656,9 @@ static int svs_resume(struct device *dev)
dev_err(svsp->dev, "assert reset: %d\n",
reset_control_assert(svsp->rst));
-out_of_resume:
- clk_disable_unprepare(svsp->main_clk);
+svs_resume_clk_disable:
+ svs_clk_disable(svsp);
+
return ret;
}
@@ -2411,11 +2444,9 @@ static int svs_probe(struct platform_device *pdev)
goto svs_probe_free_resource;
}
- ret = clk_prepare_enable(svsp->main_clk);
- if (ret) {
- dev_err(svsp->dev, "cannot enable main clk: %d\n", ret);
+ ret = svs_clk_enable(svsp);
+ if (ret)
goto svs_probe_free_resource;
- }
svsp->base = of_iomap(svsp->dev->of_node, 0);
if (IS_ERR_OR_NULL(svsp->base)) {
@@ -2456,7 +2487,7 @@ static int svs_probe(struct platform_device *pdev)
iounmap(svsp->base);
svs_probe_clk_disable:
- clk_disable_unprepare(svsp->main_clk);
+ svs_clk_disable(svsp);
svs_probe_free_resource:
if (!IS_ERR_OR_NULL(svsp->efuse))
--
2.18.0
next prev parent reply other threads:[~2023-01-11 7:48 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-11 7:45 [PATCH v4 0/14] Enahance SVS's robustness Roger Lu
2023-01-11 7:45 ` [PATCH v4 01/14] soc: mediatek: mtk-svs: restore default voltages when svs_init02() fail Roger Lu
2023-01-31 13:22 ` Matthias Brugger
2023-01-11 7:45 ` [PATCH v4 02/14] soc: mediatek: mtk-svs: reset svs when svs_resume() fail Roger Lu
2023-01-31 13:22 ` Matthias Brugger
2023-01-11 7:45 ` [PATCH v4 03/14] soc: mediatek: mtk-svs: enable the IRQ later Roger Lu
2023-01-31 12:59 ` Matthias Brugger
2023-02-01 13:43 ` Roger Lu (陸瑞傑)
2023-02-01 13:47 ` Matthias Brugger
2023-01-11 7:45 ` [PATCH v4 04/14] soc: mediatek: mtk-svs: Use pm_runtime_resume_and_get() in svs_init01() Roger Lu
2023-01-31 13:23 ` Matthias Brugger
2023-01-11 7:45 ` Roger Lu [this message]
2023-01-31 13:19 ` [PATCH v4 05/14] soc: mediatek: mtk-svs: use svs clk control APIs Matthias Brugger
2023-02-01 12:28 ` Roger Lu (陸瑞傑)
2023-02-02 10:29 ` Matthias Brugger
2023-02-06 2:01 ` Roger Lu (陸瑞傑)
2023-02-06 12:09 ` Matthias Brugger
2023-02-11 11:34 ` Roger Lu (陸瑞傑)
2023-01-11 7:45 ` [PATCH v4 06/14] soc: mediatek: mtk-svs: add thermal voltage compensation if needed Roger Lu
2023-01-11 7:45 ` [PATCH v4 07/14] soc: mediatek: mtk-svs: keep svs alive if CONFIG_DEBUG_FS not supported Roger Lu
2023-01-31 13:24 ` Matthias Brugger
2023-01-11 7:45 ` [PATCH v4 08/14] soc: mediatek: mtk-svs: clean up platform probing Roger Lu
2023-01-31 13:24 ` Matthias Brugger
2023-01-11 7:45 ` [PATCH v4 09/14] soc: mediatek: mtk-svs: improve readability of platform_probe Roger Lu
2023-01-31 13:24 ` Matthias Brugger
2023-01-11 7:45 ` [PATCH v4 10/14] soc: mediatek: mtk-svs: move svs_platform_probe into probe Roger Lu
2023-01-31 13:25 ` Matthias Brugger
2023-01-11 7:45 ` [PATCH v4 11/14] soc: mediatek: mtk-svs: delete superfluous platform data entries Roger Lu
2023-01-31 13:30 ` Matthias Brugger
2023-01-11 7:45 ` [PATCH v4 12/14] soc: mediatek: mtk-svs: use svs get efuse common function Roger Lu
2023-01-31 13:37 ` Matthias Brugger
2023-02-01 8:15 ` Roger Lu (陸瑞傑)
2023-01-11 7:45 ` [PATCH v4 13/14] soc: mediatek: mtk-svs: use common function to disable restore voltages Roger Lu
2023-01-31 13:40 ` Matthias Brugger
2023-02-01 8:13 ` Roger Lu (陸瑞傑)
2023-01-11 7:45 ` [PATCH v4 14/14] soc: mtk-svs: mt8183: refactor o_slope calculation Roger Lu
2023-01-31 13:41 ` Matthias Brugger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230111074528.29354-6-roger.lu@mediatek.com \
--to=roger.lu@mediatek.com \
--cc=Project_Global_Chrome_Upstream_Group@mediatek.com \
--cc=devicetree@vger.kernel.org \
--cc=drinkcat@google.com \
--cc=eballetbo@gmail.com \
--cc=fan.chen@mediatek.com \
--cc=jia-wei.chang@mediatek.com \
--cc=khilman@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-pm@vger.kernel.org \
--cc=matthias.bgg@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox