linux-mediatek.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver
@ 2022-09-28 15:55 matthias.bgg
  2022-09-28 15:55 ` [PATCH 1/8] soc: mediatek: mtk-svs: clean up platform probing matthias.bgg
                   ` (8 more replies)
  0 siblings, 9 replies; 20+ messages in thread
From: matthias.bgg @ 2022-09-28 15:55 UTC (permalink / raw)
  To: roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger,
	Philipp Zabel

From: Matthias Brugger <matthias.bgg@gmail.com>

Mediatek SVS driver got accepted upstream but has coding style issues
which were overseen in the review process. This series is a first step
to clean up the driver. It basically cleans up the SoC specific probe.
As next step we will need to clean up the 'struct svs_bank'.

This series should be a mere cleanup with no functional change. I'm
happy to recieve tested-by tags to make sure it does not break anything.


Matthias Brugger (8):
  soc: mediatek: mtk-svs: clean up platform probing
  soc: mediatek: mtk-svs: improve readability of platform_probe
  soc: mediatek: mtk-svs: move svs_platform_probe into probe
  soc: mediatek: mtk-svs: delete superfluous platform data entries
  soc: mediatek: mtk-svs: Move SoC specific functions to new files
  soc: mtk-svs: mt8183: Move thermal parsing in new function
  soc: mtk-svs: mt8183: refactor o_slope calculation
  soc: mtk-svs: mt8192: fix bank data

 drivers/soc/mediatek/Makefile         |   3 +-
 drivers/soc/mediatek/mt8183-svs.h     | 113 ++++
 drivers/soc/mediatek/mt8192-svs.h     |  64 ++
 drivers/soc/mediatek/mtk-svs-mt8183.c | 235 +++++++
 drivers/soc/mediatek/mtk-svs-mt8192.c |  98 +++
 drivers/soc/mediatek/mtk-svs.c        | 882 ++------------------------
 drivers/soc/mediatek/mtk-svs.h        | 279 ++++++++
 7 files changed, 853 insertions(+), 821 deletions(-)
 create mode 100644 drivers/soc/mediatek/mt8183-svs.h
 create mode 100644 drivers/soc/mediatek/mt8192-svs.h
 create mode 100644 drivers/soc/mediatek/mtk-svs-mt8183.c
 create mode 100644 drivers/soc/mediatek/mtk-svs-mt8192.c
 create mode 100644 drivers/soc/mediatek/mtk-svs.h

-- 
2.37.3



^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 1/8] soc: mediatek: mtk-svs: clean up platform probing
  2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
@ 2022-09-28 15:55 ` matthias.bgg
  2022-09-29  8:25   ` AngeloGioacchino Del Regno
  2022-09-28 15:55 ` [PATCH 2/8] soc: mediatek: mtk-svs: improve readability of platform_probe matthias.bgg
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 20+ messages in thread
From: matthias.bgg @ 2022-09-28 15:55 UTC (permalink / raw)
  To: roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger

From: Matthias Brugger <matthias.bgg@gmail.com>

We only ever call the SoC specific probe function from
svs_platform_probe. No need to carry that function in a global
datastructure around.

Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
---

 drivers/soc/mediatek/mtk-svs.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
index 0469c9dfeb04..fd0f636e8644 100644
--- a/drivers/soc/mediatek/mtk-svs.c
+++ b/drivers/soc/mediatek/mtk-svs.c
@@ -319,7 +319,6 @@ static const u32 svs_regs_v2[] = {
  * @banks: svs banks that svs platform supports
  * @rst: svs platform reset control
  * @efuse_parsing: svs platform efuse parsing function pointer
- * @probe: svs platform probe function pointer
  * @efuse_max: total number of svs efuse
  * @tefuse_max: total number of thermal efuse
  * @regs: svs platform registers map
@@ -336,7 +335,6 @@ struct svs_platform {
 	struct svs_bank *banks;
 	struct reset_control *rst;
 	bool (*efuse_parsing)(struct svs_platform *svsp);
-	int (*probe)(struct svs_platform *svsp);
 	size_t efuse_max;
 	size_t tefuse_max;
 	const u32 *regs;
@@ -2347,11 +2345,10 @@ static struct svs_platform *svs_platform_probe(struct platform_device *pdev)
 	svsp->name = svsp_data->name;
 	svsp->banks = svsp_data->banks;
 	svsp->efuse_parsing = svsp_data->efuse_parsing;
-	svsp->probe = svsp_data->probe;
 	svsp->regs = svsp_data->regs;
 	svsp->bank_max = svsp_data->bank_max;
 
-	ret = svsp->probe(svsp);
+	ret = svsp_data->probe(svsp);
 	if (ret)
 		return ERR_PTR(ret);
 
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 2/8] soc: mediatek: mtk-svs: improve readability of platform_probe
  2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
  2022-09-28 15:55 ` [PATCH 1/8] soc: mediatek: mtk-svs: clean up platform probing matthias.bgg
@ 2022-09-28 15:55 ` matthias.bgg
  2022-09-29  8:25   ` AngeloGioacchino Del Regno
  2022-09-28 15:55 ` [PATCH 3/8] soc: mediatek: mtk-svs: move svs_platform_probe into probe matthias.bgg
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 20+ messages in thread
From: matthias.bgg @ 2022-09-28 15:55 UTC (permalink / raw)
  To: roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger

From: Matthias Brugger <matthias.bgg@gmail.com>

If a compatible misses a match data entry, then something is wrong in
the development phase, we don't need to check for that at runtime.

Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
---

 drivers/soc/mediatek/mtk-svs.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
index fd0f636e8644..52bb4f8bbe6d 100644
--- a/drivers/soc/mediatek/mtk-svs.c
+++ b/drivers/soc/mediatek/mtk-svs.c
@@ -2332,10 +2332,6 @@ static struct svs_platform *svs_platform_probe(struct platform_device *pdev)
 	int ret;
 
 	svsp_data = of_device_get_match_data(&pdev->dev);
-	if (!svsp_data) {
-		dev_err(&pdev->dev, "no svs platform data?\n");
-		return ERR_PTR(-EPERM);
-	}
 
 	svsp = devm_kzalloc(&pdev->dev, sizeof(*svsp), GFP_KERNEL);
 	if (!svsp)
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 3/8] soc: mediatek: mtk-svs: move svs_platform_probe into probe
  2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
  2022-09-28 15:55 ` [PATCH 1/8] soc: mediatek: mtk-svs: clean up platform probing matthias.bgg
  2022-09-28 15:55 ` [PATCH 2/8] soc: mediatek: mtk-svs: improve readability of platform_probe matthias.bgg
@ 2022-09-28 15:55 ` matthias.bgg
  2022-09-29  8:25   ` AngeloGioacchino Del Regno
  2022-09-28 15:55 ` [PATCH 4/8] soc: mediatek: mtk-svs: delete superfluous platform data entries matthias.bgg
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 20+ messages in thread
From: matthias.bgg @ 2022-09-28 15:55 UTC (permalink / raw)
  To: roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger

From: Matthias Brugger <matthias.bgg@gmail.com>

Moving svs_platform_probe into driver probe function will allow us to
reduce svs_platform members. This will be done in a follow-up patch.

Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
---

 drivers/soc/mediatek/mtk-svs.c | 20 ++++----------------
 1 file changed, 4 insertions(+), 16 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
index 52bb4f8bbe6d..8342627f8dea 100644
--- a/drivers/soc/mediatek/mtk-svs.c
+++ b/drivers/soc/mediatek/mtk-svs.c
@@ -2325,17 +2325,17 @@ static const struct of_device_id svs_of_match[] = {
 	},
 };
 
