* [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
* 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
* [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
* 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
* [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
* 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
* [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
* 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 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
* [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
* 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 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
* [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
* 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
* [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 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 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).