-static struct svs_platform *svs_platform_probe(struct platform_device *pdev)
+static int svs_probe(struct platform_device *pdev)
 {
 	struct svs_platform *svsp;
 	const struct svs_platform_data *svsp_data;
-	int ret;
+	int ret, svsp_irq;
 
 	svsp_data = of_device_get_match_data(&pdev->dev);
 
 	svsp = devm_kzalloc(&pdev->dev, sizeof(*svsp), GFP_KERNEL);
 	if (!svsp)
-		return ERR_PTR(-ENOMEM);
+		return -ENOMEM;
 
 	svsp->dev = &pdev->dev;
 	svsp->name = svsp_data->name;
@@ -2346,19 +2346,7 @@ static struct svs_platform *svs_platform_probe(struct platform_device *pdev)
 
 	ret = svsp_data->probe(svsp);
 	if (ret)
-		return ERR_PTR(ret);
-
-	return svsp;
-}
-
-static int svs_probe(struct platform_device *pdev)
-{
-	struct svs_platform *svsp;
-	int svsp_irq, ret;
-
-	svsp = svs_platform_probe(pdev);
-	if (IS_ERR(svsp))
-		return PTR_ERR(svsp);
+		return ret;
 
 	if (!svs_is_efuse_data_correct(svsp)) {
 		dev_notice(svsp->dev, "efuse data isn't correct\n");
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 4/8] soc: mediatek: mtk-svs: delete superfluous platform data entries
  2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
                   ` (2 preceding siblings ...)
  2022-09-28 15:55 ` [PATCH 3/8] soc: mediatek: mtk-svs: move svs_platform_probe into probe matthias.bgg
@ 2022-09-28 15:55 ` matthias.bgg
  2022-09-29  8:25   ` AngeloGioacchino Del Regno
  2022-10-06 11:43   ` Roger Lu
  2022-09-28 15:55 ` [PATCH 5/8] soc: mediatek: mtk-svs: Move SoC specific functions to new files matthias.bgg
                   ` (4 subsequent siblings)
  8 siblings, 2 replies; 20+ messages in thread
From: matthias.bgg @ 2022-09-28 15:55 UTC (permalink / raw)
  To: roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger

From: Matthias Brugger <matthias.bgg@gmail.com>

The platform name and efuse parsing function pointer are only used while
probing the device. Use them from the svs_platform_data struct instead.

Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
---

 drivers/soc/mediatek/mtk-svs.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
index 8342627f8dea..482cc8d7e7cf 100644
--- a/drivers/soc/mediatek/mtk-svs.c
+++ b/drivers/soc/mediatek/mtk-svs.c
@@ -311,14 +311,12 @@ static const u32 svs_regs_v2[] = {
 
 /**
  * struct svs_platform - svs platform control
- * @name: svs platform name
  * @base: svs platform register base
  * @dev: svs platform device
  * @main_clk: main clock for svs bank
  * @pbank: svs bank pointer needing to be protected by spin_lock section
  * @banks: svs banks that svs platform supports
  * @rst: svs platform reset control
- * @efuse_parsing: svs platform efuse parsing function pointer
  * @efuse_max: total number of svs efuse
  * @tefuse_max: total number of thermal efuse
  * @regs: svs platform registers map
@@ -327,14 +325,12 @@ static const u32 svs_regs_v2[] = {
  * @tefuse: thermal efuse data received from NVMEM framework
  */
 struct svs_platform {
-	char *name;
 	void __iomem *base;
 	struct device *dev;
 	struct clk *main_clk;
 	struct svs_bank *pbank;
 	struct svs_bank *banks;
 	struct reset_control *rst;
-	bool (*efuse_parsing)(struct svs_platform *svsp);
 	size_t efuse_max;
 	size_t tefuse_max;
 	const u32 *regs;
@@ -2009,7 +2005,7 @@ static bool svs_is_efuse_data_correct(struct svs_platform *svsp)
 	svsp->efuse_max /= sizeof(u32);
 	nvmem_cell_put(cell);
 
-	return svsp->efuse_parsing(svsp);
+	return true;
 }
 
 static struct device *svs_get_subsys_device(struct svs_platform *svsp,
@@ -2338,9 +2334,7 @@ static int svs_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	svsp->dev = &pdev->dev;
-	svsp->name = svsp_data->name;
 	svsp->banks = svsp_data->banks;
-	svsp->efuse_parsing = svsp_data->efuse_parsing;
 	svsp->regs = svsp_data->regs;
 	svsp->bank_max = svsp_data->bank_max;
 
@@ -2351,6 +2345,12 @@ static int svs_probe(struct platform_device *pdev)
 	if (!svs_is_efuse_data_correct(svsp)) {
 		dev_notice(svsp->dev, "efuse data isn't correct\n");
 		ret = -EPERM;
+		goto svs_probe_free_efuse;
+	}
+
+	if (!svsp_data->efuse_parsing(svsp)) {
+		dev_notice(svsp->dev, "efuse data parsing failed\n");
+		ret = -EPERM;
 		goto svs_probe_free_resource;
 	}
 
@@ -2367,7 +2367,7 @@ static int svs_probe(struct platform_device *pdev)
 	}
 
 	ret = devm_request_threaded_irq(svsp->dev, svsp_irq, NULL, svs_isr,
-					IRQF_ONESHOT, svsp->name, svsp);
+					IRQF_ONESHOT, svsp_data->name, svsp);
 	if (ret) {
 		dev_err(svsp->dev, "register irq(%d) failed: %d\n",
 			svsp_irq, ret);
@@ -2416,11 +2416,13 @@ static int svs_probe(struct platform_device *pdev)
 	clk_disable_unprepare(svsp->main_clk);
 
 svs_probe_free_resource:
-	if (!IS_ERR_OR_NULL(svsp->efuse))
-		kfree(svsp->efuse);
 	if (!IS_ERR_OR_NULL(svsp->tefuse))
 		kfree(svsp->tefuse);
 
+svs_probe_free_efuse:
+	if (!IS_ERR_OR_NULL(svsp->efuse))
+		kfree(svsp->efuse);
+
 	return ret;
 }
 
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 5/8] soc: mediatek: mtk-svs: Move SoC specific functions to new files
  2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
                   ` (3 preceding siblings ...)
  2022-09-28 15:55 ` [PATCH 4/8] soc: mediatek: mtk-svs: delete superfluous platform data entries matthias.bgg
@ 2022-09-28 15:55 ` matthias.bgg
  2022-09-29  8:26   ` AngeloGioacchino Del Regno
  2022-10-06 11:43   ` Roger Lu
  2022-09-28 15:55 ` [PATCH 6/8] soc: mtk-svs: mt8183: Move thermal parsing in new function matthias.bgg
                   ` (3 subsequent siblings)
  8 siblings, 2 replies; 20+ messages in thread
From: matthias.bgg @ 2022-09-28 15:55 UTC (permalink / raw)
  To: roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger,
	Philipp Zabel

From: Matthias Brugger <matthias.bgg@gmail.com>

With every SoC added to the driver, it grows. Move SoC specific
callbacks to a new source files.

Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
---

 drivers/soc/mediatek/Makefile         |   3 +-
 drivers/soc/mediatek/mt8183-svs.h     | 113 ++++
 drivers/soc/mediatek/mt8192-svs.h     |  64 ++
 drivers/soc/mediatek/mtk-svs-mt8183.c | 234 ++++++++
 drivers/soc/mediatek/mtk-svs-mt8192.c | 100 ++++
 drivers/soc/mediatek/mtk-svs.c        | 831 ++------------------------
 drivers/soc/mediatek/mtk-svs.h        | 279 +++++++++
 7 files changed, 837 insertions(+), 787 deletions(-)
 create mode 100644 drivers/soc/mediatek/mt8183-svs.h
 create mode 100644 drivers/soc/mediatek/mt8192-svs.h
 create mode 100644 drivers/soc/mediatek/mtk-svs-mt8183.c
 create mode 100644 drivers/soc/mediatek/mtk-svs-mt8192.c
 create mode 100644 drivers/soc/mediatek/mtk-svs.h

diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile
index 0e9e703c931a..851131638644 100644
--- a/drivers/soc/mediatek/Makefile
+++ b/drivers/soc/mediatek/Makefile
@@ -7,4 +7,5 @@ obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o
 obj-$(CONFIG_MTK_SCPSYS_PM_DOMAINS) += mtk-pm-domains.o
 obj-$(CONFIG_MTK_MMSYS) += mtk-mmsys.o
 obj-$(CONFIG_MTK_MMSYS) += mtk-mutex.o
-obj-$(CONFIG_MTK_SVS) += mtk-svs.o
+mtk_svs-objs := mtk-svs.o mtk-svs-mt8183.o mtk-svs-mt8192.o
+obj-$(CONFIG_MTK_SVS) += mtk_svs.o
diff --git a/drivers/soc/mediatek/mt8183-svs.h b/drivers/soc/mediatek/mt8183-svs.h
new file mode 100644
index 000000000000..89c0deb9fb11
--- /dev/null
+++ b/drivers/soc/mediatek/mt8183-svs.h
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __DRV_SVS_MT8183_H
+#define __DRV_SVS_MT8183_H
+
+static struct svs_bank svs_mt8183_banks[] = {
+	{
+		.sw_id			= SVSB_CPU_LITTLE,
+		.set_freq_pct		= svs_set_bank_freq_pct_v2,
+		.get_volts		= svs_get_bank_volts_v2,
+		.cpu_id			= 0,
+		.buck_name		= "proc",
+		.volt_flags		= SVSB_INIT01_VOLT_INC_ONLY,
+		.mode_support		= SVSB_MODE_INIT01 | SVSB_MODE_INIT02,
+		.opp_count		= MAX_OPP_ENTRIES,
+		.freq_base		= 1989000000,
+		.vboot			= 0x30,
+		.volt_step		= 6250,
+		.volt_base		= 500000,
+		.vmax			= 0x64,
+		.vmin			= 0x18,
+		.age_config		= 0x555555,
+		.dc_config		= 0x555555,
+		.dvt_fixed		= 0x7,
+		.vco			= 0x10,
+		.chk_shift		= 0x77,
+		.core_sel		= 0x8fff0000,
+		.int_st			= BIT(0),
+		.ctl0			= 0x00010001,
+	},
+	{
+		.sw_id			= SVSB_CPU_BIG,
+		.set_freq_pct		= svs_set_bank_freq_pct_v2,
+		.get_volts		= svs_get_bank_volts_v2,
+		.cpu_id			= 4,
+		.buck_name		= "proc",
+		.volt_flags		= SVSB_INIT01_VOLT_INC_ONLY,
+		.mode_support		= SVSB_MODE_INIT01 | SVSB_MODE_INIT02,
+		.opp_count		= MAX_OPP_ENTRIES,
+		.freq_base		= 1989000000,
+		.vboot			= 0x30,
+		.volt_step		= 6250,
+		.volt_base		= 500000,
+		.vmax			= 0x58,
+		.vmin			= 0x10,
+		.age_config		= 0x555555,
+		.dc_config		= 0x555555,
+		.dvt_fixed		= 0x7,
+		.vco			= 0x10,
+		.chk_shift		= 0x77,
+		.core_sel		= 0x8fff0001,
+		.int_st			= BIT(1),
+		.ctl0			= 0x00000001,
+	},
+	{
+		.sw_id			= SVSB_CCI,
+		.set_freq_pct		= svs_set_bank_freq_pct_v2,
+		.get_volts		= svs_get_bank_volts_v2,
+		.buck_name		= "proc",
+		.volt_flags		= SVSB_INIT01_VOLT_INC_ONLY,
+		.mode_support		= SVSB_MODE_INIT01 | SVSB_MODE_INIT02,
+		.opp_count		= MAX_OPP_ENTRIES,
+		.freq_base		= 1196000000,
+		.vboot			= 0x30,
+		.volt_step		= 6250,
+		.volt_base		= 500000,
+		.vmax			= 0x64,
+		.vmin			= 0x18,
+		.age_config		= 0x555555,
+		.dc_config		= 0x555555,
+		.dvt_fixed		= 0x7,
+		.vco			= 0x10,
+		.chk_shift		= 0x77,
+		.core_sel		= 0x8fff0002,
+		.int_st			= BIT(2),
+		.ctl0			= 0x00100003,
+	},
+	{
+		.sw_id			= SVSB_GPU,
+		.set_freq_pct		= svs_set_bank_freq_pct_v2,
+		.get_volts		= svs_get_bank_volts_v2,
+		.buck_name		= "mali",
+		.tzone_name		= "tzts2",
+		.volt_flags		= SVSB_INIT01_PD_REQ |
+					  SVSB_INIT01_VOLT_INC_ONLY,
+		.mode_support		= SVSB_MODE_INIT01 | SVSB_MODE_INIT02 |
+					  SVSB_MODE_MON,
+		.opp_count		= MAX_OPP_ENTRIES,
+		.freq_base		= 900000000,
+		.vboot			= 0x30,
+		.volt_step		= 6250,
+		.volt_base		= 500000,
+		.vmax			= 0x40,
+		.vmin			= 0x14,
+		.age_config		= 0x555555,
+		.dc_config		= 0x555555,
+		.dvt_fixed		= 0x3,
+		.vco			= 0x10,
+		.chk_shift		= 0x77,
+		.core_sel		= 0x8fff0003,
+		.int_st			= BIT(3),
+		.ctl0			= 0x00050001,
+		.tzone_htemp		= 85000,
+		.tzone_htemp_voffset	= 0,
+		.tzone_ltemp		= 25000,
+		.tzone_ltemp_voffset	= 3,
+	},
+};
+
+bool svs_mt8183_efuse_parsing(struct svs_platform *svsp);
+int svs_mt8183_platform_probe(struct svs_platform *svsp);
+
+#endif
diff --git a/drivers/soc/mediatek/mt8192-svs.h b/drivers/soc/mediatek/mt8192-svs.h
new file mode 100644
index 000000000000..6571ebcb2c0f
--- /dev/null
+++ b/drivers/soc/mediatek/mt8192-svs.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __DRV_SVS_MT8192_H
+#define __DRV_SVS_MT8192_H
+
+static struct svs_bank svs_mt8192_banks[] = {
+	{
+		.sw_id			= SVSB_GPU,
+		.type			= SVSB_LOW,
+		.set_freq_pct		= svs_set_bank_freq_pct_v3,
+		.get_volts		= svs_get_bank_volts_v3,
+		.volt_flags		= SVSB_REMOVE_DVTFIXED_VOLT,
+		.mode_support		= SVSB_MODE_INIT02,
+		.opp_count		= MAX_OPP_ENTRIES,
+		.freq_base		= 688000000,
+		.turn_freq_base		= 688000000,
+		.volt_step		= 6250,
+		.volt_base		= 400000,
+		.vmax			= 0x60,
+		.vmin			= 0x1a,
+		.age_config		= 0x555555,
+		.dc_config		= 0x1,
+		.dvt_fixed		= 0x1,
+		.vco			= 0x18,
+		.chk_shift		= 0x87,
+		.core_sel		= 0x0fff0100,
+		.int_st			= BIT(0),
+		.ctl0			= 0x00540003,
+	},
+	{
+		.sw_id			= SVSB_GPU,
+		.type			= SVSB_HIGH,
+		.set_freq_pct		= svs_set_bank_freq_pct_v3,
+		.get_volts		= svs_get_bank_volts_v3,
+		.tzone_name		= "gpu1",
+		.volt_flags		= SVSB_REMOVE_DVTFIXED_VOLT |
+					  SVSB_MON_VOLT_IGNORE,
+		.mode_support		= SVSB_MODE_INIT02 | SVSB_MODE_MON,
+		.opp_count		= MAX_OPP_ENTRIES,
+		.freq_base		= 902000000,
+		.turn_freq_base		= 688000000,
+		.volt_step		= 6250,
+		.volt_base		= 400000,
+		.vmax			= 0x60,
+		.vmin			= 0x1a,
+		.age_config		= 0x555555,
+		.dc_config		= 0x1,
+		.dvt_fixed		= 0x6,
+		.vco			= 0x18,
+		.chk_shift		= 0x87,
+		.core_sel		= 0x0fff0101,
+		.int_st			= BIT(1),
+		.ctl0			= 0x00540003,
+		.tzone_htemp		= 85000,
+		.tzone_htemp_voffset	= 0,
+		.tzone_ltemp		= 25000,
+		.tzone_ltemp_voffset	= 7,
+	},
+};
+
+bool svs_mt8192_efuse_parsing(struct svs_platform *svsp);
+int svs_mt8192_platform_probe(struct svs_platform *svsp);
+
+#endif
diff --git a/drivers/soc/mediatek/mtk-svs-mt8183.c b/drivers/soc/mediatek/mtk-svs-mt8183.c
new file mode 100644
index 000000000000..a97fcae59dd7
--- /dev/null
+++ b/drivers/soc/mediatek/mtk-svs-mt8183.c
@@ -0,0 +1,234 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include "mtk-svs.h"
+
+bool svs_mt8183_efuse_parsing(struct svs_platform *svsp)
+{
+	struct svs_bank *svsb;
+	int format[6], x_roomt[6], o_vtsmcu[5], o_vtsabb, tb_roomt = 0;
+	int adc_ge_t, adc_oe_t, ge, oe, gain, degc_cali, adc_cali_en_t;
+	int o_slope, o_slope_sign, ts_id;
+	u32 idx, i, ft_pgm, mts, temp0, temp1, temp2;
+	int ret;
+
+	for (i = 0; i < svsp->efuse_max; i++)
+		if (svsp->efuse[i])
+			dev_info(svsp->dev, "M_HW_RES%d: 0x%08x\n",
+				 i, svsp->efuse[i]);
+
+	if (!svsp->efuse[2]) {
+		dev_notice(svsp->dev, "svs_efuse[2] = 0x0?\n");
+		return false;
+	}
+
+	/* Svs efuse parsing */
+	ft_pgm = (svsp->efuse[0] >> 4) & GENMASK(3, 0);
+
+	for (idx = 0; idx < svsp->bank_max; idx++) {
+		svsb = &svsp->banks[idx];
+
+		if (ft_pgm <= 1)
+			svsb->volt_flags |= SVSB_INIT01_VOLT_IGNORE;
+
+		switch (svsb->sw_id) {
+		case SVSB_CPU_LITTLE:
+			svsb->bdes = svsp->efuse[16] & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[16] >> 8) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[16] >> 16) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[16] >> 24) & GENMASK(7, 0);
+			svsb->mtdes  = (svsp->efuse[17] >> 16) & GENMASK(7, 0);
+
+			if (ft_pgm <= 3)
+				svsb->volt_od += 10;
+			else
+				svsb->volt_od += 2;
+			break;
+		case SVSB_CPU_BIG:
+			svsb->bdes = svsp->efuse[18] & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[18] >> 8) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[18] >> 16) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[18] >> 24) & GENMASK(7, 0);
+			svsb->mtdes  = svsp->efuse[17] & GENMASK(7, 0);
+
+			if (ft_pgm <= 3)
+				svsb->volt_od += 15;
+			else
+				svsb->volt_od += 12;
+			break;
+		case SVSB_CCI:
+			svsb->bdes = svsp->efuse[4] & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[4] >> 8) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[4] >> 16) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[4] >> 24) & GENMASK(7, 0);
+			svsb->mtdes  = (svsp->efuse[5] >> 16) & GENMASK(7, 0);
+
+			if (ft_pgm <= 3)
+				svsb->volt_od += 10;
+			else
+				svsb->volt_od += 2;
+			break;
+		case SVSB_GPU:
+			svsb->bdes = svsp->efuse[6] & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[6] >> 8) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[6] >> 16) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[6] >> 24) & GENMASK(7, 0);
+			svsb->mtdes  = svsp->efuse[5] & GENMASK(7, 0);
+
+			if (ft_pgm >= 2) {
+				svsb->freq_base = 800000000; /* 800MHz */
+				svsb->dvt_fixed = 2;
+			}
+			break;
+		default:
+			dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
+			return false;
+		}
+	}
+
+	ret = svs_thermal_efuse_get_data(svsp);
+	if (ret)
+		return false;
+
+	/* Thermal efuse parsing */
+	adc_ge_t = (svsp->tefuse[1] >> 22) & GENMASK(9, 0);
+	adc_oe_t = (svsp->tefuse[1] >> 12) & GENMASK(9, 0);
+
+	o_vtsmcu[0] = (svsp->tefuse[0] >> 17) & GENMASK(8, 0);
+	o_vtsmcu[1] = (svsp->tefuse[0] >> 8) & GENMASK(8, 0);
+	o_vtsmcu[2] = svsp->tefuse[1] & GENMASK(8, 0);
+	o_vtsmcu[3] = (svsp->tefuse[2] >> 23) & GENMASK(8, 0);
+	o_vtsmcu[4] = (svsp->tefuse[2] >> 5) & GENMASK(8, 0);
+	o_vtsabb = (svsp->tefuse[2] >> 14) & GENMASK(8, 0);
+
+	degc_cali = (svsp->tefuse[0] >> 1) & GENMASK(5, 0);
+	adc_cali_en_t = svsp->tefuse[0] & BIT(0);
+	o_slope_sign = (svsp->tefuse[0] >> 7) & BIT(0);
+
+	ts_id = (svsp->tefuse[1] >> 9) & BIT(0);
+	o_slope = (svsp->tefuse[0] >> 26) & GENMASK(5, 0);
+
+	if (adc_cali_en_t == 1) {
+		if (!ts_id)
+			o_slope = 0;
+
+		if (adc_ge_t < 265 || adc_ge_t > 758 ||
+		    adc_oe_t < 265 || adc_oe_t > 758 ||
+		    o_vtsmcu[0] < -8 || o_vtsmcu[0] > 484 ||
+		    o_vtsmcu[1] < -8 || o_vtsmcu[1] > 484 ||
+		    o_vtsmcu[2] < -8 || o_vtsmcu[2] > 484 ||
+		    o_vtsmcu[3] < -8 || o_vtsmcu[3] > 484 ||
+		    o_vtsmcu[4] < -8 || o_vtsmcu[4] > 484 ||
+		    o_vtsabb < -8 || o_vtsabb > 484 ||
+		    degc_cali < 1 || degc_cali > 63) {
+			dev_err(svsp->dev, "bad thermal efuse, no mon mode\n");
+			goto remove_mt8183_svsb_mon_mode;
+		}
+	} else {
+		dev_err(svsp->dev, "no thermal efuse, no mon mode\n");
+		goto remove_mt8183_svsb_mon_mode;
+	}
+
+	ge = ((adc_ge_t - 512) * 10000) / 4096;
+	oe = (adc_oe_t - 512);
+	gain = (10000 + ge);
+
+	format[0] = (o_vtsmcu[0] + 3350 - oe);
+	format[1] = (o_vtsmcu[1] + 3350 - oe);
+	format[2] = (o_vtsmcu[2] + 3350 - oe);
+	format[3] = (o_vtsmcu[3] + 3350 - oe);
+	format[4] = (o_vtsmcu[4] + 3350 - oe);
+	format[5] = (o_vtsabb + 3350 - oe);
+
+	for (i = 0; i < 6; i++)
+		x_roomt[i] = (((format[i] * 10000) / 4096) * 10000) / gain;
+
+	temp0 = (10000 * 100000 / gain) * 15 / 18;
+
+	if (!o_slope_sign)
+		mts = (temp0 * 10) / (1534 + o_slope * 10);
+	else
+		mts = (temp0 * 10) / (1534 - o_slope * 10);
+
+	for (idx = 0; idx < svsp->bank_max; idx++) {
+		svsb = &svsp->banks[idx];
+		svsb->mts = mts;
+
+		switch (svsb->sw_id) {
+		case SVSB_CPU_LITTLE:
+			tb_roomt = x_roomt[3];
+			break;
+		case SVSB_CPU_BIG:
+			tb_roomt = x_roomt[4];
+			break;
+		case SVSB_CCI:
+			tb_roomt = x_roomt[3];
+			break;
+		case SVSB_GPU:
+			tb_roomt = x_roomt[1];
+			break;
+		default:
+			dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
+			goto remove_mt8183_svsb_mon_mode;
+		}
+
+		temp0 = (degc_cali * 10 / 2);
+		temp1 = ((10000 * 100000 / 4096 / gain) *
+			 oe + tb_roomt * 10) * 15 / 18;
+
+		if (!o_slope_sign)
+			temp2 = temp1 * 100 / (1534 + o_slope * 10);
+		else
+			temp2 = temp1 * 100 / (1534 - o_slope * 10);
+
+		svsb->bts = (temp0 + temp2 - 250) * 4 / 10;
+	}
+
+	return true;
+
+remove_mt8183_svsb_mon_mode:
+	for (idx = 0; idx < svsp->bank_max; idx++) {
+		svsb = &svsp->banks[idx];
+		svsb->mode_support &= ~SVSB_MODE_MON;
+	}
+
+	return true;
+}
+
+int svs_mt8183_platform_probe(struct svs_platform *svsp)
+{
+	struct device *dev;
+	struct svs_bank *svsb;
+	u32 idx;
+
+	dev = svs_add_device_link(svsp, "thermal");
+	if (IS_ERR(dev))
+		return dev_err_probe(svsp->dev, PTR_ERR(dev),
+				     "failed to get thermal device\n");
+
+	for (idx = 0; idx < svsp->bank_max; idx++) {
+		svsb = &svsp->banks[idx];
+
+		switch (svsb->sw_id) {
+		case SVSB_CPU_LITTLE:
+		case SVSB_CPU_BIG:
+			svsb->opp_dev = get_cpu_device(svsb->cpu_id);
+			break;
+		case SVSB_CCI:
+			svsb->opp_dev = svs_add_device_link(svsp, "cci");
+			break;
+		case SVSB_GPU:
+			svsb->opp_dev = svs_add_device_link(svsp, "gpu");
+			break;
+		default:
+			dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
+			return -EINVAL;
+		}
+
+		if (IS_ERR(svsb->opp_dev))
+			return dev_err_probe(svsp->dev, PTR_ERR(svsb->opp_dev),
+					     "failed to get OPP device for bank %d\n",
+					     idx);
+	}
+
+	return 0;
+}
diff --git a/drivers/soc/mediatek/mtk-svs-mt8192.c b/drivers/soc/mediatek/mtk-svs-mt8192.c
new file mode 100644
index 000000000000..838a94834741
--- /dev/null
+++ b/drivers/soc/mediatek/mtk-svs-mt8192.c
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include "mtk-svs.h"
+
+bool svs_mt8192_efuse_parsing(struct svs_platform *svsp)
+{
+	struct svs_bank *svsb;
+	u32 idx, i, vmin, golden_temp;
+	int ret;
+
+	for (i = 0; i < svsp->efuse_max; i++)
+		if (svsp->efuse[i])
+			dev_info(svsp->dev, "M_HW_RES%d: 0x%08x\n",
+				 i, svsp->efuse[i]);
+
+	if (!svsp->efuse[9]) {
+		dev_notice(svsp->dev, "svs_efuse[9] = 0x0?\n");
+		return false;
+	}
+
+	/* Svs efuse parsing */
+	vmin = (svsp->efuse[19] >> 4) & GENMASK(1, 0);
+
+	for (idx = 0; idx < svsp->bank_max; idx++) {
+		svsb = &svsp->banks[idx];
+
+		if (vmin == 0x1)
+			svsb->vmin = 0x1e;
+
+		if (svsb->type == SVSB_LOW) {
+			svsb->mtdes = svsp->efuse[10] & GENMASK(7, 0);
+			svsb->bdes = (svsp->efuse[10] >> 16) & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[10] >> 24) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[17]) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[17] >> 8) & GENMASK(7, 0);
+		} else if (svsb->type == SVSB_HIGH) {
+			svsb->mtdes = svsp->efuse[9] & GENMASK(7, 0);
+			svsb->bdes = (svsp->efuse[9] >> 16) & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[9] >> 24) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[17] >> 16) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[17] >> 24) & GENMASK(7, 0);
+		}
+
+		svsb->vmax += svsb->dvt_fixed;
+	}
+
+	ret = svs_thermal_efuse_get_data(svsp);
+	if (ret)
+		return false;
+
+	for (i = 0; i < svsp->tefuse_max; i++)
+		if (svsp->tefuse[i] != 0)
+			break;
+
+	if (i == svsp->tefuse_max)
+		golden_temp = 50; /* All thermal efuse data are 0 */
+	else
+		golden_temp = (svsp->tefuse[0] >> 24) & GENMASK(7, 0);
+
+	for (idx = 0; idx < svsp->bank_max; idx++) {
+		svsb = &svsp->banks[idx];
+		svsb->mts = 500;
+		svsb->bts = (((500 * golden_temp + 250460) / 1000) - 25) * 4;
+	}
+
+	return true;
+}
+
+int svs_mt8192_platform_probe(struct svs_platform *svsp)
+{
+	struct device *dev;
+	struct svs_bank *svsb;
+	u32 idx;
+
+	svsp->rst = devm_reset_control_get_optional(svsp->dev, "svs_rst");
+	if (IS_ERR(svsp->rst))
+		return dev_err_probe(svsp->dev, PTR_ERR(svsp->rst),
+				     "cannot get svs reset control\n");
+
+	dev = svs_add_device_link(svsp, "lvts");
+	if (IS_ERR(dev))
+		return dev_err_probe(svsp->dev, PTR_ERR(dev),
+				     "failed to get lvts device\n");
+
+	for (idx = 0; idx < svsp->bank_max; idx++) {
+		svsb = &svsp->banks[idx];
+
+		if (svsb->type == SVSB_HIGH)
+			svsb->opp_dev = svs_add_device_link(svsp, "mali");
+		else if (svsb->type == SVSB_LOW)
+			svsb->opp_dev = svs_get_subsys_device(svsp, "mali");
+
+		if (IS_ERR(svsb->opp_dev))
+			return dev_err_probe(svsp->dev, PTR_ERR(svsb->opp_dev),
+					     "failed to get OPP device for bank %d\n",
+					     idx);
+	}
+
+	return 0;
+}
diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
index 482cc8d7e7cf..714eb93160f5 100644
--- a/drivers/soc/mediatek/mtk-svs.c
+++ b/drivers/soc/mediatek/mtk-svs.c
@@ -9,7 +9,6 @@
 #include <linux/completion.h>
 #include <linux/cpuidle.h>
 #include <linux/debugfs.h>
-#include <linux/device.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
@@ -19,40 +18,19 @@
 #include <linux/nvmem-consumer.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
-#include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/pm_domain.h>
 #include <linux/pm_opp.h>
 #include <linux/pm_runtime.h>
 #include <linux/regulator/consumer.h>
-#include <linux/reset.h>
 #include <linux/seq_file.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/thermal.h>
 
-/* svs bank 1-line software id */
-#define SVSB_CPU_LITTLE			BIT(0)
-#define SVSB_CPU_BIG			BIT(1)
-#define SVSB_CCI			BIT(2)
-#define SVSB_GPU			BIT(3)
-
-/* svs bank 2-line type */
-#define SVSB_LOW			BIT(8)
-#define SVSB_HIGH			BIT(9)
-
-/* svs bank mode support */
-#define SVSB_MODE_ALL_DISABLE		0
-#define SVSB_MODE_INIT01		BIT(1)
-#define SVSB_MODE_INIT02		BIT(2)
-#define SVSB_MODE_MON			BIT(3)
-
-/* svs bank volt flags */
-#define SVSB_INIT01_PD_REQ		BIT(0)
-#define SVSB_INIT01_VOLT_IGNORE		BIT(1)
-#define SVSB_INIT01_VOLT_INC_ONLY	BIT(2)
-#define SVSB_MON_VOLT_IGNORE		BIT(16)
-#define SVSB_REMOVE_DVTFIXED_VOLT	BIT(24)
+#include "mtk-svs.h"
+#include "mt8183-svs.h"
+#include "mt8192-svs.h"
 
 /* svs bank register fields and common configuration */
 #define SVSB_PTPCONFIG_DETMAX		GENMASK(15, 0)
@@ -129,129 +107,12 @@
 
 /* svs bank related setting */
 #define BITS8				8
-#define MAX_OPP_ENTRIES			16
 #define REG_BYTES			4
 #define SVSB_DC_SIGNED_BIT		BIT(15)
 #define SVSB_DET_CLK_EN			BIT(31)
 #define SVSB_TEMP_LOWER_BOUND		0xb2
 #define SVSB_TEMP_UPPER_BOUND		0x64
 
-static DEFINE_SPINLOCK(svs_lock);
-
-#define debug_fops_ro(name)						\
-	static int svs_##name##_debug_open(struct inode *inode,		\
-					   struct file *filp)		\
-	{								\
-		return single_open(filp, svs_##name##_debug_show,	\
-				   inode->i_private);			\
-	}								\
-	static const struct file_operations svs_##name##_debug_fops = {	\
-		.owner = THIS_MODULE,					\
-		.open = svs_##name##_debug_open,			\
-		.read = seq_read,					\
-		.llseek = seq_lseek,					\
-		.release = single_release,				\
-	}
-
-#define debug_fops_rw(name)						\
-	static int svs_##name##_debug_open(struct inode *inode,		\
-					   struct file *filp)		\
-	{								\
-		return single_open(filp, svs_##name##_debug_show,	\
-				   inode->i_private);			\
-	}								\
-	static const struct file_operations svs_##name##_debug_fops = {	\
-		.owner = THIS_MODULE,					\
-		.open = svs_##name##_debug_open,			\
-		.read = seq_read,					\
-		.write = svs_##name##_debug_write,			\
-		.llseek = seq_lseek,					\
-		.release = single_release,				\
-	}
-
-#define svs_dentry_data(name)	{__stringify(name), &svs_##name##_debug_fops}
-
-/**
- * enum svsb_phase - svs bank phase enumeration
- * @SVSB_PHASE_ERROR: svs bank encounters unexpected condition
- * @SVSB_PHASE_INIT01: svs bank basic init for data calibration
- * @SVSB_PHASE_INIT02: svs bank can provide voltages to opp table
- * @SVSB_PHASE_MON: svs bank can provide voltages with thermal effect
- * @SVSB_PHASE_MAX: total number of svs bank phase (debug purpose)
- *
- * Each svs bank has its own independent phase and we enable each svs bank by
- * running their phase orderly. However, when svs bank encounters unexpected
- * condition, it will fire an irq (PHASE_ERROR) to inform svs software.
- *
- * svs bank general phase-enabled order:
- * SVSB_PHASE_INIT01 -> SVSB_PHASE_INIT02 -> SVSB_PHASE_MON
- */
-enum svsb_phase {
-	SVSB_PHASE_ERROR = 0,
-	SVSB_PHASE_INIT01,
-	SVSB_PHASE_INIT02,
-	SVSB_PHASE_MON,
-	SVSB_PHASE_MAX,
-};
-
-enum svs_reg_index {
-	DESCHAR = 0,
-	TEMPCHAR,
-	DETCHAR,
-	AGECHAR,
-	DCCONFIG,
-	AGECONFIG,
-	FREQPCT30,
-	FREQPCT74,
-	LIMITVALS,
-	VBOOT,
-	DETWINDOW,
-	CONFIG,
-	TSCALCS,
-	RUNCONFIG,
-	SVSEN,
-	INIT2VALS,
-	DCVALUES,
-	AGEVALUES,
-	VOP30,
-	VOP74,
-	TEMP,
-	INTSTS,
-	INTSTSRAW,
-	INTEN,
-	CHKINT,
-	CHKSHIFT,
-	STATUS,
-	VDESIGN30,
-	VDESIGN74,
-	DVT30,
-	DVT74,
-	AGECOUNT,
-	SMSTATE0,
-	SMSTATE1,
-	CTL0,
-	DESDETSEC,
-	TEMPAGESEC,
-	CTRLSPARE0,
-	CTRLSPARE1,
-	CTRLSPARE2,
-	CTRLSPARE3,
-	CORESEL,
-	THERMINTST,
-	INTST,
-	THSTAGE0ST,
-	THSTAGE1ST,
-	THSTAGE2ST,
-	THAHBST0,
-	THAHBST1,
-	SPARE0,
-	SPARE1,
-	SPARE2,
-	SPARE3,
-	THSLPEVEB,
-	SVS_REG_MAX,
-};
-
 static const u32 svs_regs_v2[] = {
 	[DESCHAR]		= 0xc00,
 	[TEMPCHAR]		= 0xc04,
@@ -309,35 +170,41 @@ static const u32 svs_regs_v2[] = {
 	[THSLPEVEB]		= 0xf30,
 };
 
-/**
- * struct svs_platform - svs platform control
- * @base: svs platform register base
- * @dev: svs platform device
- * @main_clk: main clock for svs bank
- * @pbank: svs bank pointer needing to be protected by spin_lock section
- * @banks: svs banks that svs platform supports
- * @rst: svs platform reset control
- * @efuse_max: total number of svs efuse
- * @tefuse_max: total number of thermal efuse
- * @regs: svs platform registers map
- * @bank_max: total number of svs banks
- * @efuse: svs efuse data received from NVMEM framework
- * @tefuse: thermal efuse data received from NVMEM framework
- */
-struct svs_platform {
-	void __iomem *base;
-	struct device *dev;
-	struct clk *main_clk;
-	struct svs_bank *pbank;
-	struct svs_bank *banks;
-	struct reset_control *rst;
-	size_t efuse_max;
-	size_t tefuse_max;
-	const u32 *regs;
-	u32 bank_max;
-	u32 *efuse;
-	u32 *tefuse;
-};
+static DEFINE_SPINLOCK(svs_lock);
+
+#define debug_fops_ro(name)						\
+	static int svs_##name##_debug_open(struct inode *inode,		\
+					   struct file *filp)		\
+	{								\
+		return single_open(filp, svs_##name##_debug_show,	\
+				   inode->i_private);			\
+	}								\
+	static const struct file_operations svs_##name##_debug_fops = {	\
+		.owner = THIS_MODULE,					\
+		.open = svs_##name##_debug_open,			\
+		.read = seq_read,					\
+		.llseek = seq_lseek,					\
+		.release = single_release,				\
+	}
+
+#define debug_fops_rw(name)						\
+	static int svs_##name##_debug_open(struct inode *inode,		\
+					   struct file *filp)		\
+	{								\
+		return single_open(filp, svs_##name##_debug_show,	\
+				   inode->i_private);			\
+	}								\
+	static const struct file_operations svs_##name##_debug_fops = {	\
+		.owner = THIS_MODULE,					\
+		.open = svs_##name##_debug_open,			\
+		.read = seq_read,					\
+		.write = svs_##name##_debug_write,			\
+		.llseek = seq_lseek,					\
+		.release = single_release,				\
+	}
+
+#define svs_dentry_data(name)	{__stringify(name), &svs_##name##_debug_fops}
+
 
 struct svs_platform_data {
 	char *name;
@@ -348,127 +215,6 @@ struct svs_platform_data {
 	u32 bank_max;
 };
 
-/**
- * struct svs_bank - svs bank representation
- * @dev: bank device
- * @opp_dev: device for opp table/buck control
- * @init_completion: the timeout completion for bank init
- * @buck: regulator used by opp_dev
- * @tzd: thermal zone device for getting temperature
- * @lock: mutex lock to protect voltage update process
- * @set_freq_pct: function pointer to set bank frequency percent table
- * @get_volts: function pointer to get bank voltages
- * @name: bank name
- * @buck_name: regulator name
- * @tzone_name: thermal zone name
- * @phase: bank current phase
- * @volt_od: bank voltage overdrive
- * @reg_data: bank register data in different phase for debug purpose
- * @pm_runtime_enabled_count: bank pm runtime enabled count
- * @mode_support: bank mode support.
- * @freq_base: reference frequency for bank init
- * @turn_freq_base: refenrece frequency for 2-line turn point
- * @vboot: voltage request for bank init01 only
- * @opp_dfreq: default opp frequency table
- * @opp_dvolt: default opp voltage table
- * @freq_pct: frequency percent table for bank init
- * @volt: bank voltage table
- * @volt_step: bank voltage step
- * @volt_base: bank voltage base
- * @volt_flags: bank voltage flags
- * @vmax: bank voltage maximum
- * @vmin: bank voltage minimum
- * @age_config: bank age configuration
- * @age_voffset_in: bank age voltage offset
- * @dc_config: bank dc configuration
- * @dc_voffset_in: bank dc voltage offset
- * @dvt_fixed: bank dvt fixed value
- * @vco: bank VCO value
- * @chk_shift: bank chicken shift
- * @core_sel: bank selection
- * @opp_count: bank opp count
- * @int_st: bank interrupt identification
- * @sw_id: bank software identification
- * @cpu_id: cpu core id for SVS CPU bank use only
- * @ctl0: TS-x selection
- * @temp: bank temperature
- * @tzone_htemp: thermal zone high temperature threshold
- * @tzone_htemp_voffset: thermal zone high temperature voltage offset
- * @tzone_ltemp: thermal zone low temperature threshold
- * @tzone_ltemp_voffset: thermal zone low temperature voltage offset
- * @bts: svs efuse data
- * @mts: svs efuse data
- * @bdes: svs efuse data
- * @mdes: svs efuse data
- * @mtdes: svs efuse data
- * @dcbdet: svs efuse data
- * @dcmdet: svs efuse data
- * @turn_pt: 2-line turn point tells which opp_volt calculated by high/low bank
- * @type: bank type to represent it is 2-line (high/low) bank or 1-line bank
- *
- * Svs bank will generate suitalbe voltages by below general math equation
- * and provide these voltages to opp voltage table.
- *
- * opp_volt[i] = (volt[i] * volt_step) + volt_base;
- */
-struct svs_bank {
-	struct device *dev;
-	struct device *opp_dev;
-	struct completion init_completion;
-	struct regulator *buck;
-	struct thermal_zone_device *tzd;
-	struct mutex lock;	/* lock to protect voltage update process */
-	void (*set_freq_pct)(struct svs_platform *svsp);
-	void (*get_volts)(struct svs_platform *svsp);
-	char *name;
-	char *buck_name;
-	char *tzone_name;
-	enum svsb_phase phase;
-	s32 volt_od;
-	u32 reg_data[SVSB_PHASE_MAX][SVS_REG_MAX];
-	u32 pm_runtime_enabled_count;
-	u32 mode_support;
-	u32 freq_base;
-	u32 turn_freq_base;
-	u32 vboot;
-	u32 opp_dfreq[MAX_OPP_ENTRIES];
-	u32 opp_dvolt[MAX_OPP_ENTRIES];
-	u32 freq_pct[MAX_OPP_ENTRIES];
-	u32 volt[MAX_OPP_ENTRIES];
-	u32 volt_step;
-	u32 volt_base;
-	u32 volt_flags;
-	u32 vmax;
-	u32 vmin;
-	u32 age_config;
-	u32 age_voffset_in;
-	u32 dc_config;
-	u32 dc_voffset_in;
-	u32 dvt_fixed;
-	u32 vco;
-	u32 chk_shift;
-	u32 core_sel;
-	u32 opp_count;
-	u32 int_st;
-	u32 sw_id;
-	u32 cpu_id;
-	u32 ctl0;
-	u32 temp;
-	u32 tzone_htemp;
-	u32 tzone_htemp_voffset;
-	u32 tzone_ltemp;
-	u32 tzone_ltemp_voffset;
-	u32 bts;
-	u32 mts;
-	u32 bdes;
-	u32 mdes;
-	u32 mtdes;
-	u32 dcbdet;
-	u32 dcmdet;
-	u32 turn_pt;
-	u32 type;
-};
-
 static u32 percent(u32 numerator, u32 denominator)
 {
 	/* If not divide 1000, "numerator * 100" will have data overflow. */
@@ -851,7 +597,7 @@ static u32 interpolate(u32 f0, u32 f1, u32 v0, u32 v1, u32 fx)
 	return DIV_ROUND_UP(vx, 100);
 }
 
-static void svs_get_bank_volts_v3(struct svs_platform *svsp)
+void svs_get_bank_volts_v3(struct svs_platform *svsp)
 {
 	struct svs_bank *svsb = svsp->pbank;
 	u32 i, j, *vop, vop74, vop30, turn_pt = svsb->turn_pt;
@@ -943,7 +689,7 @@ static void svs_get_bank_volts_v3(struct svs_platform *svsp)
 			svsb->volt[i] -= svsb->dvt_fixed;
 }
 
-static void svs_set_bank_freq_pct_v3(struct svs_platform *svsp)
+void svs_set_bank_freq_pct_v3(struct svs_platform *svsp)
 {
 	struct svs_bank *svsb = svsp->pbank;
 	u32 i, j, *freq_pct, freq_pct74 = 0, freq_pct30 = 0;
@@ -1026,7 +772,7 @@ static void svs_set_bank_freq_pct_v3(struct svs_platform *svsp)
 	svs_writel_relaxed(svsp, freq_pct30, FREQPCT30);
 }
 
-static void svs_get_bank_volts_v2(struct svs_platform *svsp)
+void svs_get_bank_volts_v2(struct svs_platform *svsp)
 {
 	struct svs_bank *svsb = svsp->pbank;
 	u32 temp, i;
@@ -1060,7 +806,7 @@ static void svs_get_bank_volts_v2(struct svs_platform *svsp)
 		svsb->volt[i] += svsb->volt_od;
 }
 
-static void svs_set_bank_freq_pct_v2(struct svs_platform *svsp)
+void svs_set_bank_freq_pct_v2(struct svs_platform *svsp)
 {
 	struct svs_bank *svsb = svsp->pbank;
 	u32 freqpct74_val, freqpct30_val;
@@ -1701,7 +1447,7 @@ static int svs_bank_resource_setup(struct svs_platform *svsp)
 	return 0;
 }
 
-static int svs_thermal_efuse_get_data(struct svs_platform *svsp)
+int svs_thermal_efuse_get_data(struct svs_platform *svsp)
 {
 	struct nvmem_cell *cell;
 
@@ -1726,262 +1472,6 @@ static int svs_thermal_efuse_get_data(struct svs_platform *svsp)
 	return 0;
 }
 
-static bool svs_mt8192_efuse_parsing(struct svs_platform *svsp)
-{
-	struct svs_bank *svsb;
-	u32 idx, i, vmin, golden_temp;
-	int ret;
-
-	for (i = 0; i < svsp->efuse_max; i++)
-		if (svsp->efuse[i])
-			dev_info(svsp->dev, "M_HW_RES%d: 0x%08x\n",
-				 i, svsp->efuse[i]);
-
-	if (!svsp->efuse[9]) {
-		dev_notice(svsp->dev, "svs_efuse[9] = 0x0?\n");
-		return false;
-	}
-
-	/* Svs efuse parsing */
-	vmin = (svsp->efuse[19] >> 4) & GENMASK(1, 0);
-
-	for (idx = 0; idx < svsp->bank_max; idx++) {
-		svsb = &svsp->banks[idx];
-
-		if (vmin == 0x1)
-			svsb->vmin = 0x1e;
-
-		if (svsb->type == SVSB_LOW) {
-			svsb->mtdes = svsp->efuse[10] & GENMASK(7, 0);
-			svsb->bdes = (svsp->efuse[10] >> 16) & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[10] >> 24) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[17]) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[17] >> 8) & GENMASK(7, 0);
-		} else if (svsb->type == SVSB_HIGH) {
-			svsb->mtdes = svsp->efuse[9] & GENMASK(7, 0);
-			svsb->bdes = (svsp->efuse[9] >> 16) & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[9] >> 24) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[17] >> 16) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[17] >> 24) & GENMASK(7, 0);
-		}
-
-		svsb->vmax += svsb->dvt_fixed;
-	}
-
-	ret = svs_thermal_efuse_get_data(svsp);
-	if (ret)
-		return false;
-
-	for (i = 0; i < svsp->tefuse_max; i++)
-		if (svsp->tefuse[i] != 0)
-			break;
-
-	if (i == svsp->tefuse_max)
-		golden_temp = 50; /* All thermal efuse data are 0 */
-	else
-		golden_temp = (svsp->tefuse[0] >> 24) & GENMASK(7, 0);
-
-	for (idx = 0; idx < svsp->bank_max; idx++) {
-		svsb = &svsp->banks[idx];
-		svsb->mts = 500;
-		svsb->bts = (((500 * golden_temp + 250460) / 1000) - 25) * 4;
-	}
-
-	return true;
-}
-
-static bool svs_mt8183_efuse_parsing(struct svs_platform *svsp)
-{
-	struct svs_bank *svsb;
-	int format[6], x_roomt[6], o_vtsmcu[5], o_vtsabb, tb_roomt = 0;
-	int adc_ge_t, adc_oe_t, ge, oe, gain, degc_cali, adc_cali_en_t;
-	int o_slope, o_slope_sign, ts_id;
-	u32 idx, i, ft_pgm, mts, temp0, temp1, temp2;
-	int ret;
-
-	for (i = 0; i < svsp->efuse_max; i++)
-		if (svsp->efuse[i])
-			dev_info(svsp->dev, "M_HW_RES%d: 0x%08x\n",
-				 i, svsp->efuse[i]);
-
-	if (!svsp->efuse[2]) {
-		dev_notice(svsp->dev, "svs_efuse[2] = 0x0?\n");
-		return false;
-	}
-
-	/* Svs efuse parsing */
-	ft_pgm = (svsp->efuse[0] >> 4) & GENMASK(3, 0);
-
-	for (idx = 0; idx < svsp->bank_max; idx++) {
-		svsb = &svsp->banks[idx];
-
-		if (ft_pgm <= 1)
-			svsb->volt_flags |= SVSB_INIT01_VOLT_IGNORE;
-
-		switch (svsb->sw_id) {
-		case SVSB_CPU_LITTLE:
-			svsb->bdes = svsp->efuse[16] & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[16] >> 8) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[16] >> 16) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[16] >> 24) & GENMASK(7, 0);
-			svsb->mtdes  = (svsp->efuse[17] >> 16) & GENMASK(7, 0);
-
-			if (ft_pgm <= 3)
-				svsb->volt_od += 10;
-			else
-				svsb->volt_od += 2;
-			break;
-		case SVSB_CPU_BIG:
-			svsb->bdes = svsp->efuse[18] & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[18] >> 8) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[18] >> 16) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[18] >> 24) & GENMASK(7, 0);
-			svsb->mtdes  = svsp->efuse[17] & GENMASK(7, 0);
-
-			if (ft_pgm <= 3)
-				svsb->volt_od += 15;
-			else
-				svsb->volt_od += 12;
-			break;
-		case SVSB_CCI:
-			svsb->bdes = svsp->efuse[4] & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[4] >> 8) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[4] >> 16) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[4] >> 24) & GENMASK(7, 0);
-			svsb->mtdes  = (svsp->efuse[5] >> 16) & GENMASK(7, 0);
-
-			if (ft_pgm <= 3)
-				svsb->volt_od += 10;
-			else
-				svsb->volt_od += 2;
-			break;
-		case SVSB_GPU:
-			svsb->bdes = svsp->efuse[6] & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[6] >> 8) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[6] >> 16) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[6] >> 24) & GENMASK(7, 0);
-			svsb->mtdes  = svsp->efuse[5] & GENMASK(7, 0);
-
-			if (ft_pgm >= 2) {
-				svsb->freq_base = 800000000; /* 800MHz */
-				svsb->dvt_fixed = 2;
-			}
-			break;
-		default:
-			dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
-			return false;
-		}
-	}
-
-	ret = svs_thermal_efuse_get_data(svsp);
-	if (ret)
-		return false;
-
-	/* Thermal efuse parsing */
-	adc_ge_t = (svsp->tefuse[1] >> 22) & GENMASK(9, 0);
-	adc_oe_t = (svsp->tefuse[1] >> 12) & GENMASK(9, 0);
-
-	o_vtsmcu[0] = (svsp->tefuse[0] >> 17) & GENMASK(8, 0);
-	o_vtsmcu[1] = (svsp->tefuse[0] >> 8) & GENMASK(8, 0);
-	o_vtsmcu[2] = svsp->tefuse[1] & GENMASK(8, 0);
-	o_vtsmcu[3] = (svsp->tefuse[2] >> 23) & GENMASK(8, 0);
-	o_vtsmcu[4] = (svsp->tefuse[2] >> 5) & GENMASK(8, 0);
-	o_vtsabb = (svsp->tefuse[2] >> 14) & GENMASK(8, 0);
-
-	degc_cali = (svsp->tefuse[0] >> 1) & GENMASK(5, 0);
-	adc_cali_en_t = svsp->tefuse[0] & BIT(0);
-	o_slope_sign = (svsp->tefuse[0] >> 7) & BIT(0);
-
-	ts_id = (svsp->tefuse[1] >> 9) & BIT(0);
-	o_slope = (svsp->tefuse[0] >> 26) & GENMASK(5, 0);
-
-	if (adc_cali_en_t == 1) {
-		if (!ts_id)
-			o_slope = 0;
-
-		if (adc_ge_t < 265 || adc_ge_t > 758 ||
-		    adc_oe_t < 265 || adc_oe_t > 758 ||
-		    o_vtsmcu[0] < -8 || o_vtsmcu[0] > 484 ||
-		    o_vtsmcu[1] < -8 || o_vtsmcu[1] > 484 ||
-		    o_vtsmcu[2] < -8 || o_vtsmcu[2] > 484 ||
-		    o_vtsmcu[3] < -8 || o_vtsmcu[3] > 484 ||
-		    o_vtsmcu[4] < -8 || o_vtsmcu[4] > 484 ||
-		    o_vtsabb < -8 || o_vtsabb > 484 ||
-		    degc_cali < 1 || degc_cali > 63) {
-			dev_err(svsp->dev, "bad thermal efuse, no mon mode\n");
-			goto remove_mt8183_svsb_mon_mode;
-		}
-	} else {
-		dev_err(svsp->dev, "no thermal efuse, no mon mode\n");
-		goto remove_mt8183_svsb_mon_mode;
-	}
-
-	ge = ((adc_ge_t - 512) * 10000) / 4096;
-	oe = (adc_oe_t - 512);
-	gain = (10000 + ge);
-
-	format[0] = (o_vtsmcu[0] + 3350 - oe);
-	format[1] = (o_vtsmcu[1] + 3350 - oe);
-	format[2] = (o_vtsmcu[2] + 3350 - oe);
-	format[3] = (o_vtsmcu[3] + 3350 - oe);
-	format[4] = (o_vtsmcu[4] + 3350 - oe);
-	format[5] = (o_vtsabb + 3350 - oe);
-
-	for (i = 0; i < 6; i++)
-		x_roomt[i] = (((format[i] * 10000) / 4096) * 10000) / gain;
-
-	temp0 = (10000 * 100000 / gain) * 15 / 18;
-
-	if (!o_slope_sign)
-		mts = (temp0 * 10) / (1534 + o_slope * 10);
-	else
-		mts = (temp0 * 10) / (1534 - o_slope * 10);
-
-	for (idx = 0; idx < svsp->bank_max; idx++) {
-		svsb = &svsp->banks[idx];
-		svsb->mts = mts;
-
-		switch (svsb->sw_id) {
-		case SVSB_CPU_LITTLE:
-			tb_roomt = x_roomt[3];
-			break;
-		case SVSB_CPU_BIG:
-			tb_roomt = x_roomt[4];
-			break;
-		case SVSB_CCI:
-			tb_roomt = x_roomt[3];
-			break;
-		case SVSB_GPU:
-			tb_roomt = x_roomt[1];
-			break;
-		default:
-			dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
-			goto remove_mt8183_svsb_mon_mode;
-		}
-
-		temp0 = (degc_cali * 10 / 2);
-		temp1 = ((10000 * 100000 / 4096 / gain) *
-			 oe + tb_roomt * 10) * 15 / 18;
-
-		if (!o_slope_sign)
-			temp2 = temp1 * 100 / (1534 + o_slope * 10);
-		else
-			temp2 = temp1 * 100 / (1534 - o_slope * 10);
-
-		svsb->bts = (temp0 + temp2 - 250) * 4 / 10;
-	}
-
-	return true;
-
-remove_mt8183_svsb_mon_mode:
-	for (idx = 0; idx < svsp->bank_max; idx++) {
-		svsb = &svsp->banks[idx];
-		svsb->mode_support &= ~SVSB_MODE_MON;
-	}
-
-	return true;
-}
-
 static bool svs_is_efuse_data_correct(struct svs_platform *svsp)
 {
 	struct nvmem_cell *cell;
@@ -2008,7 +1498,7 @@ static bool svs_is_efuse_data_correct(struct svs_platform *svsp)
 	return true;
 }
 
-static struct device *svs_get_subsys_device(struct svs_platform *svsp,
+struct device *svs_get_subsys_device(struct svs_platform *svsp,
 					    const char *node_name)
 {
 	struct platform_device *pdev;
@@ -2032,7 +1522,7 @@ static struct device *svs_get_subsys_device(struct svs_platform *svsp,
 	return &pdev->dev;
 }
 
-static struct device *svs_add_device_link(struct svs_platform *svsp,
+struct device *svs_add_device_link(struct svs_platform *svsp,
 					  const char *node_name)
 {
 	struct device *dev;
@@ -2060,237 +1550,6 @@ static struct device *svs_add_device_link(struct svs_platform *svsp,
 	return dev;
 }
 
-static int svs_mt8192_platform_probe(struct svs_platform *svsp)
-{
-	struct device *dev;
-	struct svs_bank *svsb;
-	u32 idx;
-
-	svsp->rst = devm_reset_control_get_optional(svsp->dev, "svs_rst");
-	if (IS_ERR(svsp->rst))
-		return dev_err_probe(svsp->dev, PTR_ERR(svsp->rst),
-				     "cannot get svs reset control\n");
-
-	dev = svs_add_device_link(svsp, "lvts");
-	if (IS_ERR(dev))
-		return dev_err_probe(svsp->dev, PTR_ERR(dev),
-				     "failed to get lvts device\n");
-
-	for (idx = 0; idx < svsp->bank_max; idx++) {
-		svsb = &svsp->banks[idx];
-
-		if (svsb->type == SVSB_HIGH)
-			svsb->opp_dev = svs_add_device_link(svsp, "mali");
-		else if (svsb->type == SVSB_LOW)
-			svsb->opp_dev = svs_get_subsys_device(svsp, "mali");
-
-		if (IS_ERR(svsb->opp_dev))
-			return dev_err_probe(svsp->dev, PTR_ERR(svsb->opp_dev),
-					     "failed to get OPP device for bank %d\n",
-					     idx);
-	}
-
-	return 0;
-}
-
-static int svs_mt8183_platform_probe(struct svs_platform *svsp)
-{
-	struct device *dev;
-	struct svs_bank *svsb;
-	u32 idx;
-
-	dev = svs_add_device_link(svsp, "thermal");
-	if (IS_ERR(dev))
-		return dev_err_probe(svsp->dev, PTR_ERR(dev),
-				     "failed to get thermal device\n");
-
-	for (idx = 0; idx < svsp->bank_max; idx++) {
-		svsb = &svsp->banks[idx];
-
-		switch (svsb->sw_id) {
-		case SVSB_CPU_LITTLE:
-		case SVSB_CPU_BIG:
-			svsb->opp_dev = get_cpu_device(svsb->cpu_id);
-			break;
-		case SVSB_CCI:
-			svsb->opp_dev = svs_add_device_link(svsp, "cci");
-			break;
-		case SVSB_GPU:
-			svsb->opp_dev = svs_add_device_link(svsp, "gpu");
-			break;
-		default:
-			dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
-			return -EINVAL;
-		}
-
-		if (IS_ERR(svsb->opp_dev))
-			return dev_err_probe(svsp->dev, PTR_ERR(svsb->opp_dev),
-					     "failed to get OPP device for bank %d\n",
-					     idx);
-	}
-
-	return 0;
-}
-
-static struct svs_bank svs_mt8192_banks[] = {
-	{
-		.sw_id			= SVSB_GPU,
-		.type			= SVSB_LOW,
-		.set_freq_pct		= svs_set_bank_freq_pct_v3,
-		.get_volts		= svs_get_bank_volts_v3,
-		.volt_flags		= SVSB_REMOVE_DVTFIXED_VOLT,
-		.mode_support		= SVSB_MODE_INIT02,
-		.opp_count		= MAX_OPP_ENTRIES,
-		.freq_base		= 688000000,
-		.turn_freq_base		= 688000000,
-		.volt_step		= 6250,
-		.volt_base		= 400000,
-		.vmax			= 0x60,
-		.vmin			= 0x1a,
-		.age_config		= 0x555555,
-		.dc_config		= 0x1,
-		.dvt_fixed		= 0x1,
-		.vco			= 0x18,
-		.chk_shift		= 0x87,
-		.core_sel		= 0x0fff0100,
-		.int_st			= BIT(0),
-		.ctl0			= 0x00540003,
-	},
-	{
-		.sw_id			= SVSB_GPU,
-		.type			= SVSB_HIGH,
-		.set_freq_pct		= svs_set_bank_freq_pct_v3,
-		.get_volts		= svs_get_bank_volts_v3,
-		.tzone_name		= "gpu1",
-		.volt_flags		= SVSB_REMOVE_DVTFIXED_VOLT |
-					  SVSB_MON_VOLT_IGNORE,
-		.mode_support		= SVSB_MODE_INIT02 | SVSB_MODE_MON,
-		.opp_count		= MAX_OPP_ENTRIES,
-		.freq_base		= 902000000,
-		.turn_freq_base		= 688000000,
-		.volt_step		= 6250,
-		.volt_base		= 400000,
-		.vmax			= 0x60,
-		.vmin			= 0x1a,
-		.age_config		= 0x555555,
-		.dc_config		= 0x1,
-		.dvt_fixed		= 0x6,
-		.vco			= 0x18,
-		.chk_shift		= 0x87,
-		.core_sel		= 0x0fff0101,
-		.int_st			= BIT(1),
-		.ctl0			= 0x00540003,
-		.tzone_htemp		= 85000,
-		.tzone_htemp_voffset	= 0,
-		.tzone_ltemp		= 25000,
-		.tzone_ltemp_voffset	= 7,
-	},
-};
-
-static struct svs_bank svs_mt8183_banks[] = {
-	{
-		.sw_id			= SVSB_CPU_LITTLE,
-		.set_freq_pct		= svs_set_bank_freq_pct_v2,
-		.get_volts		= svs_get_bank_volts_v2,
-		.cpu_id			= 0,
-		.buck_name		= "proc",
-		.volt_flags		= SVSB_INIT01_VOLT_INC_ONLY,
-		.mode_support		= SVSB_MODE_INIT01 | SVSB_MODE_INIT02,
-		.opp_count		= MAX_OPP_ENTRIES,
-		.freq_base		= 1989000000,
-		.vboot			= 0x30,
-		.volt_step		= 6250,
-		.volt_base		= 500000,
-		.vmax			= 0x64,
-		.vmin			= 0x18,
-		.age_config		= 0x555555,
-		.dc_config		= 0x555555,
-		.dvt_fixed		= 0x7,
-		.vco			= 0x10,
-		.chk_shift		= 0x77,
-		.core_sel		= 0x8fff0000,
-		.int_st			= BIT(0),
-		.ctl0			= 0x00010001,
-	},
-	{
-		.sw_id			= SVSB_CPU_BIG,
-		.set_freq_pct		= svs_set_bank_freq_pct_v2,
-		.get_volts		= svs_get_bank_volts_v2,
-		.cpu_id			= 4,
-		.buck_name		= "proc",
-		.volt_flags		= SVSB_INIT01_VOLT_INC_ONLY,
-		.mode_support		= SVSB_MODE_INIT01 | SVSB_MODE_INIT02,
-		.opp_count		= MAX_OPP_ENTRIES,
-		.freq_base		= 1989000000,
-		.vboot			= 0x30,
-		.volt_step		= 6250,
-		.volt_base		= 500000,
-		.vmax			= 0x58,
-		.vmin			= 0x10,
-		.age_config		= 0x555555,
-		.dc_config		= 0x555555,
-		.dvt_fixed		= 0x7,
-		.vco			= 0x10,
-		.chk_shift		= 0x77,
-		.core_sel		= 0x8fff0001,
-		.int_st			= BIT(1),
-		.ctl0			= 0x00000001,
-	},
-	{
-		.sw_id			= SVSB_CCI,
-		.set_freq_pct		= svs_set_bank_freq_pct_v2,
-		.get_volts		= svs_get_bank_volts_v2,
-		.buck_name		= "proc",
-		.volt_flags		= SVSB_INIT01_VOLT_INC_ONLY,
-		.mode_support		= SVSB_MODE_INIT01 | SVSB_MODE_INIT02,
-		.opp_count		= MAX_OPP_ENTRIES,
-		.freq_base		= 1196000000,
-		.vboot			= 0x30,
-		.volt_step		= 6250,
-		.volt_base		= 500000,
-		.vmax			= 0x64,
-		.vmin			= 0x18,
-		.age_config		= 0x555555,
-		.dc_config		= 0x555555,
-		.dvt_fixed		= 0x7,
-		.vco			= 0x10,
-		.chk_shift		= 0x77,
-		.core_sel		= 0x8fff0002,
-		.int_st			= BIT(2),
-		.ctl0			= 0x00100003,
-	},
-	{
-		.sw_id			= SVSB_GPU,
-		.set_freq_pct		= svs_set_bank_freq_pct_v2,
-		.get_volts		= svs_get_bank_volts_v2,
-		.buck_name		= "mali",
-		.tzone_name		= "tzts2",
-		.volt_flags		= SVSB_INIT01_PD_REQ |
-					  SVSB_INIT01_VOLT_INC_ONLY,
-		.mode_support		= SVSB_MODE_INIT01 | SVSB_MODE_INIT02 |
-					  SVSB_MODE_MON,
-		.opp_count		= MAX_OPP_ENTRIES,
-		.freq_base		= 900000000,
-		.vboot			= 0x30,
-		.volt_step		= 6250,
-		.volt_base		= 500000,
-		.vmax			= 0x40,
-		.vmin			= 0x14,
-		.age_config		= 0x555555,
-		.dc_config		= 0x555555,
-		.dvt_fixed		= 0x3,
-		.vco			= 0x10,
-		.chk_shift		= 0x77,
-		.core_sel		= 0x8fff0003,
-		.int_st			= BIT(3),
-		.ctl0			= 0x00050001,
-		.tzone_htemp		= 85000,
-		.tzone_htemp_voffset	= 0,
-		.tzone_ltemp		= 25000,
-		.tzone_ltemp_voffset	= 3,
-	},
-};
-
 static const struct svs_platform_data svs_mt8192_platform_data = {
 	.name = "mt8192-svs",
 	.banks = svs_mt8192_banks,
diff --git a/drivers/soc/mediatek/mtk-svs.h b/drivers/soc/mediatek/mtk-svs.h
new file mode 100644
index 000000000000..dca414181066
--- /dev/null
+++ b/drivers/soc/mediatek/mtk-svs.h
@@ -0,0 +1,279 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __DRV_SVS_MTK_H
+#define __DRV_SVS_MTK_H
+
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/reset.h>
+
+/* svs bank 1-line software id */
+#define SVSB_CPU_LITTLE			BIT(0)
+#define SVSB_CPU_BIG			BIT(1)
+#define SVSB_CCI			BIT(2)
+#define SVSB_GPU			BIT(3)
+
+/* svs bank 2-line type */
+#define SVSB_LOW			BIT(8)
+#define SVSB_HIGH			BIT(9)
+
+/* svs bank mode support */
+#define SVSB_MODE_ALL_DISABLE		0
+#define SVSB_MODE_INIT01		BIT(1)
+#define SVSB_MODE_INIT02		BIT(2)
+#define SVSB_MODE_MON			BIT(3)
+
+/* svs bank volt flags */
+#define SVSB_INIT01_PD_REQ		BIT(0)
+#define SVSB_INIT01_VOLT_IGNORE		BIT(1)
+#define SVSB_INIT01_VOLT_INC_ONLY	BIT(2)
+#define SVSB_MON_VOLT_IGNORE		BIT(16)
+#define SVSB_REMOVE_DVTFIXED_VOLT	BIT(24)
+
+/**
+ * enum svsb_phase - svs bank phase enumeration
+ * @SVSB_PHASE_ERROR: svs bank encounters unexpected condition
+ * @SVSB_PHASE_INIT01: svs bank basic init for data calibration
+ * @SVSB_PHASE_INIT02: svs bank can provide voltages to opp table
+ * @SVSB_PHASE_MON: svs bank can provide voltages with thermal effect
+ * @SVSB_PHASE_MAX: total number of svs bank phase (debug purpose)
+ *
+ * Each svs bank has its own independent phase and we enable each svs bank by
+ * running their phase orderly. However, when svs bank encounters unexpected
+ * condition, it will fire an irq (PHASE_ERROR) to inform svs software.
+ *
+ * svs bank general phase-enabled order:
+ * SVSB_PHASE_INIT01 -> SVSB_PHASE_INIT02 -> SVSB_PHASE_MON
+ */
+enum svsb_phase {
+	SVSB_PHASE_ERROR = 0,
+	SVSB_PHASE_INIT01,
+	SVSB_PHASE_INIT02,
+	SVSB_PHASE_MON,
+	SVSB_PHASE_MAX,
+};
+
+enum svs_reg_index {
+	DESCHAR = 0,
+	TEMPCHAR,
+	DETCHAR,
+	AGECHAR,
+	DCCONFIG,
+	AGECONFIG,
+	FREQPCT30,
+	FREQPCT74,
+	LIMITVALS,
+	VBOOT,
+	DETWINDOW,
+	CONFIG,
+	TSCALCS,
+	RUNCONFIG,
+	SVSEN,
+	INIT2VALS,
+	DCVALUES,
+	AGEVALUES,
+	VOP30,
+	VOP74,
+	TEMP,
+	INTSTS,
+	INTSTSRAW,
+	INTEN,
+	CHKINT,
+	CHKSHIFT,
+	STATUS,
+	VDESIGN30,
+	VDESIGN74,
+	DVT30,
+	DVT74,
+	AGECOUNT,
+	SMSTATE0,
+	SMSTATE1,
+	CTL0,
+	DESDETSEC,
+	TEMPAGESEC,
+	CTRLSPARE0,
+	CTRLSPARE1,
+	CTRLSPARE2,
+	CTRLSPARE3,
+	CORESEL,
+	THERMINTST,
+	INTST,
+	THSTAGE0ST,
+	THSTAGE1ST,
+	THSTAGE2ST,
+	THAHBST0,
+	THAHBST1,
+	SPARE0,
+	SPARE1,
+	SPARE2,
+	SPARE3,
+	THSLPEVEB,
+	SVS_REG_MAX,
+};
+
+/**
+ * struct svs_platform - svs platform control
+ * @base: svs platform register base
+ * @dev: svs platform device
+ * @main_clk: main clock for svs bank
+ * @pbank: svs bank pointer needing to be protected by spin_lock section
+ * @banks: svs banks that svs platform supports
+ * @rst: svs platform reset control
+ * @efuse_max: total number of svs efuse
+ * @tefuse_max: total number of thermal efuse
+ * @regs: svs platform registers map
+ * @bank_max: total number of svs banks
+ * @efuse: svs efuse data received from NVMEM framework
+ * @tefuse: thermal efuse data received from NVMEM framework
+ */
+struct svs_platform {
+	void __iomem *base;
+	struct device *dev;
+	struct clk *main_clk;
+	struct svs_bank *pbank;
+	struct svs_bank *banks;
+	struct reset_control *rst;
+	size_t efuse_max;
+	size_t tefuse_max;
+	const u32 *regs;
+	u32 bank_max;
+	u32 *efuse;
+	u32 *tefuse;
+};
+
+#define MAX_OPP_ENTRIES			16
+
+/**
+ * struct svs_bank - svs bank representation
+ * @dev: bank device
+ * @opp_dev: device for opp table/buck control
+ * @init_completion: the timeout completion for bank init
+ * @buck: regulator used by opp_dev
+ * @tzd: thermal zone device for getting temperature
+ * @lock: mutex lock to protect voltage update process
+ * @set_freq_pct: function pointer to set bank frequency percent table
+ * @get_volts: function pointer to get bank voltages
+ * @name: bank name
+ * @buck_name: regulator name
+ * @tzone_name: thermal zone name
+ * @phase: bank current phase
+ * @volt_od: bank voltage overdrive
+ * @reg_data: bank register data in different phase for debug purpose
+ * @pm_runtime_enabled_count: bank pm runtime enabled count
+ * @mode_support: bank mode support.
+ * @freq_base: reference frequency for bank init
+ * @turn_freq_base: refenrece frequency for 2-line turn point
+ * @vboot: voltage request for bank init01 only
+ * @opp_dfreq: default opp frequency table
+ * @opp_dvolt: default opp voltage table
+ * @freq_pct: frequency percent table for bank init
+ * @volt: bank voltage table
+ * @volt_step: bank voltage step
+ * @volt_base: bank voltage base
+ * @volt_flags: bank voltage flags
+ * @vmax: bank voltage maximum
+ * @vmin: bank voltage minimum
+ * @age_config: bank age configuration
+ * @age_voffset_in: bank age voltage offset
+ * @dc_config: bank dc configuration
+ * @dc_voffset_in: bank dc voltage offset
+ * @dvt_fixed: bank dvt fixed value
+ * @vco: bank VCO value
+ * @chk_shift: bank chicken shift
+ * @core_sel: bank selection
+ * @opp_count: bank opp count
+ * @int_st: bank interrupt identification
+ * @sw_id: bank software identification
+ * @cpu_id: cpu core id for SVS CPU bank use only
+ * @ctl0: TS-x selection
+ * @temp: bank temperature
+ * @tzone_htemp: thermal zone high temperature threshold
+ * @tzone_htemp_voffset: thermal zone high temperature voltage offset
+ * @tzone_ltemp: thermal zone low temperature threshold
+ * @tzone_ltemp_voffset: thermal zone low temperature voltage offset
+ * @bts: svs efuse data
+ * @mts: svs efuse data
+ * @bdes: svs efuse data
+ * @mdes: svs efuse data
+ * @mtdes: svs efuse data
+ * @dcbdet: svs efuse data
+ * @dcmdet: svs efuse data
+ * @turn_pt: 2-line turn point tells which opp_volt calculated by high/low bank
+ * @type: bank type to represent it is 2-line (high/low) bank or 1-line bank
+ *
+ * Svs bank will generate suitalbe voltages by below general math equation
+ * and provide these voltages to opp voltage table.
+ *
+ * opp_volt[i] = (volt[i] * volt_step) + volt_base;
+ */
+struct svs_bank {
+	struct device *dev;
+	struct device *opp_dev;
+	struct completion init_completion;
+	struct regulator *buck;
+	struct thermal_zone_device *tzd;
+	struct mutex lock;	/* lock to protect voltage update process */
+	void (*set_freq_pct)(struct svs_platform *svsp);
+	void (*get_volts)(struct svs_platform *svsp);
+	char *name;
+	char *buck_name;
+	char *tzone_name;
+	enum svsb_phase phase;
+	s32 volt_od;
+	u32 reg_data[SVSB_PHASE_MAX][SVS_REG_MAX];
+	u32 pm_runtime_enabled_count;
+	u32 mode_support;
+	u32 freq_base;
+	u32 turn_freq_base;
+	u32 vboot;
+	u32 opp_dfreq[MAX_OPP_ENTRIES];
+	u32 opp_dvolt[MAX_OPP_ENTRIES];
+	u32 freq_pct[MAX_OPP_ENTRIES];
+	u32 volt[MAX_OPP_ENTRIES];
+	u32 volt_step;
+	u32 volt_base;
+	u32 volt_flags;
+	u32 vmax;
+	u32 vmin;
+	u32 age_config;
+	u32 age_voffset_in;
+	u32 dc_config;
+	u32 dc_voffset_in;
+	u32 dvt_fixed;
+	u32 vco;
+	u32 chk_shift;
+	u32 core_sel;
+	u32 opp_count;
+	u32 int_st;
+	u32 sw_id;
+	u32 cpu_id;
+	u32 ctl0;
+	u32 temp;
+	u32 tzone_htemp;
+	u32 tzone_htemp_voffset;
+	u32 tzone_ltemp;
+	u32 tzone_ltemp_voffset;
+	u32 bts;
+	u32 mts;
+	u32 bdes;
+	u32 mdes;
+	u32 mtdes;
+	u32 dcbdet;
+	u32 dcmdet;
+	u32 turn_pt;
+	u32 type;
+};
+
+struct device *svs_add_device_link(struct svs_platform *svsp,
+					  const char *node_name);
+struct device *svs_get_subsys_device(struct svs_platform *svsp,
+					    const char *node_name);
+int svs_thermal_efuse_get_data(struct svs_platform *svsp);
+
+void svs_get_bank_volts_v2(struct svs_platform *svsp);
+void svs_set_bank_freq_pct_v2(struct svs_platform *svsp);
+
+void svs_get_bank_volts_v3(struct svs_platform *svsp);
+void svs_set_bank_freq_pct_v3(struct svs_platform *svsp);
+#endif
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 6/8] soc: mtk-svs: mt8183: Move thermal parsing in new function
  2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
                   ` (4 preceding siblings ...)
  2022-09-28 15:55 ` [PATCH 5/8] soc: mediatek: mtk-svs: Move SoC specific functions to new files matthias.bgg
@ 2022-09-28 15:55 ` matthias.bgg
  2022-09-29  8:26   ` AngeloGioacchino Del Regno
  2022-09-28 15:55 ` [PATCH 7/8] soc: mtk-svs: mt8183: refactor o_slope calculation matthias.bgg
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 20+ messages in thread
From: matthias.bgg @ 2022-09-28 15:55 UTC (permalink / raw)
  To: roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger

From: Matthias Brugger <matthias.bgg@gmail.com>

We jumpt to lable remove_mt8183_svsb_mon_mode from different error path
in the code. Move the thermal parsing in a new function will allow us to
refactor the code in a subsequent patch. No behavioural changes from
this commit.

Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
---

 drivers/soc/mediatek/mtk-svs-mt8183.c | 183 +++++++++++++-------------
 1 file changed, 95 insertions(+), 88 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-svs-mt8183.c b/drivers/soc/mediatek/mtk-svs-mt8183.c
index a97fcae59dd7..4b538cdefc86 100644
--- a/drivers/soc/mediatek/mtk-svs-mt8183.c
+++ b/drivers/soc/mediatek/mtk-svs-mt8183.c
@@ -2,94 +2,14 @@
 
 #include "mtk-svs.h"
 
-bool svs_mt8183_efuse_parsing(struct svs_platform *svsp)
+static int svs_mt8183_efuse_thermal_parsing(struct svs_platform *svsp)
 {
 	struct svs_bank *svsb;
 	int format[6], x_roomt[6], o_vtsmcu[5], o_vtsabb, tb_roomt = 0;
 	int adc_ge_t, adc_oe_t, ge, oe, gain, degc_cali, adc_cali_en_t;
 	int o_slope, o_slope_sign, ts_id;
-	u32 idx, i, ft_pgm, mts, temp0, temp1, temp2;
-	int ret;
-
-	for (i = 0; i < svsp->efuse_max; i++)
-		if (svsp->efuse[i])
-			dev_info(svsp->dev, "M_HW_RES%d: 0x%08x\n",
-				 i, svsp->efuse[i]);
-
-	if (!svsp->efuse[2]) {
-		dev_notice(svsp->dev, "svs_efuse[2] = 0x0?\n");
-		return false;
-	}
-
-	/* Svs efuse parsing */
-	ft_pgm = (svsp->efuse[0] >> 4) & GENMASK(3, 0);
-
-	for (idx = 0; idx < svsp->bank_max; idx++) {
-		svsb = &svsp->banks[idx];
-
-		if (ft_pgm <= 1)
-			svsb->volt_flags |= SVSB_INIT01_VOLT_IGNORE;
+	u32 idx, i, mts, temp0, temp1, temp2;
 
-		switch (svsb->sw_id) {
-		case SVSB_CPU_LITTLE:
-			svsb->bdes = svsp->efuse[16] & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[16] >> 8) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[16] >> 16) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[16] >> 24) & GENMASK(7, 0);
-			svsb->mtdes  = (svsp->efuse[17] >> 16) & GENMASK(7, 0);
-
-			if (ft_pgm <= 3)
-				svsb->volt_od += 10;
-			else
-				svsb->volt_od += 2;
-			break;
-		case SVSB_CPU_BIG:
-			svsb->bdes = svsp->efuse[18] & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[18] >> 8) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[18] >> 16) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[18] >> 24) & GENMASK(7, 0);
-			svsb->mtdes  = svsp->efuse[17] & GENMASK(7, 0);
-
-			if (ft_pgm <= 3)
-				svsb->volt_od += 15;
-			else
-				svsb->volt_od += 12;
-			break;
-		case SVSB_CCI:
-			svsb->bdes = svsp->efuse[4] & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[4] >> 8) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[4] >> 16) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[4] >> 24) & GENMASK(7, 0);
-			svsb->mtdes  = (svsp->efuse[5] >> 16) & GENMASK(7, 0);
-
-			if (ft_pgm <= 3)
-				svsb->volt_od += 10;
-			else
-				svsb->volt_od += 2;
-			break;
-		case SVSB_GPU:
-			svsb->bdes = svsp->efuse[6] & GENMASK(7, 0);
-			svsb->mdes = (svsp->efuse[6] >> 8) & GENMASK(7, 0);
-			svsb->dcbdet = (svsp->efuse[6] >> 16) & GENMASK(7, 0);
-			svsb->dcmdet = (svsp->efuse[6] >> 24) & GENMASK(7, 0);
-			svsb->mtdes  = svsp->efuse[5] & GENMASK(7, 0);
-
-			if (ft_pgm >= 2) {
-				svsb->freq_base = 800000000; /* 800MHz */
-				svsb->dvt_fixed = 2;
-			}
-			break;
-		default:
-			dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
-			return false;
-		}
-	}
-
-	ret = svs_thermal_efuse_get_data(svsp);
-	if (ret)
-		return false;
-
-	/* Thermal efuse parsing */
 	adc_ge_t = (svsp->tefuse[1] >> 22) & GENMASK(9, 0);
 	adc_oe_t = (svsp->tefuse[1] >> 12) & GENMASK(9, 0);
 
@@ -121,11 +41,11 @@ bool svs_mt8183_efuse_parsing(struct svs_platform *svsp)
 		    o_vtsabb < -8 || o_vtsabb > 484 ||
 		    degc_cali < 1 || degc_cali > 63) {
 			dev_err(svsp->dev, "bad thermal efuse, no mon mode\n");
-			goto remove_mt8183_svsb_mon_mode;
+			return -1;
 		}
 	} else {
 		dev_err(svsp->dev, "no thermal efuse, no mon mode\n");
-		goto remove_mt8183_svsb_mon_mode;
+		return -1;
 	}
 
 	ge = ((adc_ge_t - 512) * 10000) / 4096;
@@ -168,7 +88,7 @@ bool svs_mt8183_efuse_parsing(struct svs_platform *svsp)
 			break;
 		default:
 			dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
-			goto remove_mt8183_svsb_mon_mode;
+			return -1;
 		}
 
 		temp0 = (degc_cali * 10 / 2);
@@ -183,12 +103,99 @@ bool svs_mt8183_efuse_parsing(struct svs_platform *svsp)
 		svsb->bts = (temp0 + temp2 - 250) * 4 / 10;
 	}
 
-	return true;
+	return 0;
+}
+
+bool svs_mt8183_efuse_parsing(struct svs_platform *svsp)
+{
+	struct svs_bank *svsb;
+	u32 idx, i, ft_pgm;
+	int ret;
+
+	for (i = 0; i < svsp->efuse_max; i++)
+		if (svsp->efuse[i])
+			dev_info(svsp->dev, "M_HW_RES%d: 0x%08x\n",
+				 i, svsp->efuse[i]);
+
+	if (!svsp->efuse[2]) {
+		dev_notice(svsp->dev, "svs_efuse[2] = 0x0?\n");
+		return false;
+	}
+
+	/* Svs efuse parsing */
+	ft_pgm = (svsp->efuse[0] >> 4) & GENMASK(3, 0);
 
-remove_mt8183_svsb_mon_mode:
 	for (idx = 0; idx < svsp->bank_max; idx++) {
 		svsb = &svsp->banks[idx];
-		svsb->mode_support &= ~SVSB_MODE_MON;
+
+		if (ft_pgm <= 1)
+			svsb->volt_flags |= SVSB_INIT01_VOLT_IGNORE;
+
+		switch (svsb->sw_id) {
+		case SVSB_CPU_LITTLE:
+			svsb->bdes = svsp->efuse[16] & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[16] >> 8) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[16] >> 16) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[16] >> 24) & GENMASK(7, 0);
+			svsb->mtdes  = (svsp->efuse[17] >> 16) & GENMASK(7, 0);
+
+			if (ft_pgm <= 3)
+				svsb->volt_od += 10;
+			else
+				svsb->volt_od += 2;
+			break;
+		case SVSB_CPU_BIG:
+			svsb->bdes = svsp->efuse[18] & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[18] >> 8) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[18] >> 16) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[18] >> 24) & GENMASK(7, 0);
+			svsb->mtdes  = svsp->efuse[17] & GENMASK(7, 0);
+
+			if (ft_pgm <= 3)
+				svsb->volt_od += 15;
+			else
+				svsb->volt_od += 12;
+			break;
+		case SVSB_CCI:
+			svsb->bdes = svsp->efuse[4] & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[4] >> 8) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[4] >> 16) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[4] >> 24) & GENMASK(7, 0);
+			svsb->mtdes  = (svsp->efuse[5] >> 16) & GENMASK(7, 0);
+
+			if (ft_pgm <= 3)
+				svsb->volt_od += 10;
+			else
+				svsb->volt_od += 2;
+			break;
+		case SVSB_GPU:
+			svsb->bdes = svsp->efuse[6] & GENMASK(7, 0);
+			svsb->mdes = (svsp->efuse[6] >> 8) & GENMASK(7, 0);
+			svsb->dcbdet = (svsp->efuse[6] >> 16) & GENMASK(7, 0);
+			svsb->dcmdet = (svsp->efuse[6] >> 24) & GENMASK(7, 0);
+			svsb->mtdes  = svsp->efuse[5] & GENMASK(7, 0);
+
+			if (ft_pgm >= 2) {
+				svsb->freq_base = 800000000; /* 800MHz */
+				svsb->dvt_fixed = 2;
+			}
+			break;
+		default:
+			dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
+			return false;
+		}
+	}
+
+	ret = svs_thermal_efuse_get_data(svsp);
+	if (ret)
+		return false;
+
+	ret = svs_mt8183_efuse_thermal_parsing(svsp);
+	if (ret) {
+		for (idx = 0; idx < svsp->bank_max; idx++) {
+			svsb = &svsp->banks[idx];
+			svsb->mode_support &= ~SVSB_MODE_MON;
+		}
 	}
 
 	return true;
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 7/8] soc: mtk-svs: mt8183: refactor o_slope calculation
  2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
                   ` (5 preceding siblings ...)
  2022-09-28 15:55 ` [PATCH 6/8] soc: mtk-svs: mt8183: Move thermal parsing in new function matthias.bgg
@ 2022-09-28 15:55 ` matthias.bgg
  2022-09-28 15:55 ` [PATCH 8/8] soc: mtk-svs: mt8192: fix bank data matthias.bgg
  2022-10-06 11:43 ` [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver Roger Lu
  8 siblings, 0 replies; 20+ messages in thread
From: matthias.bgg @ 2022-09-28 15:55 UTC (permalink / raw)
  To: roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger

From: Matthias Brugger <matthias.bgg@gmail.com>

The o_slope value is dependent of the o_slope_sign, refactor code to get
rid of unnecessary if constructs.

Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
---

 drivers/soc/mediatek/mtk-svs-mt8183.c | 54 ++++++++++++---------------
 1 file changed, 24 insertions(+), 30 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-svs-mt8183.c b/drivers/soc/mediatek/mtk-svs-mt8183.c
index 4b538cdefc86..7f7d5cd6be35 100644
--- a/drivers/soc/mediatek/mtk-svs-mt8183.c
+++ b/drivers/soc/mediatek/mtk-svs-mt8183.c
@@ -25,26 +25,28 @@ static int svs_mt8183_efuse_thermal_parsing(struct svs_platform *svsp)
 	o_slope_sign = (svsp->tefuse[0] >> 7) & BIT(0);
 
 	ts_id = (svsp->tefuse[1] >> 9) & BIT(0);
-	o_slope = (svsp->tefuse[0] >> 26) & GENMASK(5, 0);
-
-	if (adc_cali_en_t == 1) {
-		if (!ts_id)
-			o_slope = 0;
-
-		if (adc_ge_t < 265 || adc_ge_t > 758 ||
-		    adc_oe_t < 265 || adc_oe_t > 758 ||
-		    o_vtsmcu[0] < -8 || o_vtsmcu[0] > 484 ||
-		    o_vtsmcu[1] < -8 || o_vtsmcu[1] > 484 ||
-		    o_vtsmcu[2] < -8 || o_vtsmcu[2] > 484 ||
-		    o_vtsmcu[3] < -8 || o_vtsmcu[3] > 484 ||
-		    o_vtsmcu[4] < -8 || o_vtsmcu[4] > 484 ||
-		    o_vtsabb < -8 || o_vtsabb > 484 ||
-		    degc_cali < 1 || degc_cali > 63) {
-			dev_err(svsp->dev, "bad thermal efuse, no mon mode\n");
-			return -1;
-		}
-	} else {
-		dev_err(svsp->dev, "no thermal efuse, no mon mode\n");
+
+	if (!ts_id)
+		o_slope = 1534;
+	else {
+		o_slope = (svsp->tefuse[0] >> 26) & GENMASK(5, 0);
+		if (!o_slope_sign)
+			o_slope = 1534 + o_slope * 10;
+		else
+			o_slope = 1534 - o_slope * 10;
+	}
+
+	if (adc_cali_en_t == 0 ||
+	    adc_ge_t < 265 || adc_ge_t > 758 ||
+	    adc_oe_t < 265 || adc_oe_t > 758 ||
+	    o_vtsmcu[0] < -8 || o_vtsmcu[0] > 484 ||
+	    o_vtsmcu[1] < -8 || o_vtsmcu[1] > 484 ||
+	    o_vtsmcu[2] < -8 || o_vtsmcu[2] > 484 ||
+	    o_vtsmcu[3] < -8 || o_vtsmcu[3] > 484 ||
+	    o_vtsmcu[4] < -8 || o_vtsmcu[4] > 484 ||
+	    o_vtsabb < -8 || o_vtsabb > 484 ||
+	    degc_cali < 1 || degc_cali > 63) {
+		dev_err(svsp->dev, "bad thermal efuse, no mon mode\n");
 		return -1;
 	}
 
@@ -63,11 +65,7 @@ static int svs_mt8183_efuse_thermal_parsing(struct svs_platform *svsp)
 		x_roomt[i] = (((format[i] * 10000) / 4096) * 10000) / gain;
 
 	temp0 = (10000 * 100000 / gain) * 15 / 18;
-
-	if (!o_slope_sign)
-		mts = (temp0 * 10) / (1534 + o_slope * 10);
-	else
-		mts = (temp0 * 10) / (1534 - o_slope * 10);
+	mts = (temp0 * 10) / o_slope;
 
 	for (idx = 0; idx < svsp->bank_max; idx++) {
 		svsb = &svsp->banks[idx];
@@ -94,11 +92,7 @@ static int svs_mt8183_efuse_thermal_parsing(struct svs_platform *svsp)
 		temp0 = (degc_cali * 10 / 2);
 		temp1 = ((10000 * 100000 / 4096 / gain) *
 			 oe + tb_roomt * 10) * 15 / 18;
-
-		if (!o_slope_sign)
-			temp2 = temp1 * 100 / (1534 + o_slope * 10);
-		else
-			temp2 = temp1 * 100 / (1534 - o_slope * 10);
+		temp2 = temp1 * 100 / o_slope;
 
 		svsb->bts = (temp0 + temp2 - 250) * 4 / 10;
 	}
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 8/8] soc: mtk-svs: mt8192: fix bank data
  2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
                   ` (6 preceding siblings ...)
  2022-09-28 15:55 ` [PATCH 7/8] soc: mtk-svs: mt8183: refactor o_slope calculation matthias.bgg
@ 2022-09-28 15:55 ` matthias.bgg
  2022-09-29  8:26   ` AngeloGioacchino Del Regno
  2022-10-06 11:43   ` Roger Lu
  2022-10-06 11:43 ` [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver Roger Lu
  8 siblings, 2 replies; 20+ messages in thread
From: matthias.bgg @ 2022-09-28 15:55 UTC (permalink / raw)
  To: roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger

From: Matthias Brugger <matthias.bgg@gmail.com>

Values vmax and dvt_fixed are not changed at runtime, set them as needed
in the svs_banks struct.

Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>

---

 drivers/soc/mediatek/mt8192-svs.h     | 4 ++--
 drivers/soc/mediatek/mtk-svs-mt8192.c | 2 --
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/soc/mediatek/mt8192-svs.h b/drivers/soc/mediatek/mt8192-svs.h
index 6571ebcb2c0f..bf8c6030428f 100644
--- a/drivers/soc/mediatek/mt8192-svs.h
+++ b/drivers/soc/mediatek/mt8192-svs.h
@@ -16,7 +16,7 @@ static struct svs_bank svs_mt8192_banks[] = {
 		.turn_freq_base		= 688000000,
 		.volt_step		= 6250,
 		.volt_base		= 400000,
-		.vmax			= 0x60,
+		.vmax			= 0x61,
 		.vmin			= 0x1a,
 		.age_config		= 0x555555,
 		.dc_config		= 0x1,
@@ -41,7 +41,7 @@ static struct svs_bank svs_mt8192_banks[] = {
 		.turn_freq_base		= 688000000,
 		.volt_step		= 6250,
 		.volt_base		= 400000,
-		.vmax			= 0x60,
+		.vmax			= 0x66,
 		.vmin			= 0x1a,
 		.age_config		= 0x555555,
 		.dc_config		= 0x1,
diff --git a/drivers/soc/mediatek/mtk-svs-mt8192.c b/drivers/soc/mediatek/mtk-svs-mt8192.c
index 838a94834741..183acf2829f0 100644
--- a/drivers/soc/mediatek/mtk-svs-mt8192.c
+++ b/drivers/soc/mediatek/mtk-svs-mt8192.c
@@ -40,8 +40,6 @@ bool svs_mt8192_efuse_parsing(struct svs_platform *svsp)
 			svsb->dcbdet = (svsp->efuse[17] >> 16) & GENMASK(7, 0);
 			svsb->dcmdet = (svsp->efuse[17] >> 24) & GENMASK(7, 0);
 		}
-
-		svsb->vmax += svsb->dvt_fixed;
 	}
 
 	ret = svs_thermal_efuse_get_data(svsp);
-- 
2.37.3



^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/8] soc: mediatek: mtk-svs: delete superfluous platform data entries
  2022-09-28 15:55 ` [PATCH 4/8] soc: mediatek: mtk-svs: delete superfluous platform data entries matthias.bgg
@ 2022-09-29  8:25   ` AngeloGioacchino Del Regno
  2022-10-06 11:43   ` Roger Lu
  1 sibling, 0 replies; 20+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-09-29  8:25 UTC (permalink / raw)
  To: matthias.bgg, roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, Matthias Brugger

Il 28/09/22 17:55, matthias.bgg@kernel.org ha scritto:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> The platform name and efuse parsing function pointer are only used while
> probing the device. Use them from the svs_platform_data struct instead.
> 
> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>




^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/8] soc: mediatek: mtk-svs: move svs_platform_probe into probe
  2022-09-28 15:55 ` [PATCH 3/8] soc: mediatek: mtk-svs: move svs_platform_probe into probe matthias.bgg
@ 2022-09-29  8:25   ` AngeloGioacchino Del Regno
  0 siblings, 0 replies; 20+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-09-29  8:25 UTC (permalink / raw)
  To: matthias.bgg, roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, Matthias Brugger

Il 28/09/22 17:55, matthias.bgg@kernel.org ha scritto:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> Moving svs_platform_probe into driver probe function will allow us to
> reduce svs_platform members. This will be done in a follow-up patch.
> 
> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/8] soc: mediatek: mtk-svs: improve readability of platform_probe
  2022-09-28 15:55 ` [PATCH 2/8] soc: mediatek: mtk-svs: improve readability of platform_probe matthias.bgg
@ 2022-09-29  8:25   ` AngeloGioacchino Del Regno
  0 siblings, 0 replies; 20+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-09-29  8:25 UTC (permalink / raw)
  To: matthias.bgg, roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, Matthias Brugger

Il 28/09/22 17:55, matthias.bgg@kernel.org ha scritto:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> If a compatible misses a match data entry, then something is wrong in
> the development phase, we don't need to check for that at runtime.
> 
> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
> ---
> 
>   drivers/soc/mediatek/mtk-svs.c | 4 ----
>   1 file changed, 4 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
> index fd0f636e8644..52bb4f8bbe6d 100644
> --- a/drivers/soc/mediatek/mtk-svs.c
> +++ b/drivers/soc/mediatek/mtk-svs.c
> @@ -2332,10 +2332,6 @@ static struct svs_platform *svs_platform_probe(struct platform_device *pdev)
>   	int ret;
>   
>   	svsp_data = of_device_get_match_data(&pdev->dev);

Changing that to device_get_match_data() (so, dropping of_) would be a plus
to this cleanup, perhaps...

In any case:
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>

> -	if (!svsp_data) {
> -		dev_err(&pdev->dev, "no svs platform data?\n");
> -		return ERR_PTR(-EPERM);
> -	}
>   
>   	svsp = devm_kzalloc(&pdev->dev, sizeof(*svsp), GFP_KERNEL);
>   	if (!svsp)



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/8] soc: mediatek: mtk-svs: clean up platform probing
  2022-09-28 15:55 ` [PATCH 1/8] soc: mediatek: mtk-svs: clean up platform probing matthias.bgg
@ 2022-09-29  8:25   ` AngeloGioacchino Del Regno
  0 siblings, 0 replies; 20+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-09-29  8:25 UTC (permalink / raw)
  To: matthias.bgg, roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, Matthias Brugger

Il 28/09/22 17:55, matthias.bgg@kernel.org ha scritto:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> We only ever call the SoC specific probe function from
> svs_platform_probe. No need to carry that function in a global
> datastructure around.
> 
> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>




^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 6/8] soc: mtk-svs: mt8183: Move thermal parsing in new function
  2022-09-28 15:55 ` [PATCH 6/8] soc: mtk-svs: mt8183: Move thermal parsing in new function matthias.bgg
@ 2022-09-29  8:26   ` AngeloGioacchino Del Regno
  0 siblings, 0 replies; 20+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-09-29  8:26 UTC (permalink / raw)
  To: matthias.bgg, roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, Matthias Brugger

Il 28/09/22 17:55, matthias.bgg@kernel.org ha scritto:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> We jumpt to lable remove_mt8183_svsb_mon_mode from different error path
> in the code. Move the thermal parsing in a new function will allow us to
> refactor the code in a subsequent patch. No behavioural changes from
> this commit.
> 
> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/8] soc: mediatek: mtk-svs: Move SoC specific functions to new files
  2022-09-28 15:55 ` [PATCH 5/8] soc: mediatek: mtk-svs: Move SoC specific functions to new files matthias.bgg
@ 2022-09-29  8:26   ` AngeloGioacchino Del Regno
  2022-10-06 11:43   ` Roger Lu
  1 sibling, 0 replies; 20+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-09-29  8:26 UTC (permalink / raw)
  To: matthias.bgg, roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, Matthias Brugger, Philipp Zabel

Il 28/09/22 17:55, matthias.bgg@kernel.org ha scritto:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> With every SoC added to the driver, it grows. Move SoC specific
> callbacks to a new source files.
> 
> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
> ---
> 
>   drivers/soc/mediatek/Makefile         |   3 +-
>   drivers/soc/mediatek/mt8183-svs.h     | 113 ++++
>   drivers/soc/mediatek/mt8192-svs.h     |  64 ++
>   drivers/soc/mediatek/mtk-svs-mt8183.c | 234 ++++++++
>   drivers/soc/mediatek/mtk-svs-mt8192.c | 100 ++++
>   drivers/soc/mediatek/mtk-svs.c        | 831 ++------------------------
>   drivers/soc/mediatek/mtk-svs.h        | 279 +++++++++
>   7 files changed, 837 insertions(+), 787 deletions(-)
>   create mode 100644 drivers/soc/mediatek/mt8183-svs.h
>   create mode 100644 drivers/soc/mediatek/mt8192-svs.h
>   create mode 100644 drivers/soc/mediatek/mtk-svs-mt8183.c
>   create mode 100644 drivers/soc/mediatek/mtk-svs-mt8192.c
>   create mode 100644 drivers/soc/mediatek/mtk-svs.h
> 
> diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile
> index 0e9e703c931a..851131638644 100644
> --- a/drivers/soc/mediatek/Makefile
> +++ b/drivers/soc/mediatek/Makefile
> @@ -7,4 +7,5 @@ obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o
>   obj-$(CONFIG_MTK_SCPSYS_PM_DOMAINS) += mtk-pm-domains.o
>   obj-$(CONFIG_MTK_MMSYS) += mtk-mmsys.o
>   obj-$(CONFIG_MTK_MMSYS) += mtk-mutex.o
> -obj-$(CONFIG_MTK_SVS) += mtk-svs.o
> +mtk_svs-objs := mtk-svs.o mtk-svs-mt8183.o mtk-svs-mt8192.o
> +obj-$(CONFIG_MTK_SVS) += mtk_svs.o
> diff --git a/drivers/soc/mediatek/mt8183-svs.h b/drivers/soc/mediatek/mt8183-svs.h
> new file mode 100644
> index 000000000000..89c0deb9fb11
> --- /dev/null
> +++ b/drivers/soc/mediatek/mt8183-svs.h
> @@ -0,0 +1,113 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +
> +#ifndef __DRV_SVS_MT8183_H
> +#define __DRV_SVS_MT8183_H
> +

Please avoid implicit header inclusion (here and in mt8192-svs.h).

#include "mtk-svs.h"

Cheers,
Angelo




^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 8/8] soc: mtk-svs: mt8192: fix bank data
  2022-09-28 15:55 ` [PATCH 8/8] soc: mtk-svs: mt8192: fix bank data matthias.bgg
@ 2022-09-29  8:26   ` AngeloGioacchino Del Regno
  2022-10-06 11:43   ` Roger Lu
  1 sibling, 0 replies; 20+ messages in thread
From: AngeloGioacchino Del Regno @ 2022-09-29  8:26 UTC (permalink / raw)
  To: matthias.bgg, roger.lu, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, Matthias Brugger

Il 28/09/22 17:55, matthias.bgg@kernel.org ha scritto:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> Values vmax and dvt_fixed are not changed at runtime, set them as needed
> in the svs_banks struct.
> 
> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
> 

Honestly, I'm undecided on this one... because the vmax += dvt_fixed is something
descriptive of how the SVS works.
Since you're simply removing one addition, in a path that gets executed only once
in a kernel boot life, that's not even going to improve performance at all...

Right now, I'm more for dropping this change than keeping it.

Cheers,
Angelo

> ---
> 
>   drivers/soc/mediatek/mt8192-svs.h     | 4 ++--
>   drivers/soc/mediatek/mtk-svs-mt8192.c | 2 --
>   2 files changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mt8192-svs.h b/drivers/soc/mediatek/mt8192-svs.h
> index 6571ebcb2c0f..bf8c6030428f 100644
> --- a/drivers/soc/mediatek/mt8192-svs.h
> +++ b/drivers/soc/mediatek/mt8192-svs.h
> @@ -16,7 +16,7 @@ static struct svs_bank svs_mt8192_banks[] = {
>   		.turn_freq_base		= 688000000,
>   		.volt_step		= 6250,
>   		.volt_base		= 400000,
> -		.vmax			= 0x60,
> +		.vmax			= 0x61,
>   		.vmin			= 0x1a,
>   		.age_config		= 0x555555,
>   		.dc_config		= 0x1,
> @@ -41,7 +41,7 @@ static struct svs_bank svs_mt8192_banks[] = {
>   		.turn_freq_base		= 688000000,
>   		.volt_step		= 6250,
>   		.volt_base		= 400000,
> -		.vmax			= 0x60,
> +		.vmax			= 0x66,
>   		.vmin			= 0x1a,
>   		.age_config		= 0x555555,
>   		.dc_config		= 0x1,
> diff --git a/drivers/soc/mediatek/mtk-svs-mt8192.c b/drivers/soc/mediatek/mtk-svs-mt8192.c
> index 838a94834741..183acf2829f0 100644
> --- a/drivers/soc/mediatek/mtk-svs-mt8192.c
> +++ b/drivers/soc/mediatek/mtk-svs-mt8192.c
> @@ -40,8 +40,6 @@ bool svs_mt8192_efuse_parsing(struct svs_platform *svsp)
>   			svsb->dcbdet = (svsp->efuse[17] >> 16) & GENMASK(7, 0);
>   			svsb->dcmdet = (svsp->efuse[17] >> 24) & GENMASK(7, 0);
>   		}
> -
> -		svsb->vmax += svsb->dvt_fixed;
>   	}
>   
>   	ret = svs_thermal_efuse_get_data(svsp);



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/8] soc: mediatek: mtk-svs: delete superfluous platform data entries
  2022-09-28 15:55 ` [PATCH 4/8] soc: mediatek: mtk-svs: delete superfluous platform data entries matthias.bgg
  2022-09-29  8:25   ` AngeloGioacchino Del Regno
@ 2022-10-06 11:43   ` Roger Lu
  1 sibling, 0 replies; 20+ messages in thread
From: Roger Lu @ 2022-10-06 11:43 UTC (permalink / raw)
  To: matthias.bgg, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger

Hi Matthias Sir,

On Wed, 2022-09-28 at 17:55 +0200, matthias.bgg@kernel.org wrote:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> The platform name and efuse parsing function pointer are only used while
> probing the device. Use them from the svs_platform_data struct instead.
> 
> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
> ---
> 
>  drivers/soc/mediatek/mtk-svs.c | 22 ++++++++++++----------
>  1 file changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
> index 8342627f8dea..482cc8d7e7cf 100644
> --- a/drivers/soc/mediatek/mtk-svs.c
> +++ b/drivers/soc/mediatek/mtk-svs.c
> @@ -311,14 +311,12 @@ static const u32 svs_regs_v2[] = {
>  
>  /**
>   * struct svs_platform - svs platform control
> - * @name: svs platform name
>   * @base: svs platform register base
>   * @dev: svs platform device
>   * @main_clk: main clock for svs bank
>   * @pbank: svs bank pointer needing to be protected by spin_lock section
>   * @banks: svs banks that svs platform supports
>   * @rst: svs platform reset control
> - * @efuse_parsing: svs platform efuse parsing function pointer
>   * @efuse_max: total number of svs efuse
>   * @tefuse_max: total number of thermal efuse
>   * @regs: svs platform registers map
> @@ -327,14 +325,12 @@ static const u32 svs_regs_v2[] = {
>   * @tefuse: thermal efuse data received from NVMEM framework
>   */
>  struct svs_platform {
> -	char *name;
>  	void __iomem *base;
>  	struct device *dev;
>  	struct clk *main_clk;
>  	struct svs_bank *pbank;
>  	struct svs_bank *banks;
>  	struct reset_control *rst;
> -	bool (*efuse_parsing)(struct svs_platform *svsp);
>  	size_t efuse_max;
>  	size_t tefuse_max;
>  	const u32 *regs;
> @@ -2009,7 +2005,7 @@ static bool svs_is_efuse_data_correct(struct
> svs_platform *svsp)
>  	svsp->efuse_max /= sizeof(u32);
>  	nvmem_cell_put(cell);
>  
> -	return svsp->efuse_parsing(svsp);
> +	return true;
>  }

Based on the current coding design, I think this function can be removed. We can
rename/refactor `svs_thermal_efuse_get_data()` to `svs_get_efuse_data()` as
below. Is this acceptable? Thanks.

int svs_get_efuse_data(struct svs_platform *svsp, const char *nvmem_cell_name)
{
        struct nvmem_cell *cell;

        /* Thermal efuse parsing */
        cell = nvmem_cell_get(svsp->dev, nvmem_cell_name);
        if (IS_ERR_OR_NULL(cell)) {
                dev_err(svsp->dev, "no \"%s\"? %ld\n", nvmem_cell_name,
PTR_ERR(cell));
                return PTR_ERR(cell);
        }

        svsp->tefuse = nvmem_cell_read(cell, &svsp->tefuse_max);
        if (IS_ERR(svsp->tefuse)) {
                dev_err(svsp->dev, "cannot read thermal efuse: %ld\n",
                        PTR_ERR(svsp->tefuse));
                nvmem_cell_put(cell);
                return PTR_ERR(svsp->tefuse);
        }

        svsp->tefuse_max /= sizeof(u32);
        nvmem_cell_put(cell);

        return 0;
}

>  
>  static struct device *svs_get_subsys_device(struct svs_platform *svsp,
> @@ -2338,9 +2334,7 @@ static int svs_probe(struct platform_device *pdev)
>  		return -ENOMEM;
>  
>  	svsp->dev = &pdev->dev;
> -	svsp->name = svsp_data->name;
>  	svsp->banks = svsp_data->banks;
> -	svsp->efuse_parsing = svsp_data->efuse_parsing;
>  	svsp->regs = svsp_data->regs;
>  	svsp->bank_max = svsp_data->bank_max;
>  
> @@ -2351,6 +2345,12 @@ static int svs_probe(struct platform_device *pdev)
>  	if (!svs_is_efuse_data_correct(svsp)) {
>  		dev_notice(svsp->dev, "efuse data isn't correct\n");
>  		ret = -EPERM;
> +		goto svs_probe_free_efuse;
> +	}
> +

Remove `svs_is_efuse_data_correct()` and add below get-efuse-data function.

	ret = svs_get_efuse_data(svsp, "svs-calibration-data");
	if (ret)
		goto svs_probe_free_efuse;

> +	if (!svsp_data->efuse_parsing(svsp)) {
> +		dev_notice(svsp->dev, "efuse data parsing failed\n");
> +		ret = -EPERM;
>  		goto svs_probe_free_resource;
>  	}
>  
> @@ -2367,7 +2367,7 @@ static int svs_probe(struct platform_device *pdev)
>  	}
>  
>  	ret = devm_request_threaded_irq(svsp->dev, svsp_irq, NULL, svs_isr,
> -					IRQF_ONESHOT, svsp->name, svsp);
> +					IRQF_ONESHOT, svsp_data->name, svsp);
>  	if (ret) {
>  		dev_err(svsp->dev, "register irq(%d) failed: %d\n",
>  			svsp_irq, ret);
> @@ -2416,11 +2416,13 @@ static int svs_probe(struct platform_device *pdev)
>  	clk_disable_unprepare(svsp->main_clk);
>  
>  svs_probe_free_resource:

For current coding design, I suggest we rename the goto-label to
`svs_probe_free_tefuse` to identify the resource we free.

> -	if (!IS_ERR_OR_NULL(svsp->efuse))
> -		kfree(svsp->efuse);
>  	if (!IS_ERR_OR_NULL(svsp->tefuse))
>  		kfree(svsp->tefuse);
>  
> +svs_probe_free_efuse:
> +	if (!IS_ERR_OR_NULL(svsp->efuse))
> +		kfree(svsp->efuse);
> +
>  	return ret;
>  }
>  

Sincerely,
Roger Lu.



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/8] soc: mediatek: mtk-svs: Move SoC specific functions to new files
  2022-09-28 15:55 ` [PATCH 5/8] soc: mediatek: mtk-svs: Move SoC specific functions to new files matthias.bgg
  2022-09-29  8:26   ` AngeloGioacchino Del Regno
@ 2022-10-06 11:43   ` Roger Lu
  1 sibling, 0 replies; 20+ messages in thread
From: Roger Lu @ 2022-10-06 11:43 UTC (permalink / raw)
  To: matthias.bgg, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger,
	Philipp Zabel

Hi Matthias Sir,

> drivers/soc/mediatek/mtk-svs-mt8183.c | 234 ++++++++
> drivers/soc/mediatek/mtk-svs-mt8192.c | 100 ++++

We've encountered some build warnings as below. Could we put mtk-svs-mtxx.c
implementation into mt81xx-svs.h and remove mtk-svs-mtxx.c?

kernel/mediatek/drivers/soc/mediatek/mtk-svs-mt8183.c:103:6: warning: no
previous prototype for ‘svs_mt8183_efuse_parsing’ [-Wmissing-prototypes]
 bool svs_mt8183_efuse_parsing(struct svs_platform *svsp)
      ^~~~~~~~~~~~~~~~~~~~~~~~
/mfs/mtkslt1043/mtk11157/upstream/2022_1003_1704/kernel/mediatek/drivers/soc/med
iatek/mtk-svs-mt8183.c:198:5: warning: no previous prototype for
‘svs_mt8183_platform_probe’ [-Wmissing-prototypes]
 int svs_mt8183_platform_probe(struct svs_platform *svsp)
     ^~~~~~~~~~~~~~~~~~~~~~~~~

kernel/mediatek/drivers/soc/mediatek/mtk-svs-mt8192.c:5:6: warning: no previous
prototype for ‘svs_mt8192_efuse_parsing’ [-Wmissing-prototypes]
 bool svs_mt8192_efuse_parsing(struct svs_platform *svsp)
      ^~~~~~~~~~~~~~~~~~~~~~~~
/mfs/mtkslt1043/mtk11157/upstream/2022_1003_1704/kernel/mediatek/drivers/soc/med
iatek/mtk-svs-mt8192.c:67:5: warning: no previous prototype for
‘svs_mt8192_platform_probe’ [-Wmissing-prototypes]
 int svs_mt8192_platform_probe(struct svs_platform *svsp)

...[snip]...

> +#define debug_fops_ro(name)						\
> +	static int svs_##name##_debug_open(struct inode *inode,		\
> +					   struct file *filp)		\
> +	{								\
> +		return single_open(filp, svs_##name##_debug_show,	\
> +				   inode->i_private);			\
> +	}								\
> +	static const struct file_operations svs_##name##_debug_fops = {	\
> +		.owner = THIS_MODULE,					\
> +		.open = svs_##name##_debug_open,			\
> +		.read = seq_read,					\
> +		.llseek = seq_lseek,					\
> +		.release = single_release,				\
> +	}
> +
> +#define debug_fops_rw(name)						\
> +	static int svs_##name##_debug_open(struct inode *inode,		\
> +					   struct file *filp)		\
> +	{								\
> +		return single_open(filp, svs_##name##_debug_show,	\
> +				   inode->i_private);			\
> +	}								\
> +	static const struct file_operations svs_##name##_debug_fops = {	\
> +		.owner = THIS_MODULE,					\
> +		.open = svs_##name##_debug_open,			\
> +		.read = seq_read,					\
> +		.write = svs_##name##_debug_write,			\
> +		.llseek = seq_lseek,					\
> +		.release = single_release,				\
> +	}
> +
> +#define svs_dentry_data(name)	{__stringify(name),
> &svs_##name##_debug_fops}
> +

CHECK: Please don't use multiple blank lines
#208: FILE: drivers/soc/mediatek/mtk-svs.c:208:
+
+

...[snip]...

> -static struct device *svs_get_subsys_device(struct svs_platform *svsp,
> +struct device *svs_get_subsys_device(struct svs_platform *svsp,
>  					    const char *node_name)
>  {
>  	struct platform_device *pdev;
> @@ -2032,7 +1522,7 @@ static struct device *svs_get_subsys_device(struct
> svs_platform *svsp,
>  	return &pdev->dev;
>  }
>  
> -static struct device *svs_add_device_link(struct svs_platform *svsp,
> +struct device *svs_add_device_link(struct svs_platform *svsp,
>  					  const char *node_name)

CHECK: Alignment should match open parenthesis
#1502: FILE: drivers/soc/mediatek/mtk-svs.c:1502:
+struct device *svs_get_subsys_device(struct svs_platform *svsp,
+                                           const char *node_name)

CHECK: Alignment should match open parenthesis
#1526: FILE: drivers/soc/mediatek/mtk-svs.c:1526:
+struct device *svs_add_device_link(struct svs_platform *svsp,
+                                         const char *node_name)

... [snip]...

> +struct device *svs_add_device_link(struct svs_platform *svsp,
> +					  const char *node_name);
> +struct device *svs_get_subsys_device(struct svs_platform *svsp,
> +					    const char *node_name);

CHECK: Alignment should match open parenthesis
#269: FILE: drivers/soc/mediatek/mtk-svs.h:269:
+struct device *svs_add_device_link(struct svs_platform *svsp,
+                                         const char *node_name);

CHECK: Alignment should match open parenthesis
#271: FILE: drivers/soc/mediatek/mtk-svs.h:271:
+struct device *svs_get_subsys_device(struct svs_platform *svsp,
+                                           const char *node_name);

> +int svs_thermal_efuse_get_data(struct svs_platform *svsp);
> +
> +void svs_get_bank_volts_v2(struct svs_platform *svsp);
> +void svs_set_bank_freq_pct_v2(struct svs_platform *svsp);
> +
> +void svs_get_bank_volts_v3(struct svs_platform *svsp);
> +void svs_set_bank_freq_pct_v3(struct svs_platform *svsp);
> +#endif

Sincerely,
Roger Lu.



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 8/8] soc: mtk-svs: mt8192: fix bank data
  2022-09-28 15:55 ` [PATCH 8/8] soc: mtk-svs: mt8192: fix bank data matthias.bgg
  2022-09-29  8:26   ` AngeloGioacchino Del Regno
@ 2022-10-06 11:43   ` Roger Lu
  1 sibling, 0 replies; 20+ messages in thread
From: Roger Lu @ 2022-10-06 11:43 UTC (permalink / raw)
  To: matthias.bgg, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger

Hi Matthias Sir,

This addition is for indicating vmax value is increased by dvt_fixed.
Please keep this information to make it be seen. Many thanks.

Sincerely,
Roger Lu.

On Wed, 2022-09-28 at 17:55 +0200, matthias.bgg@kernel.org wrote:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> Values vmax and dvt_fixed are not changed at runtime, set them as needed
> in the svs_banks struct.
> 
> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
> 
> ---
> 
>  drivers/soc/mediatek/mt8192-svs.h     | 4 ++--
>  drivers/soc/mediatek/mtk-svs-mt8192.c | 2 --
>  2 files changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mt8192-svs.h b/drivers/soc/mediatek/mt8192-
> svs.h
> index 6571ebcb2c0f..bf8c6030428f 100644
> --- a/drivers/soc/mediatek/mt8192-svs.h
> +++ b/drivers/soc/mediatek/mt8192-svs.h
> @@ -16,7 +16,7 @@ static struct svs_bank svs_mt8192_banks[] = {
>  		.turn_freq_base		= 688000000,
>  		.volt_step		= 6250,
>  		.volt_base		= 400000,
> -		.vmax			= 0x60,
> +		.vmax			= 0x61,
>  		.vmin			= 0x1a,
>  		.age_config		= 0x555555,
>  		.dc_config		= 0x1,
> @@ -41,7 +41,7 @@ static struct svs_bank svs_mt8192_banks[] = {
>  		.turn_freq_base		= 688000000,
>  		.volt_step		= 6250,
>  		.volt_base		= 400000,
> -		.vmax			= 0x60,
> +		.vmax			= 0x66,
>  		.vmin			= 0x1a,
>  		.age_config		= 0x555555,
>  		.dc_config		= 0x1,
> diff --git a/drivers/soc/mediatek/mtk-svs-mt8192.c b/drivers/soc/mediatek/mtk-
> svs-mt8192.c
> index 838a94834741..183acf2829f0 100644
> --- a/drivers/soc/mediatek/mtk-svs-mt8192.c
> +++ b/drivers/soc/mediatek/mtk-svs-mt8192.c
> @@ -40,8 +40,6 @@ bool svs_mt8192_efuse_parsing(struct svs_platform *svsp)
>  			svsb->dcbdet = (svsp->efuse[17] >> 16) & GENMASK(7, 0);
>  			svsb->dcmdet = (svsp->efuse[17] >> 24) & GENMASK(7, 0);
>  		}
> -
> -		svsb->vmax += svsb->dvt_fixed;
>  	}
>  
>  	ret = svs_thermal_efuse_get_data(svsp);



^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver
  2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
                   ` (7 preceding siblings ...)
  2022-09-28 15:55 ` [PATCH 8/8] soc: mtk-svs: mt8192: fix bank data matthias.bgg
@ 2022-10-06 11:43 ` Roger Lu
  8 siblings, 0 replies; 20+ messages in thread
From: Roger Lu @ 2022-10-06 11:43 UTC (permalink / raw)
  To: matthias.bgg, jia-wei.chang
  Cc: nfraprado, khilman, linux-kernel, linux-mediatek,
	linux-arm-kernel, angelogioacchino.delregno, Matthias Brugger,
	Philipp Zabel

Hi Matthias Sir,

Thanks for sharing these great ideas to improve MTK SVS driver. I've added some
feedback to this patchset. However, should I just submit the v2 of these patches
for you to review? Thanks very much.

Sincerely,
Roger Lu.

On Wed, 2022-09-28 at 17:55 +0200, matthias.bgg@kernel.org wrote:
> From: Matthias Brugger <matthias.bgg@gmail.com>
> 
> Mediatek SVS driver got accepted upstream but has coding style issues
> which were overseen in the review process. This series is a first step
> to clean up the driver. It basically cleans up the SoC specific probe.
> As next step we will need to clean up the 'struct svs_bank'.
> 
> This series should be a mere cleanup with no functional change. I'm
> happy to recieve tested-by tags to make sure it does not break anything.
> 
> 
> Matthias Brugger (8):
>   soc: mediatek: mtk-svs: clean up platform probing
>   soc: mediatek: mtk-svs: improve readability of platform_probe
>   soc: mediatek: mtk-svs: move svs_platform_probe into probe
>   soc: mediatek: mtk-svs: delete superfluous platform data entries
>   soc: mediatek: mtk-svs: Move SoC specific functions to new files
>   soc: mtk-svs: mt8183: Move thermal parsing in new function
>   soc: mtk-svs: mt8183: refactor o_slope calculation
>   soc: mtk-svs: mt8192: fix bank data
> 
>  drivers/soc/mediatek/Makefile         |   3 +-
>  drivers/soc/mediatek/mt8183-svs.h     | 113 ++++
>  drivers/soc/mediatek/mt8192-svs.h     |  64 ++
>  drivers/soc/mediatek/mtk-svs-mt8183.c | 235 +++++++
>  drivers/soc/mediatek/mtk-svs-mt8192.c |  98 +++
>  drivers/soc/mediatek/mtk-svs.c        | 882 ++------------------------
>  drivers/soc/mediatek/mtk-svs.h        | 279 ++++++++
>  7 files changed, 853 insertions(+), 821 deletions(-)
>  create mode 100644 drivers/soc/mediatek/mt8183-svs.h
>  create mode 100644 drivers/soc/mediatek/mt8192-svs.h
>  create mode 100644 drivers/soc/mediatek/mtk-svs-mt8183.c
>  create mode 100644 drivers/soc/mediatek/mtk-svs-mt8192.c
>  create mode 100644 drivers/soc/mediatek/mtk-svs.h
> 



^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2022-10-06 12:44 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-28 15:55 [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver matthias.bgg
2022-09-28 15:55 ` [PATCH 1/8] soc: mediatek: mtk-svs: clean up platform probing matthias.bgg
2022-09-29  8:25   ` AngeloGioacchino Del Regno
2022-09-28 15:55 ` [PATCH 2/8] soc: mediatek: mtk-svs: improve readability of platform_probe matthias.bgg
2022-09-29  8:25   ` AngeloGioacchino Del Regno
2022-09-28 15:55 ` [PATCH 3/8] soc: mediatek: mtk-svs: move svs_platform_probe into probe matthias.bgg
2022-09-29  8:25   ` AngeloGioacchino Del Regno
2022-09-28 15:55 ` [PATCH 4/8] soc: mediatek: mtk-svs: delete superfluous platform data entries matthias.bgg
2022-09-29  8:25   ` AngeloGioacchino Del Regno
2022-10-06 11:43   ` Roger Lu
2022-09-28 15:55 ` [PATCH 5/8] soc: mediatek: mtk-svs: Move SoC specific functions to new files matthias.bgg
2022-09-29  8:26   ` AngeloGioacchino Del Regno
2022-10-06 11:43   ` Roger Lu
2022-09-28 15:55 ` [PATCH 6/8] soc: mtk-svs: mt8183: Move thermal parsing in new function matthias.bgg
2022-09-29  8:26   ` AngeloGioacchino Del Regno
2022-09-28 15:55 ` [PATCH 7/8] soc: mtk-svs: mt8183: refactor o_slope calculation matthias.bgg
2022-09-28 15:55 ` [PATCH 8/8] soc: mtk-svs: mt8192: fix bank data matthias.bgg
2022-09-29  8:26   ` AngeloGioacchino Del Regno
2022-10-06 11:43   ` Roger Lu
2022-10-06 11:43 ` [PATCH 0/8] soc: mediatek: mtk-svs: refactor and cleanup the driver Roger Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).