* [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks
@ 2026-08-03 14:16 Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 01/32] clk: mediatek: mt2712: fix memory leak on module removal Akari Tsuyukusa
` (32 more replies)
0 siblings, 33 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
This series migrates most MediaTek clock drivers to the common
probe/remove helpers provided by the MTK clock framework.
Key changes:
- Fix memory leaks on module removal caused by missing
platform_set_drvdata() calls (patches 1-6).
- Add missing MODULE_DEVICE_TABLE() (patches 7, 8).
- Add missing support for cpumux, PLL, pllfh, and sub-device
auto-population to the common helpers (patches 9-12).
- Convert all compatible clock drivers to use struct mtk_clk_desc
and mtk_clk_simple_probe/remove (patches 13-32).
The memory leak and MODULE_DEVICE_TABLE() fixes are split from the
migration patches to allow backporting to stable.
Drivers not converted:
- MT6765 apmixedsys: requires direct register init.
- MT6795 apmixedsys: uses mtk_clk_register_ref2usb_tx().
- MT7629 eth/sgmiisys: uses a hacked probe sequence (multi-instance
sgmii gates).
- MT8173 apmixedsys: uses mtk_clk_register_ref2usb_tx() and custom
divider registration.
- MT8188/MT8195 topckgen: call devm_clk_hw_register_mux() and register
a notifier.
- MT8196 vlpckgen: requires direct register init.
- MT8365 apmixedsys: uses devm_clk_hw_register_gate().
Patches 1-6 are based on
"[PATCH v2 0/6] clk: mediatek: fix memory leak on module removal"
(In addition fixed a compilation error in mt8173-infracfg)
https://lore.kernel.org/linux-mediatek/20260707074839.240676-1-akkun11.open@gmail.com/
Patch 9 is based on
"[PATCH 1/3] clk: mediatek: clk-mtk: Add cpumux support to common probe/remove helpers"
https://lore.kernel.org/lkml/20260304181024.738391-1-akkun11.open@gmail.com/
Akari Tsuyukusa (32):
clk: mediatek: mt2712: fix memory leak on module removal
clk: mediatek: mt6795: fix memory leak on module removal
clk: mediatek: mt7622: fix memory leak on module removal
clk: mediatek: mt8135: fix memory leak on module removal
clk: mediatek: mt8173: fix memory leak on module removal
clk: mediatek: mt8192: fix memory leak on module removal
clk: mediatek: mt6735: Add missing MODULE_DEVICE_TABLE()
clk: mediatek: mt7988-apmixed: Add missing MODULE_DEVICE_TABLE()
clk: mediatek: Add cpumux support to common probe/remove helpers
clk: mediatek: Add PLL support to common probe/remove helpers
clk: mediatek: Add auto-population of sub-devices support in simple
probe
clk: mediatek: Add pllfh support to common probe/remove helpers
clk: mediatek: mt2701: Switch to common probe/remove helpers
clk: mediatek: mt2712-apmixedsys: Switch to common probe/remove
helpers
clk: mediatek: mt6735-apmixedsys: Switch to common probe/remove
helpers
clk: mediatek: mt6779: Switch to common probe/remove helpers
clk: mediatek: mt6795: Switch to common probe/remove helpers
clk: mediatek: mt6797: Switch to common probe/remove helpers
clk: mediatek: mt7622: Switch to common probe/remove helpers
clk: mediatek: mt7981-apmixed: Switch to common probe/remove helpers
clk: mediatek: mt7986-apmixed: Switch to common probe/remove helpers
clk: mediatek: mt7988-apmixed: Switch to common probe/remove helpers
clk: mediatek: mt8135-apmixedsys: Switch to common probe/remove
helpers
clk: mediatek: mt8167-apmixedsys: Switch to common probe/remove
helpers
clk: mediatek: mt8173-infracfg: Switch to common probe/remove helpers
clk: mediatek: mt8183: Switch to common probe/remove helpers
clk: mediatek: mt8186-apmixedsys: Switch to common probe/remove
helpers
clk: mediatek: mt8188-apmixedsys: Switch to common probe/remove
helpers
clk: mediatek: mt8192: Switch to common probe/remove helpers
clk: mediatek: mt8195: Switch to common probe/remove helpers
clk: mediatek: mt8196: Switch to common probe/remove helpers
clk: mediatek: mt8516-apmixedsys: Switch to common probe/remove
helpers
drivers/clk/mediatek/Kconfig | 34 +--
drivers/clk/mediatek/clk-mt2701-aud.c | 35 +--
drivers/clk/mediatek/clk-mt2701.c | 233 +++++--------------
drivers/clk/mediatek/clk-mt2712-apmixedsys.c | 48 +---
drivers/clk/mediatek/clk-mt6735-apmixedsys.c | 48 +---
drivers/clk/mediatek/clk-mt6735-imgsys.c | 1 +
drivers/clk/mediatek/clk-mt6735-mfgcfg.c | 1 +
drivers/clk/mediatek/clk-mt6735-vdecsys.c | 1 +
drivers/clk/mediatek/clk-mt6735-vencsys.c | 1 +
drivers/clk/mediatek/clk-mt6779.c | 124 ++--------
drivers/clk/mediatek/clk-mt6795-apmixedsys.c | 2 +
drivers/clk/mediatek/clk-mt6795-infracfg.c | 70 +-----
drivers/clk/mediatek/clk-mt6795-pericfg.c | 71 +-----
drivers/clk/mediatek/clk-mt6797.c | 140 ++---------
drivers/clk/mediatek/clk-mt7622-apmixedsys.c | 60 +----
drivers/clk/mediatek/clk-mt7622-aud.c | 35 +--
drivers/clk/mediatek/clk-mt7622-infracfg.c | 70 +-----
drivers/clk/mediatek/clk-mt7981-apmixed.c | 37 +--
drivers/clk/mediatek/clk-mt7986-apmixed.c | 37 +--
drivers/clk/mediatek/clk-mt7988-apmixed.c | 40 +---
drivers/clk/mediatek/clk-mt8135-apmixedsys.c | 48 +---
drivers/clk/mediatek/clk-mt8167-apmixedsys.c | 50 +---
drivers/clk/mediatek/clk-mt8173-apmixedsys.c | 2 +
drivers/clk/mediatek/clk-mt8173-infracfg.c | 98 ++------
drivers/clk/mediatek/clk-mt8183-apmixedsys.c | 51 +---
drivers/clk/mediatek/clk-mt8183-audio.c | 26 +--
drivers/clk/mediatek/clk-mt8186-apmixedsys.c | 59 +----
drivers/clk/mediatek/clk-mt8188-apmixedsys.c | 60 +----
drivers/clk/mediatek/clk-mt8192-apmixedsys.c | 67 ++----
drivers/clk/mediatek/clk-mt8192-aud.c | 26 +--
drivers/clk/mediatek/clk-mt8195-apmixedsys.c | 67 +-----
drivers/clk/mediatek/clk-mt8195-apusys_pll.c | 49 +---
drivers/clk/mediatek/clk-mt8196-apmixedsys.c | 67 +-----
drivers/clk/mediatek/clk-mt8196-mcu.c | 96 +++-----
drivers/clk/mediatek/clk-mt8196-mfg.c | 84 ++-----
drivers/clk/mediatek/clk-mt8516-apmixedsys.c | 42 +---
drivers/clk/mediatek/clk-mtk.c | 76 +++++-
drivers/clk/mediatek/clk-mtk.h | 12 +
38 files changed, 472 insertions(+), 1596 deletions(-)
--
2.55.0
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH 01/32] clk: mediatek: mt2712: fix memory leak on module removal
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 02/32] clk: mediatek: mt6795: " Akari Tsuyukusa
` (31 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
clk_mt2712_apmixed_probe() in clk-mt2712-apmixedsys.c does not call
platform_set_drvdata(), but clk_mt2712_apmixed_remove() callback calls
platform_get_drvdata().
This results in platform_get_drvdata() returning NULL, which leads to
calling kfree(NULL) in mtk_free_clk_data(NULL).
This leaves clk_data unreleased, causing a memory leak.
Fix this by calling platform_set_drvdata() during probe.
Fixes: c6368ce86435 ("clk: mediatek: mt2712-apmixedsys: Add .remove() callback for module build")
Cc: stable@vger.kernel.org
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
Reviewed-by: Brian Masney <bmasney@redhat.com>
---
drivers/clk/mediatek/clk-mt2712-apmixedsys.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/clk/mediatek/clk-mt2712-apmixedsys.c b/drivers/clk/mediatek/clk-mt2712-apmixedsys.c
index 54b18e9f83f8..087cf574bcdc 100644
--- a/drivers/clk/mediatek/clk-mt2712-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt2712-apmixedsys.c
@@ -129,6 +129,8 @@ static int clk_mt2712_apmixed_probe(struct platform_device *pdev)
goto unregister_plls;
}
+ platform_set_drvdata(pdev, clk_data);
+
return 0;
unregister_plls:
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 02/32] clk: mediatek: mt6795: fix memory leak on module removal
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 01/32] clk: mediatek: mt2712: fix memory leak on module removal Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 03/32] clk: mediatek: mt7622: " Akari Tsuyukusa
` (30 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
clk-mt6795-apmixedsys.c, clk-mt6795-infracfg.c and clk-mt6795-pericfg.c
do not call platform_set_drvdata() during their driver probe callback,
but their remove callback calls platform_get_drvdata().
This results in platform_get_drvdata() returning NULL, which leads to
calling kfree(NULL) in mtk_free_clk_data(NULL).
This leaves clk_data unreleased, causing a memory leak.
Fix this by calling platform_set_drvdata() during probe.
Fixes: 0d363282bb0c ("clk: mediatek: Add MediaTek Helio X10 MT6795 clock drivers")
Cc: stable@vger.kernel.org
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
Reviewed-by: Brian Masney <bmasney@redhat.com>
---
drivers/clk/mediatek/clk-mt6795-apmixedsys.c | 2 ++
drivers/clk/mediatek/clk-mt6795-infracfg.c | 2 ++
drivers/clk/mediatek/clk-mt6795-pericfg.c | 2 ++
3 files changed, 6 insertions(+)
diff --git a/drivers/clk/mediatek/clk-mt6795-apmixedsys.c b/drivers/clk/mediatek/clk-mt6795-apmixedsys.c
index 123d5d7fea85..239a3f5e1760 100644
--- a/drivers/clk/mediatek/clk-mt6795-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt6795-apmixedsys.c
@@ -175,6 +175,8 @@ static int clk_mt6795_apmixed_probe(struct platform_device *pdev)
dev_dbg(dev, "Performing initial setup for MD1\n");
clk_mt6795_apmixed_setup_md1(base);
+ platform_set_drvdata(pdev, clk_data);
+
return 0;
unregister_ref2usb:
diff --git a/drivers/clk/mediatek/clk-mt6795-infracfg.c b/drivers/clk/mediatek/clk-mt6795-infracfg.c
index e4559569f5b0..914bb069aa85 100644
--- a/drivers/clk/mediatek/clk-mt6795-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt6795-infracfg.c
@@ -116,6 +116,8 @@ static int clk_mt6795_infracfg_probe(struct platform_device *pdev)
if (ret)
goto unregister_cpumuxes;
+ platform_set_drvdata(pdev, clk_data);
+
return 0;
unregister_cpumuxes:
diff --git a/drivers/clk/mediatek/clk-mt6795-pericfg.c b/drivers/clk/mediatek/clk-mt6795-pericfg.c
index d48240eb2a67..27d0ef7d7b2f 100644
--- a/drivers/clk/mediatek/clk-mt6795-pericfg.c
+++ b/drivers/clk/mediatek/clk-mt6795-pericfg.c
@@ -125,6 +125,8 @@ static int clk_mt6795_pericfg_probe(struct platform_device *pdev)
if (ret)
goto unregister_composites;
+ platform_set_drvdata(pdev, clk_data);
+
return 0;
unregister_composites:
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 03/32] clk: mediatek: mt7622: fix memory leak on module removal
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 01/32] clk: mediatek: mt2712: fix memory leak on module removal Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 02/32] clk: mediatek: mt6795: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 04/32] clk: mediatek: mt8135: " Akari Tsuyukusa
` (29 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
clk-mt7622-apmixedsys.c and clk-mt7622-infracfg.c do not call
platform_set_drvdata() during their driver probe callback,
but their remove callback calls platform_get_drvdata().
This results in platform_get_drvdata() returning NULL,
which leads to calling kfree(NULL) in mtk_free_clk_data(NULL).
This leaves clk_data unreleased, causing a memory leak.
Fix this by calling platform_set_drvdata() during probe.
Fixes: c50e2ea6507b ("clk: mediatek: mt7622-apmixedsys: Add .remove() callback for module build")
Fixes: 838b86331c5e ("clk: mediatek: mt7622: Move infracfg to clk-mt7622-infracfg.c")
Cc: stable@vger.kernel.org
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
Reviewed-by: Brian Masney <bmasney@redhat.com>
---
drivers/clk/mediatek/clk-mt7622-apmixedsys.c | 2 ++
drivers/clk/mediatek/clk-mt7622-infracfg.c | 2 ++
2 files changed, 4 insertions(+)
diff --git a/drivers/clk/mediatek/clk-mt7622-apmixedsys.c b/drivers/clk/mediatek/clk-mt7622-apmixedsys.c
index 8a29eaab0cfc..fae8abda14b3 100644
--- a/drivers/clk/mediatek/clk-mt7622-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt7622-apmixedsys.c
@@ -109,6 +109,8 @@ static int clk_mt7622_apmixed_probe(struct platform_device *pdev)
if (ret)
goto unregister_gates;
+ platform_set_drvdata(pdev, clk_data);
+
return 0;
unregister_gates:
diff --git a/drivers/clk/mediatek/clk-mt7622-infracfg.c b/drivers/clk/mediatek/clk-mt7622-infracfg.c
index cfdf3b07c3e0..cec19447d637 100644
--- a/drivers/clk/mediatek/clk-mt7622-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt7622-infracfg.c
@@ -90,6 +90,8 @@ static int clk_mt7622_infracfg_probe(struct platform_device *pdev)
if (ret)
goto unregister_cpumuxes;
+ platform_set_drvdata(pdev, clk_data);
+
return 0;
unregister_cpumuxes:
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 04/32] clk: mediatek: mt8135: fix memory leak on module removal
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (2 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 03/32] clk: mediatek: mt7622: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 05/32] clk: mediatek: mt8173: " Akari Tsuyukusa
` (28 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
clk_mt8135_apmixed_probe() in clk-mt8135-apmixedsys.c does not call
platform_set_drvdata(), but clk_mt8135_apmixed_remove() callback calls
platform_get_drvdata().
This results in platform_get_drvdata() returning NULL,
which leads to calling kfree(NULL) in mtk_free_clk_data(NULL).
This leaves clk_data unreleased, causing a memory leak.
Fix this by calling platform_set_drvdata() during probe.
Fixes: 54b7026f011e ("clk: mediatek: mt8135-apmixedsys: Convert to platform_driver and module")
Cc: stable@vger.kernel.org
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
Reviewed-by: Brian Masney <bmasney@redhat.com>
---
drivers/clk/mediatek/clk-mt8135-apmixedsys.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/clk/mediatek/clk-mt8135-apmixedsys.c b/drivers/clk/mediatek/clk-mt8135-apmixedsys.c
index 19e4ee489ec3..e3b7dc13b458 100644
--- a/drivers/clk/mediatek/clk-mt8135-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8135-apmixedsys.c
@@ -66,6 +66,8 @@ static int clk_mt8135_apmixed_probe(struct platform_device *pdev)
if (ret)
goto unregister_plls;
+ platform_set_drvdata(pdev, clk_data);
+
return 0;
unregister_plls:
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 05/32] clk: mediatek: mt8173: fix memory leak on module removal
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (3 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 04/32] clk: mediatek: mt8135: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 06/32] clk: mediatek: mt8192: " Akari Tsuyukusa
` (27 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
clk-mt8173-apmixedsys.c and clk-mt8173-infracfg.c do not call
platform_set_drvdata() during their driver probe callback,
but their remove callback calls platform_get_drvdata().
This results in platform_get_drvdata() returning NULL,
which leads to calling kfree(NULL) in mtk_free_clk_data(NULL).
This leaves clk_data unreleased, causing a memory leak.
Fix this by calling platform_set_drvdata() during probe.
Fixes: 4c02c9af3cb9 ("clk: mediatek: mt8173: Break down clock drivers and allow module build")
Cc: stable@vger.kernel.org
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8173-apmixedsys.c | 2 ++
drivers/clk/mediatek/clk-mt8173-infracfg.c | 2 ++
2 files changed, 4 insertions(+)
diff --git a/drivers/clk/mediatek/clk-mt8173-apmixedsys.c b/drivers/clk/mediatek/clk-mt8173-apmixedsys.c
index d7d416172ab3..65dc4489a09c 100644
--- a/drivers/clk/mediatek/clk-mt8173-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8173-apmixedsys.c
@@ -179,6 +179,8 @@ static int clk_mt8173_apmixed_probe(struct platform_device *pdev)
if (r)
goto unregister_ref2usb;
+ platform_set_drvdata(pdev, clk_data);
+
return 0;
unregister_ref2usb:
diff --git a/drivers/clk/mediatek/clk-mt8173-infracfg.c b/drivers/clk/mediatek/clk-mt8173-infracfg.c
index fa2d1d557e04..9b8c35897789 100644
--- a/drivers/clk/mediatek/clk-mt8173-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt8173-infracfg.c
@@ -128,6 +128,8 @@ static int clk_mt8173_infracfg_probe(struct platform_device *pdev)
if (r)
goto unregister_clk_hw;
+ platform_set_drvdata(pdev, infra_clk_data);
+
return 0;
unregister_clk_hw:
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 06/32] clk: mediatek: mt8192: fix memory leak on module removal
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (4 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 05/32] clk: mediatek: mt8173: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 07/32] clk: mediatek: mt6735: Add missing MODULE_DEVICE_TABLE() Akari Tsuyukusa
` (26 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
clk_mt8192_apmixed_probe() in clk-mt8192-apmixedsys.c does not call
platform_set_drvdata(), but clk_mt8192_apmixed_remove() callback calls
platform_get_drvdata().
This results in platform_get_drvdata() returning NULL,
which leads to calling kfree(NULL) in mtk_free_clk_data(NULL).
This leaves clk_data unreleased, causing a memory leak.
Fix this by calling platform_set_drvdata() during probe.
Fixes: 124294ff468f ("clk: mediatek: mt8192: Move apmixedsys clock driver to its own file")
Cc: stable@vger.kernel.org
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
Reviewed-by: Brian Masney <bmasney@redhat.com>
---
drivers/clk/mediatek/clk-mt8192-apmixedsys.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/clk/mediatek/clk-mt8192-apmixedsys.c b/drivers/clk/mediatek/clk-mt8192-apmixedsys.c
index b0563a285bd6..e6ac40e2f12d 100644
--- a/drivers/clk/mediatek/clk-mt8192-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8192-apmixedsys.c
@@ -176,6 +176,8 @@ static int clk_mt8192_apmixed_probe(struct platform_device *pdev)
if (r)
goto unregister_gates;
+ platform_set_drvdata(pdev, clk_data);
+
return r;
unregister_gates:
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 07/32] clk: mediatek: mt6735: Add missing MODULE_DEVICE_TABLE()
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (5 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 06/32] clk: mediatek: mt8192: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 08/32] clk: mediatek: mt7988-apmixed: " Akari Tsuyukusa
` (25 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
Add MODULE_DEVICE_TABLE() to the MT6735 clock drivers (imgsys, mfgcfg,
vdecsys, vencsys) to export the Device Tree matching tables.
This is required so that the clock drivers can be automatically loaded
when built as modules.
Fixes: 0bd9b1211f74 ("clk: mediatek: Add drivers for MT6735 syscon clock and reset controllers")
Cc: stable@vger.kernel.org
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt6735-imgsys.c | 1 +
drivers/clk/mediatek/clk-mt6735-mfgcfg.c | 1 +
drivers/clk/mediatek/clk-mt6735-vdecsys.c | 1 +
drivers/clk/mediatek/clk-mt6735-vencsys.c | 1 +
4 files changed, 4 insertions(+)
diff --git a/drivers/clk/mediatek/clk-mt6735-imgsys.c b/drivers/clk/mediatek/clk-mt6735-imgsys.c
index c564f8f72432..813241d526cf 100644
--- a/drivers/clk/mediatek/clk-mt6735-imgsys.c
+++ b/drivers/clk/mediatek/clk-mt6735-imgsys.c
@@ -41,6 +41,7 @@ static const struct of_device_id of_match_mt6735_imgsys[] = {
{ .compatible = "mediatek,mt6735-imgsys", .data = &imgsys_clks },
{ /* sentinel */ }
};
+MODULE_DEVICE_TABLE(of, of_match_mt6735_imgsys);
static struct platform_driver clk_mt6735_imgsys = {
.probe = mtk_clk_simple_probe,
diff --git a/drivers/clk/mediatek/clk-mt6735-mfgcfg.c b/drivers/clk/mediatek/clk-mt6735-mfgcfg.c
index 1f5aedddf209..8a18ee244a4d 100644
--- a/drivers/clk/mediatek/clk-mt6735-mfgcfg.c
+++ b/drivers/clk/mediatek/clk-mt6735-mfgcfg.c
@@ -45,6 +45,7 @@ static const struct of_device_id of_match_mt6735_mfgcfg[] = {
{ .compatible = "mediatek,mt6735-mfgcfg", .data = &mfgcfg_clks },
{ /* sentinel */ }
};
+MODULE_DEVICE_TABLE(of, of_match_mt6735_mfgcfg);
static struct platform_driver clk_mt6735_mfgcfg = {
.probe = mtk_clk_simple_probe,
diff --git a/drivers/clk/mediatek/clk-mt6735-vdecsys.c b/drivers/clk/mediatek/clk-mt6735-vdecsys.c
index 8817085fc1db..d53ebf92e878 100644
--- a/drivers/clk/mediatek/clk-mt6735-vdecsys.c
+++ b/drivers/clk/mediatek/clk-mt6735-vdecsys.c
@@ -63,6 +63,7 @@ static const struct of_device_id of_match_mt6735_vdecsys[] = {
{ .compatible = "mediatek,mt6735-vdecsys", .data = &vdecsys_clks },
{ /* sentinel */ }
};
+MODULE_DEVICE_TABLE(of, of_match_mt6735_vdecsys);
static struct platform_driver clk_mt6735_vdecsys = {
.probe = mtk_clk_simple_probe,
diff --git a/drivers/clk/mediatek/clk-mt6735-vencsys.c b/drivers/clk/mediatek/clk-mt6735-vencsys.c
index 8dec7f98492a..64ba9da9fd42 100644
--- a/drivers/clk/mediatek/clk-mt6735-vencsys.c
+++ b/drivers/clk/mediatek/clk-mt6735-vencsys.c
@@ -37,6 +37,7 @@ static const struct of_device_id of_match_mt6735_vencsys[] = {
{ .compatible = "mediatek,mt6735-vencsys", .data = &vencsys_clks },
{ /* sentinel */ }
};
+MODULE_DEVICE_TABLE(of, of_match_mt6735_vencsys);
static struct platform_driver clk_mt6735_vencsys = {
.probe = mtk_clk_simple_probe,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 08/32] clk: mediatek: mt7988-apmixed: Add missing MODULE_DEVICE_TABLE()
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (6 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 07/32] clk: mediatek: mt6735: Add missing MODULE_DEVICE_TABLE() Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 09/32] clk: mediatek: Add cpumux support to common probe/remove helpers Akari Tsuyukusa
` (24 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
Add MODULE_DEVICE_TABLE() to the MT7988 apmixedsys clock driver to
export the Device Tree matching tables.
This is required so that the clock drivers can be automatically loaded
when built as modules.
Fixes: 4b4719437d85 ("clk: mediatek: add drivers for MT7988 SoC")
Cc: stable@vger.kernel.org
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt7988-apmixed.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/clk/mediatek/clk-mt7988-apmixed.c b/drivers/clk/mediatek/clk-mt7988-apmixed.c
index 416a4b88d100..24f4e7b87a31 100644
--- a/drivers/clk/mediatek/clk-mt7988-apmixed.c
+++ b/drivers/clk/mediatek/clk-mt7988-apmixed.c
@@ -75,6 +75,7 @@ static const struct of_device_id of_match_clk_mt7988_apmixed[] = {
{ .compatible = "mediatek,mt7988-apmixedsys" },
{ /* sentinel */ }
};
+MODULE_DEVICE_TABLE(of, of_match_clk_mt7988_apmixed);
static int clk_mt7988_apmixed_probe(struct platform_device *pdev)
{
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 09/32] clk: mediatek: Add cpumux support to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (7 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 08/32] clk: mediatek: mt7988-apmixed: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 10/32] clk: mediatek: Add PLL " Akari Tsuyukusa
` (23 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
Extend __mtk_clk_simple_probe() and __mtk_clk_simple_remove() to
support cpumux clocks. This reduces boilerplate code in drivers for
SoCs that require cpumux registration, such as mt6795-infracfg.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
---
drivers/clk/mediatek/clk-mtk.c | 18 +++++++++++++++++-
drivers/clk/mediatek/clk-mtk.h | 2 ++
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
index 3dfdd3a422f8..8148c21e6099 100644
--- a/drivers/clk/mediatek/clk-mtk.c
+++ b/drivers/clk/mediatek/clk-mtk.c
@@ -19,6 +19,7 @@
#include "clk-mtk.h"
#include "clk-gate.h"
#include "clk-mux.h"
+#include "clk-cpumux.h"
const struct mtk_gate_regs cg_regs_dummy = { 0, 0, 0 };
EXPORT_SYMBOL_GPL(cg_regs_dummy);
@@ -513,6 +514,7 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
num_clks = mcd->num_clks + mcd->num_composite_clks;
num_clks += mcd->num_fixed_clks + mcd->num_factor_clks;
num_clks += mcd->num_mux_clks + mcd->num_divider_clks;
+ num_clks += mcd->num_cpumuxes;
clk_data = mtk_alloc_clk_data(num_clks);
if (!clk_data) {
@@ -542,6 +544,13 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
goto unregister_factors;
}
+ if (mcd->cpumuxes) {
+ r = mtk_clk_register_cpumuxes(&pdev->dev, node, mcd->cpumuxes,
+ mcd->num_cpumuxes, clk_data);
+ if (r)
+ goto unregister_muxes;
+ }
+
if (mcd->composite_clks) {
/* We don't check composite_lock because it's optional */
r = mtk_clk_register_composites(&pdev->dev,
@@ -549,7 +558,7 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
mcd->num_composite_clks,
base, mcd->clk_lock, clk_data);
if (r)
- goto unregister_muxes;
+ goto unregister_cpumuxes;
}
if (mcd->divider_clks) {
@@ -605,6 +614,10 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
if (mcd->composite_clks)
mtk_clk_unregister_composites(mcd->composite_clks,
mcd->num_composite_clks, clk_data);
+unregister_cpumuxes:
+ if (mcd->cpumuxes)
+ mtk_clk_unregister_cpumuxes(mcd->cpumuxes,
+ mcd->num_cpumuxes, clk_data);
unregister_muxes:
if (mcd->mux_clks)
mtk_clk_unregister_muxes(mcd->mux_clks,
@@ -643,6 +656,9 @@ static void __mtk_clk_simple_remove(struct platform_device *pdev,
if (mcd->composite_clks)
mtk_clk_unregister_composites(mcd->composite_clks,
mcd->num_composite_clks, clk_data);
+ if (mcd->cpumuxes)
+ mtk_clk_unregister_cpumuxes(mcd->cpumuxes,
+ mcd->num_cpumuxes, clk_data);
if (mcd->mux_clks)
mtk_clk_unregister_muxes(mcd->mux_clks,
mcd->num_mux_clks, clk_data);
diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h
index 5417b9264e6d..02fab4b166f2 100644
--- a/drivers/clk/mediatek/clk-mtk.h
+++ b/drivers/clk/mediatek/clk-mtk.h
@@ -252,6 +252,8 @@ struct mtk_clk_desc {
size_t num_factor_clks;
const struct mtk_mux *mux_clks;
size_t num_mux_clks;
+ const struct mtk_composite *cpumuxes;
+ size_t num_cpumuxes;
const struct mtk_clk_rst_desc *rst_desc;
spinlock_t *clk_lock;
bool shared_io;
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 10/32] clk: mediatek: Add PLL support to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (8 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 09/32] clk: mediatek: Add cpumux support to common probe/remove helpers Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 11/32] clk: mediatek: Add auto-population of sub-devices support in simple probe Akari Tsuyukusa
` (22 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
Extend __mtk_clk_simple_probe() and __mtk_clk_simple_remove() to
support PLLs. This reduces boilerplate code in apmixedsys drivers.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mtk.c | 19 ++++++++++++++++---
drivers/clk/mediatek/clk-mtk.h | 3 +++
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
index 8148c21e6099..c3369a04cdec 100644
--- a/drivers/clk/mediatek/clk-mtk.c
+++ b/drivers/clk/mediatek/clk-mtk.c
@@ -20,6 +20,7 @@
#include "clk-gate.h"
#include "clk-mux.h"
#include "clk-cpumux.h"
+#include "clk-pll.h"
const struct mtk_gate_regs cg_regs_dummy = { 0, 0, 0 };
EXPORT_SYMBOL_GPL(cg_regs_dummy);
@@ -486,7 +487,7 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
}
/* Composite and divider clocks needs us to pass iomem pointer */
- if (mcd->composite_clks || mcd->divider_clks) {
+ if (mcd->composite_clks || mcd->divider_clks || mcd->plls) {
if (!mcd->shared_io)
base = devm_platform_ioremap_resource(pdev, 0);
else
@@ -514,7 +515,7 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
num_clks = mcd->num_clks + mcd->num_composite_clks;
num_clks += mcd->num_fixed_clks + mcd->num_factor_clks;
num_clks += mcd->num_mux_clks + mcd->num_divider_clks;
- num_clks += mcd->num_cpumuxes;
+ num_clks += mcd->num_cpumuxes + mcd->num_plls;
clk_data = mtk_alloc_clk_data(num_clks);
if (!clk_data) {
@@ -522,11 +523,18 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
goto free_base;
}
+ if (mcd->plls) {
+ r = mtk_clk_register_plls(&pdev->dev, mcd->plls,
+ mcd->num_plls, clk_data);
+ if (r)
+ goto free_data;
+ }
+
if (mcd->fixed_clks) {
r = mtk_clk_register_fixed_clks(mcd->fixed_clks,
mcd->num_fixed_clks, clk_data);
if (r)
- goto free_data;
+ goto unregister_plls;
}
if (mcd->factor_clks) {
@@ -630,6 +638,9 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
if (mcd->fixed_clks)
mtk_clk_unregister_fixed_clks(mcd->fixed_clks,
mcd->num_fixed_clks, clk_data);
+unregister_plls:
+ if (mcd->plls)
+ mtk_clk_unregister_plls(mcd->plls, mcd->num_plls, clk_data);
free_data:
mtk_free_clk_data(clk_data);
free_base:
@@ -668,6 +679,8 @@ static void __mtk_clk_simple_remove(struct platform_device *pdev,
if (mcd->fixed_clks)
mtk_clk_unregister_fixed_clks(mcd->fixed_clks,
mcd->num_fixed_clks, clk_data);
+ if (mcd->plls)
+ mtk_clk_unregister_plls(mcd->plls, mcd->num_plls, clk_data);
mtk_free_clk_data(clk_data);
}
diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h
index 02fab4b166f2..b6504b3e77ed 100644
--- a/drivers/clk/mediatek/clk-mtk.h
+++ b/drivers/clk/mediatek/clk-mtk.h
@@ -23,6 +23,7 @@
#define MTK_WAIT_HWV_DONE_US 30
struct platform_device;
+struct mtk_pll_data;
/*
* We need the clock IDs to start from zero but to maintain devicetree
@@ -254,6 +255,8 @@ struct mtk_clk_desc {
size_t num_mux_clks;
const struct mtk_composite *cpumuxes;
size_t num_cpumuxes;
+ const struct mtk_pll_data *plls;
+ size_t num_plls;
const struct mtk_clk_rst_desc *rst_desc;
spinlock_t *clk_lock;
bool shared_io;
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 11/32] clk: mediatek: Add auto-population of sub-devices support in simple probe
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (9 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 10/32] clk: mediatek: Add PLL " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-04 2:43 ` Chen-Yu Tsai
2026-08-03 14:16 ` [PATCH 12/32] clk: mediatek: Add pllfh support to common probe/remove helpers Akari Tsuyukusa
` (21 subsequent siblings)
32 siblings, 1 reply; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
MediaTek audio clock drivers call devm_of_platform_populate() after
mtk_clk_simple_probe(). Extend __mtk_clk_simple_probe() to run
devm_of_platform_populate() when the new 'populate_children' flag is
set, reducing boilerplate.
Note that explicit of_platform_depopulate() calls in remove functions
are unnecessary because devm_of_platform_populate() is managed by
devres and cleans up automatically.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mtk.c | 7 +++++++
drivers/clk/mediatek/clk-mtk.h | 1 +
2 files changed, 8 insertions(+)
diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
index c3369a04cdec..71d70b5a9990 100644
--- a/drivers/clk/mediatek/clk-mtk.c
+++ b/drivers/clk/mediatek/clk-mtk.c
@@ -12,6 +12,7 @@
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
+#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/slab.h>
@@ -609,6 +610,12 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
if (mcd->need_runtime_pm)
pm_runtime_put(&pdev->dev);
+ if (mcd->populate_children) {
+ r = devm_of_platform_populate(&pdev->dev);
+ if (r)
+ goto unregister_clks;
+ }
+
return r;
unregister_clks:
diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h
index b6504b3e77ed..11939e3e0b38 100644
--- a/drivers/clk/mediatek/clk-mtk.h
+++ b/drivers/clk/mediatek/clk-mtk.h
@@ -265,6 +265,7 @@ struct mtk_clk_desc {
unsigned int mfg_clk_idx;
bool need_runtime_pm;
+ bool populate_children;
};
int mtk_clk_pdev_probe(struct platform_device *pdev);
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 12/32] clk: mediatek: Add pllfh support to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (10 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 11/32] clk: mediatek: Add auto-population of sub-devices support in simple probe Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 13/32] clk: mediatek: mt2701: Switch " Akari Tsuyukusa
` (20 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
Extend __mtk_clk_simple_probe() and __mtk_clk_simple_remove() to
support pll freqhoppings.
This reduces boilerplate code in apmixedsys drivers with pllfh support.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mtk.c | 44 ++++++++++++++++++++++++++++++----
drivers/clk/mediatek/clk-mtk.h | 6 +++++
2 files changed, 45 insertions(+), 5 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
index 71d70b5a9990..e80ae497fadd 100644
--- a/drivers/clk/mediatek/clk-mtk.c
+++ b/drivers/clk/mediatek/clk-mtk.c
@@ -23,6 +23,10 @@
#include "clk-cpumux.h"
#include "clk-pll.h"
+#if IS_ENABLED(CONFIG_COMMON_CLK_MEDIATEK_FHCTL)
+#include "clk-fhctl.h"
+#endif
+
const struct mtk_gate_regs cg_regs_dummy = { 0, 0, 0 };
EXPORT_SYMBOL_GPL(cg_regs_dummy);
@@ -525,8 +529,19 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
}
if (mcd->plls) {
- r = mtk_clk_register_plls(&pdev->dev, mcd->plls,
+ if (mcd->fhctl_node) {
+#if IS_ENABLED(CONFIG_COMMON_CLK_MEDIATEK_FHCTL)
+ fhctl_parse_dt(mcd->fhctl_node, mcd->pllfhs,
+ mcd->num_pllfhs);
+ r = mtk_clk_register_pllfhs(&pdev->dev, mcd->plls,
+ mcd->num_plls, mcd->pllfhs,
+ mcd->num_pllfhs, clk_data);
+#endif
+ } else {
+ r = mtk_clk_register_plls(&pdev->dev, mcd->plls,
mcd->num_plls, clk_data);
+ }
+
if (r)
goto free_data;
}
@@ -646,8 +661,17 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
mtk_clk_unregister_fixed_clks(mcd->fixed_clks,
mcd->num_fixed_clks, clk_data);
unregister_plls:
- if (mcd->plls)
- mtk_clk_unregister_plls(mcd->plls, mcd->num_plls, clk_data);
+ if (mcd->plls) {
+ if (mcd->fhctl_node)
+#if IS_ENABLED(CONFIG_COMMON_CLK_MEDIATEK_FHCTL)
+ mtk_clk_unregister_pllfhs(mcd->plls, mcd->num_plls,
+ mcd->pllfhs, mcd->num_pllfhs,
+ clk_data);
+#endif
+ else
+ mtk_clk_unregister_plls(mcd->plls, mcd->num_plls,
+ clk_data);
+ }
free_data:
mtk_free_clk_data(clk_data);
free_base:
@@ -686,8 +710,18 @@ static void __mtk_clk_simple_remove(struct platform_device *pdev,
if (mcd->fixed_clks)
mtk_clk_unregister_fixed_clks(mcd->fixed_clks,
mcd->num_fixed_clks, clk_data);
- if (mcd->plls)
- mtk_clk_unregister_plls(mcd->plls, mcd->num_plls, clk_data);
+ if (mcd->plls) {
+ if (mcd->fhctl_node)
+#if IS_ENABLED(CONFIG_COMMON_CLK_MEDIATEK_FHCTL)
+ mtk_clk_unregister_pllfhs(mcd->plls, mcd->num_plls,
+ mcd->pllfhs, mcd->num_pllfhs,
+ clk_data);
+#endif
+ else
+ mtk_clk_unregister_plls(mcd->plls, mcd->num_plls,
+ clk_data);
+ }
+
mtk_free_clk_data(clk_data);
}
diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h
index 11939e3e0b38..4e959ec68da0 100644
--- a/drivers/clk/mediatek/clk-mtk.h
+++ b/drivers/clk/mediatek/clk-mtk.h
@@ -15,6 +15,8 @@
#include "reset.h"
+#include "clk-fhctl.h"
+
#define MAX_MUX_GATE_BIT 31
#define INVALID_MUX_GATE_BIT (MAX_MUX_GATE_BIT + 1)
@@ -266,6 +268,10 @@ struct mtk_clk_desc {
bool need_runtime_pm;
bool populate_children;
+
+ const u8 *fhctl_node;
+ struct mtk_pllfh_data *pllfhs;
+ size_t num_pllfhs;
};
int mtk_clk_pdev_probe(struct platform_device *pdev);
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 13/32] clk: mediatek: mt2701: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (11 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 12/32] clk: mediatek: Add pllfh support to common probe/remove helpers Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-04 2:45 ` Chen-Yu Tsai
2026-08-03 14:16 ` [PATCH 14/32] clk: mediatek: mt2712-apmixedsys: " Akari Tsuyukusa
` (19 subsequent siblings)
32 siblings, 1 reply; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT2701 clock drivers can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Drop the CLK_OF_DECLARE_DRIVER early init for infracfg; the kernel's
deferred probe mechanism ensures dependent drivers like cpufreq are
initialized correctly.
Since all MT2701 clock drivers can now be built as modules,
change Kconfig settings to "tristate".
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/Kconfig | 18 +-
drivers/clk/mediatek/clk-mt2701-aud.c | 35 +---
drivers/clk/mediatek/clk-mt2701.c | 233 ++++++--------------------
3 files changed, 65 insertions(+), 221 deletions(-)
diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig
index 2c09fd729bab..b58656a7e8c3 100644
--- a/drivers/clk/mediatek/Kconfig
+++ b/drivers/clk/mediatek/Kconfig
@@ -19,7 +19,7 @@ config COMMON_CLK_MEDIATEK_FHCTL
spread spectrum clocking features.
config COMMON_CLK_MT2701
- bool "Clock driver for MediaTek MT2701"
+ tristate "Clock driver for MediaTek MT2701"
depends on (ARCH_MEDIATEK && ARM) || COMPILE_TEST
select COMMON_CLK_MEDIATEK
default ARCH_MEDIATEK && ARM
@@ -27,49 +27,49 @@ config COMMON_CLK_MT2701
This driver supports MediaTek MT2701 basic clocks.
config COMMON_CLK_MT2701_MMSYS
- bool "Clock driver for MediaTek MT2701 mmsys"
+ tristate "Clock driver for MediaTek MT2701 mmsys"
depends on COMMON_CLK_MT2701
help
This driver supports MediaTek MT2701 mmsys clocks.
config COMMON_CLK_MT2701_IMGSYS
- bool "Clock driver for MediaTek MT2701 imgsys"
+ tristate "Clock driver for MediaTek MT2701 imgsys"
depends on COMMON_CLK_MT2701
help
This driver supports MediaTek MT2701 imgsys clocks.
config COMMON_CLK_MT2701_VDECSYS
- bool "Clock driver for MediaTek MT2701 vdecsys"
+ tristate "Clock driver for MediaTek MT2701 vdecsys"
depends on COMMON_CLK_MT2701
help
This driver supports MediaTek MT2701 vdecsys clocks.
config COMMON_CLK_MT2701_HIFSYS
- bool "Clock driver for MediaTek MT2701 hifsys"
+ tristate "Clock driver for MediaTek MT2701 hifsys"
depends on COMMON_CLK_MT2701
help
This driver supports MediaTek MT2701 hifsys clocks.
config COMMON_CLK_MT2701_ETHSYS
- bool "Clock driver for MediaTek MT2701 ethsys"
+ tristate "Clock driver for MediaTek MT2701 ethsys"
depends on COMMON_CLK_MT2701
help
This driver supports MediaTek MT2701 ethsys clocks.
config COMMON_CLK_MT2701_BDPSYS
- bool "Clock driver for MediaTek MT2701 bdpsys"
+ tristate "Clock driver for MediaTek MT2701 bdpsys"
depends on COMMON_CLK_MT2701
help
This driver supports MediaTek MT2701 bdpsys clocks.
config COMMON_CLK_MT2701_AUDSYS
- bool "Clock driver for Mediatek MT2701 audsys"
+ tristate "Clock driver for Mediatek MT2701 audsys"
depends on COMMON_CLK_MT2701
help
This driver supports Mediatek MT2701 audsys clocks.
config COMMON_CLK_MT2701_G3DSYS
- bool "Clock driver for MediaTek MT2701 g3dsys"
+ tristate "Clock driver for MediaTek MT2701 g3dsys"
depends on COMMON_CLK_MT2701
help
This driver supports MediaTek MT2701 g3dsys clocks.
diff --git a/drivers/clk/mediatek/clk-mt2701-aud.c b/drivers/clk/mediatek/clk-mt2701-aud.c
index e103121cf58e..533d35614661 100644
--- a/drivers/clk/mediatek/clk-mt2701-aud.c
+++ b/drivers/clk/mediatek/clk-mt2701-aud.c
@@ -128,6 +128,7 @@ static const struct mtk_gate audio_clks[] = {
static const struct mtk_clk_desc audio_desc = {
.clks = audio_clks,
.num_clks = ARRAY_SIZE(audio_clks),
+ .populate_children = true,
};
static const struct of_device_id of_match_clk_mt2701_aud[] = {
@@ -136,39 +137,9 @@ static const struct of_device_id of_match_clk_mt2701_aud[] = {
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt2701_aud);
-static int clk_mt2701_aud_probe(struct platform_device *pdev)
-{
- int r;
-
- r = mtk_clk_simple_probe(pdev);
- if (r) {
- dev_err(&pdev->dev,
- "could not register clock provider: %s: %d\n",
- pdev->name, r);
-
- return r;
- }
-
- r = devm_of_platform_populate(&pdev->dev);
- if (r)
- goto err_plat_populate;
-
- return 0;
-
-err_plat_populate:
- mtk_clk_simple_remove(pdev);
- return r;
-}
-
-static void clk_mt2701_aud_remove(struct platform_device *pdev)
-{
- of_platform_depopulate(&pdev->dev);
- mtk_clk_simple_remove(pdev);
-}
-
static struct platform_driver clk_mt2701_aud_drv = {
- .probe = clk_mt2701_aud_probe,
- .remove = clk_mt2701_aud_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt2701-aud",
.of_match_table = of_match_clk_mt2701_aud,
diff --git a/drivers/clk/mediatek/clk-mt2701.c b/drivers/clk/mediatek/clk-mt2701.c
index 710c4f2f9f30..5ea0c4acaf1b 100644
--- a/drivers/clk/mediatek/clk-mt2701.c
+++ b/drivers/clk/mediatek/clk-mt2701.c
@@ -6,6 +6,7 @@
#include <linux/clk-provider.h>
#include <linux/platform_device.h>
+#include <linux/module.h>
#include "clk-cpumux.h"
#include "clk-gate.h"
@@ -655,38 +656,19 @@ static const struct mtk_gate top_clks[] = {
28),
};
-static int mtk_topckgen_init(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- void __iomem *base;
- struct device_node *node = pdev->dev.of_node;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_alloc_clk_data(CLK_TOP_NR);
- if (!clk_data)
- return -ENOMEM;
-
- mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
- clk_data);
-
- mtk_clk_register_factors(top_fixed_divs, ARRAY_SIZE(top_fixed_divs),
- clk_data);
-
- mtk_clk_register_composites(&pdev->dev, top_muxes,
- ARRAY_SIZE(top_muxes), base,
- &mt2701_clk_lock, clk_data);
-
- mtk_clk_register_dividers(&pdev->dev, top_adj_divs, ARRAY_SIZE(top_adj_divs),
- base, &mt2701_clk_lock, clk_data);
-
- mtk_clk_register_gates(&pdev->dev, node, top_clks,
- ARRAY_SIZE(top_clks), clk_data);
-
- return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc topck_desc = {
+ .clks = top_clks,
+ .num_clks = ARRAY_SIZE(top_clks),
+ .fixed_clks = top_fixed_clks,
+ .num_fixed_clks = ARRAY_SIZE(top_fixed_clks),
+ .factor_clks = top_fixed_divs,
+ .num_factor_clks = ARRAY_SIZE(top_fixed_divs),
+ .composite_clks = top_muxes,
+ .num_composite_clks = ARRAY_SIZE(top_muxes),
+ .divider_clks = top_adj_divs,
+ .num_divider_clks = ARRAY_SIZE(top_adj_divs),
+ .clk_lock = &mt2701_clk_lock,
+};
static const struct mtk_gate_regs infra_cg_regs = {
.set_ofs = 0x0040,
@@ -725,81 +707,21 @@ static const struct mtk_fixed_factor infra_fixed_divs[] = {
static u16 infrasys_rst_ofs[] = { 0x30, 0x34, };
static u16 pericfg_rst_ofs[] = { 0x0, 0x4, };
-static const struct mtk_clk_rst_desc clk_rst_desc[] = {
- /* infrasys */
- {
- .version = MTK_RST_SIMPLE,
- .rst_bank_ofs = infrasys_rst_ofs,
- .rst_bank_nr = ARRAY_SIZE(infrasys_rst_ofs),
- },
- /* pericfg */
- {
- .version = MTK_RST_SIMPLE,
- .rst_bank_ofs = pericfg_rst_ofs,
- .rst_bank_nr = ARRAY_SIZE(pericfg_rst_ofs),
- },
+static const struct mtk_clk_rst_desc infra_rst_desc = {
+ .version = MTK_RST_SIMPLE,
+ .rst_bank_ofs = infrasys_rst_ofs,
+ .rst_bank_nr = ARRAY_SIZE(infrasys_rst_ofs),
};
-static struct clk_hw_onecell_data *infra_clk_data;
-
-static void __init mtk_infrasys_init_early(struct device_node *node)
-{
- int r, i;
-
- if (!infra_clk_data) {
- infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
- if (!infra_clk_data)
- return;
-
- for (i = 0; i < CLK_INFRA_NR; i++)
- infra_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
- }
-
- mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
- infra_clk_data);
-
- mtk_clk_register_cpumuxes(NULL, node, cpu_muxes, ARRAY_SIZE(cpu_muxes),
- infra_clk_data);
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
- infra_clk_data);
- if (r)
- pr_err("%s(): could not register clock provider: %d\n",
- __func__, r);
-}
-CLK_OF_DECLARE_DRIVER(mtk_infra, "mediatek,mt2701-infracfg",
- mtk_infrasys_init_early);
-
-static int mtk_infrasys_init(struct platform_device *pdev)
-{
- int r, i;
- struct device_node *node = pdev->dev.of_node;
-
- if (!infra_clk_data) {
- infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
- if (!infra_clk_data)
- return -ENOMEM;
- } else {
- for (i = 0; i < CLK_INFRA_NR; i++) {
- if (infra_clk_data->hws[i] == ERR_PTR(-EPROBE_DEFER))
- infra_clk_data->hws[i] = ERR_PTR(-ENOENT);
- }
- }
-
- mtk_clk_register_gates(&pdev->dev, node, infra_clks,
- ARRAY_SIZE(infra_clks), infra_clk_data);
- mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
- infra_clk_data);
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
- infra_clk_data);
- if (r)
- return r;
-
- mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[0]);
-
- return 0;
-}
+static const struct mtk_clk_desc infracfg_desc = {
+ .clks = infra_clks,
+ .num_clks = ARRAY_SIZE(infra_clks),
+ .factor_clks = infra_fixed_divs,
+ .num_factor_clks = ARRAY_SIZE(infra_fixed_divs),
+ .cpumuxes = cpu_muxes,
+ .num_cpumuxes = ARRAY_SIZE(cpu_muxes),
+ .rst_desc = &infra_rst_desc,
+};
static const struct mtk_gate_regs peri0_cg_regs = {
.set_ofs = 0x0008,
@@ -883,36 +805,20 @@ static const struct mtk_composite peri_muxs[] = {
0x40c, 3, 1),
};
-static int mtk_pericfg_init(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- void __iomem *base;
- int r;
- struct device_node *node = pdev->dev.of_node;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_alloc_clk_data(CLK_PERI_NR);
- if (!clk_data)
- return -ENOMEM;
-
- mtk_clk_register_gates(&pdev->dev, node, peri_clks,
- ARRAY_SIZE(peri_clks), clk_data);
-
- mtk_clk_register_composites(&pdev->dev, peri_muxs,
- ARRAY_SIZE(peri_muxs), base,
- &mt2701_clk_lock, clk_data);
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- return r;
-
- mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc[1]);
+static const struct mtk_clk_rst_desc peri_rst_desc = {
+ .version = MTK_RST_SIMPLE,
+ .rst_bank_ofs = pericfg_rst_ofs,
+ .rst_bank_nr = ARRAY_SIZE(pericfg_rst_ofs),
+};
- return 0;
-}
+static const struct mtk_clk_desc pericfg_desc = {
+ .clks = peri_clks,
+ .num_clks = ARRAY_SIZE(peri_clks),
+ .composite_clks = peri_muxs,
+ .num_composite_clks = ARRAY_SIZE(peri_muxs),
+ .rst_desc = &peri_rst_desc,
+ .clk_lock = &mt2701_clk_lock,
+};
#define MT8590_PLL_FMAX (2000 * MHZ)
#define CON0_MT8590_RST_BAR BIT(27)
@@ -968,74 +874,41 @@ static const struct mtk_fixed_factor apmixed_fixed_divs[] = {
FACTOR(CLK_APMIXED_HDMI_REF, "hdmi_ref", "tvdpll", 1, 1),
};
-static int mtk_apmixedsys_init(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
-
- clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR);
- if (!clk_data)
- return -ENOMEM;
-
- mtk_clk_register_plls(&pdev->dev, apmixed_plls, ARRAY_SIZE(apmixed_plls),
- clk_data);
- mtk_clk_register_factors(apmixed_fixed_divs, ARRAY_SIZE(apmixed_fixed_divs),
- clk_data);
-
- return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc apmixedsys_desc = {
+ .plls = apmixed_plls,
+ .num_plls = ARRAY_SIZE(apmixed_plls),
+ .factor_clks = apmixed_fixed_divs,
+ .num_factor_clks = ARRAY_SIZE(apmixed_fixed_divs),
+};
static const struct of_device_id of_match_clk_mt2701[] = {
{
.compatible = "mediatek,mt2701-topckgen",
- .data = mtk_topckgen_init,
+ .data = &topck_desc,
}, {
.compatible = "mediatek,mt2701-infracfg",
- .data = mtk_infrasys_init,
+ .data = &infracfg_desc,
}, {
.compatible = "mediatek,mt2701-pericfg",
- .data = mtk_pericfg_init,
+ .data = &pericfg_desc,
}, {
.compatible = "mediatek,mt2701-apmixedsys",
- .data = mtk_apmixedsys_init,
+ .data = &apmixedsys_desc,
}, {
/* sentinel */
}
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt2701);
-static int clk_mt2701_probe(struct platform_device *pdev)
-{
- int (*clk_init)(struct platform_device *);
- int r;
-
- clk_init = of_device_get_match_data(&pdev->dev);
- if (!clk_init)
- return -EINVAL;
-
- r = clk_init(pdev);
- if (r)
- dev_err(&pdev->dev,
- "could not register clock provider: %s: %d\n",
- pdev->name, r);
-
- return r;
-}
-
static struct platform_driver clk_mt2701_drv = {
- .probe = clk_mt2701_probe,
.driver = {
.name = "clk-mt2701",
.of_match_table = of_match_clk_mt2701,
},
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
};
-
-static int __init clk_mt2701_init(void)
-{
- return platform_driver_register(&clk_mt2701_drv);
-}
-
-arch_initcall(clk_mt2701_init);
+module_platform_driver(clk_mt2701_drv);
MODULE_DESCRIPTION("MediaTek MT2701 main clocks driver");
MODULE_LICENSE("GPL");
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 14/32] clk: mediatek: mt2712-apmixedsys: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (12 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 13/32] clk: mediatek: mt2701: Switch " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 15/32] clk: mediatek: mt6735-apmixedsys: " Akari Tsuyukusa
` (18 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT2712 apmixedsys driver can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt2712-apmixedsys.c | 50 +++-----------------
1 file changed, 7 insertions(+), 43 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt2712-apmixedsys.c b/drivers/clk/mediatek/clk-mt2712-apmixedsys.c
index 087cf574bcdc..1e06f87e71d0 100644
--- a/drivers/clk/mediatek/clk-mt2712-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt2712-apmixedsys.c
@@ -109,56 +109,20 @@ static const struct mtk_pll_data plls[] = {
0, 31, 0x0300, 4, 0, 0, 0, 0x0304, 0),
};
-static int clk_mt2712_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- int r;
- struct device_node *node = pdev->dev.of_node;
-
- clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- r = mtk_clk_register_plls(&pdev->dev, plls, ARRAY_SIZE(plls), clk_data);
- if (r)
- goto free_clk_data;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r) {
- dev_err(&pdev->dev, "Cannot register clock provider: %d\n", r);
- goto unregister_plls;
- }
-
- platform_set_drvdata(pdev, clk_data);
-
- return 0;
-
-unregister_plls:
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
-free_clk_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
-static void clk_mt2712_apmixed_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
- mtk_free_clk_data(clk_data);
-}
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+};
static const struct of_device_id of_match_clk_mt2712_apmixed[] = {
- { .compatible = "mediatek,mt2712-apmixedsys" },
+ { .compatible = "mediatek,mt2712-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt2712_apmixed);
static struct platform_driver clk_mt2712_apmixed_drv = {
- .probe = clk_mt2712_apmixed_probe,
- .remove = clk_mt2712_apmixed_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt2712-apmixed",
.of_match_table = of_match_clk_mt2712_apmixed,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 15/32] clk: mediatek: mt6735-apmixedsys: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (13 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 14/32] clk: mediatek: mt2712-apmixedsys: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 16/32] clk: mediatek: mt6779: " Akari Tsuyukusa
` (17 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT6735 apmixedsys driver can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt6735-apmixedsys.c | 48 +++-----------------
1 file changed, 7 insertions(+), 41 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt6735-apmixedsys.c b/drivers/clk/mediatek/clk-mt6735-apmixedsys.c
index 9e30c089a209..94cb0bee8bb4 100644
--- a/drivers/clk/mediatek/clk-mt6735-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt6735-apmixedsys.c
@@ -77,54 +77,20 @@ static const struct mtk_pll_data apmixedsys_plls[] = {
PLL(CLK_APMIXED_APLL2, "apll2", APLL2_CON0, APLL2_PWR_CON0, 0x00000001, 0, APLL2_CON0, 4, APLL2_CON2, AP_PLL_CON_5, 1, APLL2_CON1, 31, 0)
};
-static int clk_mt6735_apmixed_probe(struct platform_device *pdev)
-{
- void __iomem *base;
- struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- struct clk_hw_onecell_data *clk_data;
- int ret;
-
- base = devm_ioremap_resource(&pdev->dev, res);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_devm_alloc_clk_data(&pdev->dev, ARRAY_SIZE(apmixedsys_plls));
- if (!clk_data)
- return -ENOMEM;
- platform_set_drvdata(pdev, clk_data);
-
- ret = mtk_clk_register_plls(&pdev->dev, apmixedsys_plls,
- ARRAY_SIZE(apmixedsys_plls), clk_data);
- if (ret) {
- dev_err(&pdev->dev, "Failed to register PLLs: %d\n", ret);
- return ret;
- }
-
- ret = devm_of_clk_add_hw_provider(&pdev->dev, of_clk_hw_onecell_get,
- clk_data);
- if (ret)
- dev_err(&pdev->dev,
- "Failed to register clock provider: %d\n", ret);
-
- return ret;
-}
-
-static void clk_mt6735_apmixed_remove(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- mtk_clk_unregister_plls(apmixedsys_plls, ARRAY_SIZE(apmixedsys_plls), clk_data);
-}
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = apmixedsys_plls,
+ .num_plls = ARRAY_SIZE(apmixedsys_plls),
+};
static const struct of_device_id of_match_mt6735_apmixedsys[] = {
- { .compatible = "mediatek,mt6735-apmixedsys" },
+ { .compatible = "mediatek,mt6735-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_mt6735_apmixedsys);
static struct platform_driver clk_mt6735_apmixedsys = {
- .probe = clk_mt6735_apmixed_probe,
- .remove = clk_mt6735_apmixed_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt6735-apmixedsys",
.of_match_table = of_match_mt6735_apmixedsys,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 16/32] clk: mediatek: mt6779: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (14 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 15/32] clk: mediatek: mt6735-apmixedsys: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 17/32] clk: mediatek: mt6795: " Akari Tsuyukusa
` (16 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT6779 main clock driver can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Additionally, merge the separate infracfg and other drivers into
a single platform driver, and add support for the apmixed and
topckgen clock controllers using the consolidated of_match_table.
Finally, replace the custom arch_initcall() initialization loop with
the module_platform_driver() macro.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt6779.c | 124 ++++++------------------------
1 file changed, 22 insertions(+), 102 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt6779.c b/drivers/clk/mediatek/clk-mt6779.c
index 4b9dcb910b03..a806789ae27c 100644
--- a/drivers/clk/mediatek/clk-mt6779.c
+++ b/drivers/clk/mediatek/clk-mt6779.c
@@ -808,7 +808,7 @@ static const char * const i2s5_m_ck_parents[] = {
"aud_2_sel"
};
-static const struct mtk_composite top_aud_muxes[] = {
+static const struct mtk_composite top_aud_muxes_divs[] = {
MUX(CLK_TOP_I2S0_M_SEL, "i2s0_m_ck_sel", i2s0_m_ck_parents,
0x320, 8, 1),
MUX(CLK_TOP_I2S1_M_SEL, "i2s1_m_ck_sel", i2s1_m_ck_parents,
@@ -821,9 +821,7 @@ static const struct mtk_composite top_aud_muxes[] = {
0x320, 12, 1),
MUX(CLK_TOP_I2S5_M_SEL, "i2s5_m_ck_sel", i2s5_m_ck_parents,
0x328, 20, 1),
-};
-static struct mtk_composite top_aud_divs[] = {
DIV_GATE(CLK_TOP_APLL12_DIV0, "apll12_div0", "i2s0_m_ck_sel",
0x320, 2, 0x324, 8, 0),
DIV_GATE(CLK_TOP_APLL12_DIV1, "apll12_div1", "i2s1_m_ck_sel",
@@ -1211,125 +1209,47 @@ static const struct mtk_pll_data plls[] = {
0, 0, 32, 8, 0x02D4, 1, 0, 0x14, 1, 0x02D8, 0, 0x02D4),
};
-static int clk_mt6779_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
-
- clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- mtk_clk_register_plls(&pdev->dev, plls, ARRAY_SIZE(plls), clk_data);
-
- mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
- ARRAY_SIZE(apmixed_clks), clk_data);
-
- return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
-
-static int clk_mt6779_top_probe(struct platform_device *pdev)
-{
- void __iomem *base;
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
- clk_data);
-
- mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
-
- mtk_clk_register_muxes(&pdev->dev, top_muxes,
- ARRAY_SIZE(top_muxes), node,
- &mt6779_clk_lock, clk_data);
-
- mtk_clk_register_composites(&pdev->dev, top_aud_muxes,
- ARRAY_SIZE(top_aud_muxes), base,
- &mt6779_clk_lock, clk_data);
-
- mtk_clk_register_composites(&pdev->dev, top_aud_divs,
- ARRAY_SIZE(top_aud_divs), base,
- &mt6779_clk_lock, clk_data);
-
- return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
-
-static const struct of_device_id of_match_clk_mt6779[] = {
- {
- .compatible = "mediatek,mt6779-apmixed",
- .data = clk_mt6779_apmixed_probe,
- }, {
- .compatible = "mediatek,mt6779-topckgen",
- .data = clk_mt6779_top_probe,
- }, {
- /* sentinel */
- }
+static const struct mtk_clk_desc apmixed_desc = {
+ .clks = apmixed_clks,
+ .num_clks = ARRAY_SIZE(apmixed_clks),
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
};
-static int clk_mt6779_probe(struct platform_device *pdev)
-{
- int (*clk_probe)(struct platform_device *pdev);
- int r;
-
- clk_probe = of_device_get_match_data(&pdev->dev);
- if (!clk_probe)
- return -EINVAL;
-
- r = clk_probe(pdev);
- if (r)
- dev_err(&pdev->dev,
- "could not register clock provider: %s: %d\n",
- pdev->name, r);
-
- return r;
-}
+static const struct mtk_clk_desc topck_desc = {
+ .fixed_clks = top_fixed_clks,
+ .num_fixed_clks = ARRAY_SIZE(top_fixed_clks),
+ .factor_clks = top_divs,
+ .num_factor_clks = ARRAY_SIZE(top_divs),
+ .mux_clks = top_muxes,
+ .num_mux_clks = ARRAY_SIZE(top_muxes),
+ .composite_clks = top_aud_muxes_divs,
+ .num_composite_clks = ARRAY_SIZE(top_aud_muxes_divs),
+ .clk_lock = &mt6779_clk_lock,
+};
static const struct mtk_clk_desc infra_desc = {
.clks = infra_clks,
.num_clks = ARRAY_SIZE(infra_clks),
};
-static const struct of_device_id of_match_clk_mt6779_infra[] = {
+static const struct of_device_id of_match_clk_mt6779[] = {
+ { .compatible = "mediatek,mt6779-apmixed", .data = &apmixed_desc },
+ { .compatible = "mediatek,mt6779-topckgen", .data = &topck_desc },
{ .compatible = "mediatek,mt6779-infracfg_ao", .data = &infra_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt6779);
-static struct platform_driver clk_mt6779_infra_drv = {
+static struct platform_driver clk_mt6779_drv = {
.probe = mtk_clk_simple_probe,
.remove = mtk_clk_simple_remove,
- .driver = {
- .name = "clk-mt6779-infra",
- .of_match_table = of_match_clk_mt6779_infra,
- },
-};
-
-static struct platform_driver clk_mt6779_drv = {
- .probe = clk_mt6779_probe,
.driver = {
.name = "clk-mt6779",
.of_match_table = of_match_clk_mt6779,
},
};
-
-static int __init clk_mt6779_init(void)
-{
- int ret = platform_driver_register(&clk_mt6779_drv);
-
- if (ret)
- return ret;
- return platform_driver_register(&clk_mt6779_infra_drv);
-}
-
-arch_initcall(clk_mt6779_init);
+module_platform_driver(clk_mt6779_drv);
MODULE_DESCRIPTION("MediaTek MT6779 main clocks driver");
MODULE_LICENSE("GPL");
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 17/32] clk: mediatek: mt6795: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (15 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 16/32] clk: mediatek: mt6779: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 18/32] clk: mediatek: mt6797: " Akari Tsuyukusa
` (15 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT6795 infracfg and pericfg drivers can use the MediaTek clock
framework common initialization sequence. Reduce boilerplate code by
creating struct mtk_clk_desc and using the mtk_clk_simple_probe/remove
helpers.
Note that the apmixedsys driver is excluded from this conversion because
it requires ref2usb_tx clock handling, which is not currently supported
by the common simple probe helper.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt6795-infracfg.c | 72 ++++-----------------
drivers/clk/mediatek/clk-mt6795-pericfg.c | 73 ++++------------------
2 files changed, 23 insertions(+), 122 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt6795-infracfg.c b/drivers/clk/mediatek/clk-mt6795-infracfg.c
index 914bb069aa85..6aefc577ece5 100644
--- a/drivers/clk/mediatek/clk-mt6795-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt6795-infracfg.c
@@ -8,7 +8,6 @@
#include <dt-bindings/reset/mediatek,mt6795-resets.h>
#include <linux/module.h>
#include <linux/platform_device.h>
-#include "clk-cpumux.h"
#include "clk-gate.h"
#include "clk-mtk.h"
#include "reset.h"
@@ -77,76 +76,27 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
.rst_idx_map_nr = ARRAY_SIZE(infra_ao_idx_map),
};
+static const struct mtk_clk_desc infra_desc = {
+ .clks = infra_gates,
+ .num_clks = ARRAY_SIZE(infra_gates),
+ .cpumuxes = cpu_muxes,
+ .num_cpumuxes = ARRAY_SIZE(cpu_muxes),
+ .rst_desc = &clk_rst_desc,
+};
+
static const struct of_device_id of_match_clk_mt6795_infracfg[] = {
- { .compatible = "mediatek,mt6795-infracfg" },
+ { .compatible = "mediatek,mt6795-infracfg", .data = &infra_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt6795_infracfg);
-static int clk_mt6795_infracfg_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- void __iomem *base;
- int ret;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- ret = mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
- if (ret)
- goto free_clk_data;
-
- ret = mtk_clk_register_gates(&pdev->dev, node, infra_gates,
- ARRAY_SIZE(infra_gates), clk_data);
- if (ret)
- goto free_clk_data;
-
- ret = mtk_clk_register_cpumuxes(&pdev->dev, node, cpu_muxes,
- ARRAY_SIZE(cpu_muxes), clk_data);
- if (ret)
- goto unregister_gates;
-
- ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (ret)
- goto unregister_cpumuxes;
-
- platform_set_drvdata(pdev, clk_data);
-
- return 0;
-
-unregister_cpumuxes:
- mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
-unregister_gates:
- mtk_clk_unregister_gates(infra_gates, ARRAY_SIZE(infra_gates), clk_data);
-free_clk_data:
- mtk_free_clk_data(clk_data);
- return ret;
-}
-
-static void clk_mt6795_infracfg_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
- mtk_clk_unregister_gates(infra_gates, ARRAY_SIZE(infra_gates), clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt6795_infracfg_drv = {
.driver = {
.name = "clk-mt6795-infracfg",
.of_match_table = of_match_clk_mt6795_infracfg,
},
- .probe = clk_mt6795_infracfg_probe,
- .remove = clk_mt6795_infracfg_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
};
module_platform_driver(clk_mt6795_infracfg_drv);
diff --git a/drivers/clk/mediatek/clk-mt6795-pericfg.c b/drivers/clk/mediatek/clk-mt6795-pericfg.c
index 27d0ef7d7b2f..53c79e830b6a 100644
--- a/drivers/clk/mediatek/clk-mt6795-pericfg.c
+++ b/drivers/clk/mediatek/clk-mt6795-pericfg.c
@@ -85,77 +85,28 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
.rst_idx_map_nr = ARRAY_SIZE(peri_idx_map),
};
+static const struct mtk_clk_desc pericfg_desc = {
+ .clks = peri_gates,
+ .num_clks = ARRAY_SIZE(peri_gates),
+ .composite_clks = peri_clks,
+ .num_composite_clks = ARRAY_SIZE(peri_clks),
+ .rst_desc = &clk_rst_desc,
+ .clk_lock = &mt6795_peri_clk_lock,
+};
+
static const struct of_device_id of_match_clk_mt6795_pericfg[] = {
- { .compatible = "mediatek,mt6795-pericfg" },
+ { .compatible = "mediatek,mt6795-pericfg", .data = &pericfg_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt6795_pericfg);
-static int clk_mt6795_pericfg_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- void __iomem *base;
- int ret;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- ret = mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
- if (ret)
- goto free_clk_data;
-
- ret = mtk_clk_register_gates(&pdev->dev, node, peri_gates,
- ARRAY_SIZE(peri_gates), clk_data);
- if (ret)
- goto free_clk_data;
-
- ret = mtk_clk_register_composites(&pdev->dev, peri_clks,
- ARRAY_SIZE(peri_clks), base,
- &mt6795_peri_clk_lock, clk_data);
- if (ret)
- goto unregister_gates;
-
- ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (ret)
- goto unregister_composites;
-
- platform_set_drvdata(pdev, clk_data);
-
- return 0;
-
-unregister_composites:
- mtk_clk_unregister_composites(peri_clks, ARRAY_SIZE(peri_clks), clk_data);
-unregister_gates:
- mtk_clk_unregister_gates(peri_gates, ARRAY_SIZE(peri_gates), clk_data);
-free_clk_data:
- mtk_free_clk_data(clk_data);
- return ret;
-}
-
-static void clk_mt6795_pericfg_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_composites(peri_clks, ARRAY_SIZE(peri_clks), clk_data);
- mtk_clk_unregister_gates(peri_gates, ARRAY_SIZE(peri_gates), clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt6795_pericfg_drv = {
.driver = {
.name = "clk-mt6795-pericfg",
.of_match_table = of_match_clk_mt6795_pericfg,
},
- .probe = clk_mt6795_pericfg_probe,
- .remove = clk_mt6795_pericfg_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
};
module_platform_driver(clk_mt6795_pericfg_drv);
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 18/32] clk: mediatek: mt6797: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (16 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 17/32] clk: mediatek: mt6795: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 19/32] clk: mediatek: mt7622: " Akari Tsuyukusa
` (14 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT6797 clock drivers can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Drop the CLK_OF_DECLARE_DRIVER early init for infracfg; the kernel's
deferred probe mechanism ensures dependent drivers like cpufreq are
initialized correctly.
Since all MT6797 clock drivers can now be built as modules,
change Kconfig setting to "tristate".
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/Kconfig | 2 +-
drivers/clk/mediatek/clk-mt6797.c | 140 +++++-------------------------
2 files changed, 24 insertions(+), 118 deletions(-)
diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig
index b58656a7e8c3..f5460ce3ffba 100644
--- a/drivers/clk/mediatek/Kconfig
+++ b/drivers/clk/mediatek/Kconfig
@@ -342,7 +342,7 @@ config COMMON_CLK_MT6795_VENCSYS
This driver supports MediaTek MT6795 vencsys clocks.
config COMMON_CLK_MT6797
- bool "Clock driver for MediaTek MT6797"
+ tristate "Clock driver for MediaTek MT6797"
depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
select COMMON_CLK_MEDIATEK
default ARCH_MEDIATEK && ARM64
diff --git a/drivers/clk/mediatek/clk-mt6797.c b/drivers/clk/mediatek/clk-mt6797.c
index ebf850ac57f5..1934420375e8 100644
--- a/drivers/clk/mediatek/clk-mt6797.c
+++ b/drivers/clk/mediatek/clk-mt6797.c
@@ -379,29 +379,13 @@ static const struct mtk_composite top_muxes[] = {
0x0104, 1, 2),
};
-static int mtk_topckgen_init(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- void __iomem *base;
- struct device_node *node = pdev->dev.of_node;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_alloc_clk_data(CLK_TOP_NR);
- if (!clk_data)
- return -ENOMEM;
-
- mtk_clk_register_factors(top_fixed_divs, ARRAY_SIZE(top_fixed_divs),
- clk_data);
-
- mtk_clk_register_composites(&pdev->dev, top_muxes,
- ARRAY_SIZE(top_muxes), base,
- &mt6797_clk_lock, clk_data);
-
- return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc topckgen_desc = {
+ .factor_clks = top_fixed_divs,
+ .num_factor_clks = ARRAY_SIZE(top_fixed_divs),
+ .composite_clks = top_muxes,
+ .num_composite_clks = ARRAY_SIZE(top_muxes),
+ .clk_lock = &mt6797_clk_lock,
+};
static const struct mtk_gate_regs infra0_cg_regs = {
.set_ofs = 0x0080,
@@ -539,58 +523,12 @@ static const struct mtk_fixed_factor infra_fixed_divs[] = {
FACTOR(CLK_INFRA_13M, "clk13m", "clk26m", 1, 2),
};
-static struct clk_hw_onecell_data *infra_clk_data;
-
-static void mtk_infrasys_init_early(struct device_node *node)
-{
- int r, i;
-
- if (!infra_clk_data) {
- infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
- if (!infra_clk_data)
- return;
-
- for (i = 0; i < CLK_INFRA_NR; i++)
- infra_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
- }
-
- mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
- infra_clk_data);
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
- infra_clk_data);
- if (r)
- pr_err("%s(): could not register clock provider: %d\n",
- __func__, r);
-}
-
-CLK_OF_DECLARE_DRIVER(mtk_infra, "mediatek,mt6797-infracfg",
- mtk_infrasys_init_early);
-
-static int mtk_infrasys_init(struct platform_device *pdev)
-{
- int i;
- struct device_node *node = pdev->dev.of_node;
-
- if (!infra_clk_data) {
- infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
- if (!infra_clk_data)
- return -ENOMEM;
- } else {
- for (i = 0; i < CLK_INFRA_NR; i++) {
- if (infra_clk_data->hws[i] == ERR_PTR(-EPROBE_DEFER))
- infra_clk_data->hws[i] = ERR_PTR(-ENOENT);
- }
- }
-
- mtk_clk_register_gates(&pdev->dev, node, infra_clks,
- ARRAY_SIZE(infra_clks), infra_clk_data);
- mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
- infra_clk_data);
-
- return of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
- infra_clk_data);
-}
+static const struct mtk_clk_desc infracfg_desc = {
+ .clks = infra_clks,
+ .num_clks = ARRAY_SIZE(infra_clks),
+ .factor_clks = infra_fixed_divs,
+ .num_factor_clks = ARRAY_SIZE(infra_fixed_divs),
+};
#define MT6797_PLL_FMAX (3000UL * MHZ)
@@ -646,68 +584,36 @@ static const struct mtk_pll_data plls[] = {
0x2B4, 4, 0x2BC, 0x2B8, 0),
};
-static int mtk_apmixedsys_init(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
-
- clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR);
- if (!clk_data)
- return -ENOMEM;
-
- mtk_clk_register_plls(&pdev->dev, plls, ARRAY_SIZE(plls), clk_data);
-
- return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc apmixedsys_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+};
static const struct of_device_id of_match_clk_mt6797[] = {
{
.compatible = "mediatek,mt6797-topckgen",
- .data = mtk_topckgen_init,
+ .data = &topckgen_desc,
}, {
.compatible = "mediatek,mt6797-infracfg",
- .data = mtk_infrasys_init,
+ .data = &infracfg_desc,
}, {
.compatible = "mediatek,mt6797-apmixedsys",
- .data = mtk_apmixedsys_init,
+ .data = &apmixedsys_desc,
}, {
/* sentinel */
}
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt6797);
-static int clk_mt6797_probe(struct platform_device *pdev)
-{
- int (*clk_init)(struct platform_device *);
- int r;
-
- clk_init = of_device_get_match_data(&pdev->dev);
- if (!clk_init)
- return -EINVAL;
-
- r = clk_init(pdev);
- if (r)
- dev_err(&pdev->dev,
- "could not register clock provider: %s: %d\n",
- pdev->name, r);
-
- return r;
-}
-
static struct platform_driver clk_mt6797_drv = {
- .probe = clk_mt6797_probe,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt6797",
.of_match_table = of_match_clk_mt6797,
},
};
-
-static int __init clk_mt6797_init(void)
-{
- return platform_driver_register(&clk_mt6797_drv);
-}
-
-arch_initcall(clk_mt6797_init);
+module_platform_driver(clk_mt6797_drv);
MODULE_DESCRIPTION("MediaTek MT6797 main clocks driver");
MODULE_LICENSE("GPL");
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 19/32] clk: mediatek: mt7622: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (17 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 18/32] clk: mediatek: mt6797: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 20/32] clk: mediatek: mt7981-apmixed: " Akari Tsuyukusa
` (13 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT7622 clock drivers can use the MediaTek clock framework common
initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt7622-apmixedsys.c | 62 +++--------------
drivers/clk/mediatek/clk-mt7622-aud.c | 35 +---------
drivers/clk/mediatek/clk-mt7622-infracfg.c | 72 +++-----------------
3 files changed, 23 insertions(+), 146 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt7622-apmixedsys.c b/drivers/clk/mediatek/clk-mt7622-apmixedsys.c
index fae8abda14b3..e9f731eadace 100644
--- a/drivers/clk/mediatek/clk-mt7622-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt7622-apmixedsys.c
@@ -80,66 +80,22 @@ static const struct mtk_gate apmixed_clks[] = {
GATE_APMIXED_AO(CLK_APMIXED_MAIN_CORE_EN, "main_core_en", "mainpll", 5),
};
-static int clk_mt7622_apmixed_probe(struct platform_device *pdev)
-{
- void __iomem *base;
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- struct device *dev = &pdev->dev;
- int ret;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_devm_alloc_clk_data(dev, CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- ret = mtk_clk_register_plls(dev, plls, ARRAY_SIZE(plls), clk_data);
- if (ret)
- return ret;
-
- ret = mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
- ARRAY_SIZE(apmixed_clks), clk_data);
- if (ret)
- goto unregister_plls;
-
- ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (ret)
- goto unregister_gates;
-
- platform_set_drvdata(pdev, clk_data);
-
- return 0;
-
-unregister_gates:
- mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
-unregister_plls:
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
-
- return ret;
-}
-
-static void clk_mt7622_apmixed_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
-}
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+ .clks = apmixed_clks,
+ .num_clks = ARRAY_SIZE(apmixed_clks),
+};
static const struct of_device_id of_match_clk_mt7622_apmixed[] = {
- { .compatible = "mediatek,mt7622-apmixedsys" },
+ { .compatible = "mediatek,mt7622-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt7622_apmixed);
static struct platform_driver clk_mt7622_apmixed_drv = {
- .probe = clk_mt7622_apmixed_probe,
- .remove = clk_mt7622_apmixed_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt7622-apmixed",
.of_match_table = of_match_clk_mt7622_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt7622-aud.c b/drivers/clk/mediatek/clk-mt7622-aud.c
index a4ea5e20efa2..6004c58be1b5 100644
--- a/drivers/clk/mediatek/clk-mt7622-aud.c
+++ b/drivers/clk/mediatek/clk-mt7622-aud.c
@@ -110,38 +110,9 @@ static const struct mtk_gate audio_clks[] = {
static const struct mtk_clk_desc audio_desc = {
.clks = audio_clks,
.num_clks = ARRAY_SIZE(audio_clks),
+ .populate_children = true,
};
-static int clk_mt7622_aud_probe(struct platform_device *pdev)
-{
- int r;
-
- r = mtk_clk_simple_probe(pdev);
- if (r) {
- dev_err(&pdev->dev,
- "could not register clock provider: %s: %d\n",
- pdev->name, r);
-
- return r;
- }
-
- r = devm_of_platform_populate(&pdev->dev);
- if (r)
- goto err_plat_populate;
-
- return 0;
-
-err_plat_populate:
- mtk_clk_simple_remove(pdev);
- return r;
-}
-
-static void clk_mt7622_aud_remove(struct platform_device *pdev)
-{
- of_platform_depopulate(&pdev->dev);
- mtk_clk_simple_remove(pdev);
-}
-
static const struct of_device_id of_match_clk_mt7622_aud[] = {
{ .compatible = "mediatek,mt7622-audsys", .data = &audio_desc },
{ /* sentinel */ }
@@ -149,8 +120,8 @@ static const struct of_device_id of_match_clk_mt7622_aud[] = {
MODULE_DEVICE_TABLE(of, of_match_clk_mt7622_aud);
static struct platform_driver clk_mt7622_aud_drv = {
- .probe = clk_mt7622_aud_probe,
- .remove = clk_mt7622_aud_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt7622-aud",
.of_match_table = of_match_clk_mt7622_aud,
diff --git a/drivers/clk/mediatek/clk-mt7622-infracfg.c b/drivers/clk/mediatek/clk-mt7622-infracfg.c
index cec19447d637..2e463d1481d0 100644
--- a/drivers/clk/mediatek/clk-mt7622-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt7622-infracfg.c
@@ -9,7 +9,6 @@
#include <linux/module.h>
#include <linux/platform_device.h>
-#include "clk-cpumux.h"
#include "clk-gate.h"
#include "clk-mtk.h"
#include "reset.h"
@@ -51,76 +50,27 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
.rst_bank_nr = ARRAY_SIZE(infrasys_rst_ofs),
};
+static const struct mtk_clk_desc infra_desc = {
+ .clks = infra_clks,
+ .num_clks = ARRAY_SIZE(infra_clks),
+ .cpumuxes = cpu_muxes,
+ .num_cpumuxes = ARRAY_SIZE(cpu_muxes),
+ .rst_desc = &clk_rst_desc,
+};
+
static const struct of_device_id of_match_clk_mt7622_infracfg[] = {
- { .compatible = "mediatek,mt7622-infracfg" },
+ { .compatible = "mediatek,mt7622-infracfg", .data = &infra_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt7622_infracfg);
-static int clk_mt7622_infracfg_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- void __iomem *base;
- int ret;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- ret = mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
- if (ret)
- goto free_clk_data;
-
- ret = mtk_clk_register_gates(&pdev->dev, node, infra_clks,
- ARRAY_SIZE(infra_clks), clk_data);
- if (ret)
- goto free_clk_data;
-
- ret = mtk_clk_register_cpumuxes(&pdev->dev, node, cpu_muxes,
- ARRAY_SIZE(cpu_muxes), clk_data);
- if (ret)
- goto unregister_gates;
-
- ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (ret)
- goto unregister_cpumuxes;
-
- platform_set_drvdata(pdev, clk_data);
-
- return 0;
-
-unregister_cpumuxes:
- mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
-unregister_gates:
- mtk_clk_unregister_gates(infra_clks, ARRAY_SIZE(infra_clks), clk_data);
-free_clk_data:
- mtk_free_clk_data(clk_data);
- return ret;
-}
-
-static void clk_mt7622_infracfg_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
- mtk_clk_unregister_gates(infra_clks, ARRAY_SIZE(infra_clks), clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt7622_infracfg_drv = {
.driver = {
.name = "clk-mt7622-infracfg",
.of_match_table = of_match_clk_mt7622_infracfg,
},
- .probe = clk_mt7622_infracfg_probe,
- .remove = clk_mt7622_infracfg_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
};
module_platform_driver(clk_mt7622_infracfg_drv);
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 20/32] clk: mediatek: mt7981-apmixed: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (18 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 19/32] clk: mediatek: mt7622: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 21/32] clk: mediatek: mt7986-apmixed: " Akari Tsuyukusa
` (12 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT7981 apmixed driver can use the MediaTek clock framework common
initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
This change also makes it possible to build the driver as a module.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/Kconfig | 2 +-
drivers/clk/mediatek/clk-mt7981-apmixed.c | 37 ++++++-----------------
2 files changed, 10 insertions(+), 29 deletions(-)
diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig
index f5460ce3ffba..6449b77d56ed 100644
--- a/drivers/clk/mediatek/Kconfig
+++ b/drivers/clk/mediatek/Kconfig
@@ -427,7 +427,7 @@ config COMMON_CLK_MT7629_HIFSYS
to PCI-E and USB.
config COMMON_CLK_MT7981
- bool "Clock driver for MediaTek MT7981"
+ tristate "Clock driver for MediaTek MT7981"
depends on ARCH_MEDIATEK || COMPILE_TEST
select COMMON_CLK_MEDIATEK
default ARCH_MEDIATEK
diff --git a/drivers/clk/mediatek/clk-mt7981-apmixed.c b/drivers/clk/mediatek/clk-mt7981-apmixed.c
index 851d0bc7840a..810395aff253 100644
--- a/drivers/clk/mediatek/clk-mt7981-apmixed.c
+++ b/drivers/clk/mediatek/clk-mt7981-apmixed.c
@@ -59,45 +59,26 @@ static const struct mtk_pll_data plls[] = {
0x0278, 4, 0, 0x027C, 0),
};
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+};
+
static const struct of_device_id of_match_clk_mt7981_apmixed[] = {
- { .compatible = "mediatek,mt7981-apmixedsys", },
+ { .compatible = "mediatek,mt7981-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt7981_apmixed);
-static int clk_mt7981_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- int r;
-
- clk_data = mtk_alloc_clk_data(ARRAY_SIZE(plls));
- if (!clk_data)
- return -ENOMEM;
-
- mtk_clk_register_plls(&pdev->dev, plls, ARRAY_SIZE(plls), clk_data);
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r) {
- pr_err("%s(): could not register clock provider: %d\n",
- __func__, r);
- goto free_apmixed_data;
- }
- return r;
-
-free_apmixed_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
static struct platform_driver clk_mt7981_apmixed_drv = {
- .probe = clk_mt7981_apmixed_probe,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt7981-apmixed",
.of_match_table = of_match_clk_mt7981_apmixed,
},
};
-builtin_platform_driver(clk_mt7981_apmixed_drv);
+module_platform_driver(clk_mt7981_apmixed_drv);
MODULE_DESCRIPTION("MediaTek MT7981 apmixedsys clocks driver");
MODULE_LICENSE("GPL");
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 21/32] clk: mediatek: mt7986-apmixed: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (19 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 20/32] clk: mediatek: mt7981-apmixed: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 22/32] clk: mediatek: mt7988-apmixed: " Akari Tsuyukusa
` (11 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT7986 apmixed driver can use the MediaTek clock framework common
initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Also, add a remove callback to properly support module unloading.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt7986-apmixed.c | 37 ++++++-----------------
1 file changed, 9 insertions(+), 28 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt7986-apmixed.c b/drivers/clk/mediatek/clk-mt7986-apmixed.c
index af3e002bbfb7..6df3e9555e4e 100644
--- a/drivers/clk/mediatek/clk-mt7986-apmixed.c
+++ b/drivers/clk/mediatek/clk-mt7986-apmixed.c
@@ -57,45 +57,26 @@ static const struct mtk_pll_data plls[] = {
0x0278, 4, 0, 0x027c, 0),
};
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+};
+
static const struct of_device_id of_match_clk_mt7986_apmixed[] = {
- { .compatible = "mediatek,mt7986-apmixedsys", },
+ { .compatible = "mediatek,mt7986-apmixedsys", .data = &apmixed_desc },
{ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt7986_apmixed);
-static int clk_mt7986_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- int r;
-
- clk_data = mtk_alloc_clk_data(ARRAY_SIZE(plls));
- if (!clk_data)
- return -ENOMEM;
-
- mtk_clk_register_plls(&pdev->dev, plls, ARRAY_SIZE(plls), clk_data);
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r) {
- pr_err("%s(): could not register clock provider: %d\n",
- __func__, r);
- goto free_apmixed_data;
- }
- return r;
-
-free_apmixed_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
static struct platform_driver clk_mt7986_apmixed_drv = {
- .probe = clk_mt7986_apmixed_probe,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt7986-apmixed",
.of_match_table = of_match_clk_mt7986_apmixed,
},
};
-builtin_platform_driver(clk_mt7986_apmixed_drv);
+module_platform_driver(clk_mt7986_apmixed_drv);
MODULE_DESCRIPTION("MediaTek MT7986 apmixedsys clocks driver");
MODULE_LICENSE("GPL");
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 22/32] clk: mediatek: mt7988-apmixed: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (20 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 21/32] clk: mediatek: mt7986-apmixed: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 23/32] clk: mediatek: mt8135-apmixedsys: " Akari Tsuyukusa
` (10 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT7988 apmixed driver can use the MediaTek clock framework common
initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt7988-apmixed.c | 39 ++++++-----------------
1 file changed, 9 insertions(+), 30 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt7988-apmixed.c b/drivers/clk/mediatek/clk-mt7988-apmixed.c
index 24f4e7b87a31..f7bb00e7d17a 100644
--- a/drivers/clk/mediatek/clk-mt7988-apmixed.c
+++ b/drivers/clk/mediatek/clk-mt7988-apmixed.c
@@ -71,47 +71,26 @@ static const struct mtk_pll_data plls[] = {
0, 0x0318, 0, 0x0314),
};
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+};
+
static const struct of_device_id of_match_clk_mt7988_apmixed[] = {
- { .compatible = "mediatek,mt7988-apmixedsys" },
+ { .compatible = "mediatek,mt7988-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt7988_apmixed);
-static int clk_mt7988_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- int r;
-
- clk_data = mtk_alloc_clk_data(ARRAY_SIZE(plls));
- if (!clk_data)
- return -ENOMEM;
-
- r = mtk_clk_register_plls(&pdev->dev, plls, ARRAY_SIZE(plls), clk_data);
- if (r)
- goto free_apmixed_data;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- goto unregister_plls;
-
- return r;
-
-unregister_plls:
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
-free_apmixed_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
static struct platform_driver clk_mt7988_apmixed_drv = {
- .probe = clk_mt7988_apmixed_probe,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt7988-apmixed",
.of_match_table = of_match_clk_mt7988_apmixed,
},
};
-builtin_platform_driver(clk_mt7988_apmixed_drv);
+module_platform_driver(clk_mt7988_apmixed_drv);
MODULE_DESCRIPTION("MediaTek MT7988 apmixedsys clocks driver");
MODULE_LICENSE("GPL");
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 23/32] clk: mediatek: mt8135-apmixedsys: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (21 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 22/32] clk: mediatek: mt7988-apmixed: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 24/32] clk: mediatek: mt8167-apmixedsys: " Akari Tsuyukusa
` (9 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8135 apmixedsys driver can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8135-apmixedsys.c | 50 +++-----------------
1 file changed, 7 insertions(+), 43 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8135-apmixedsys.c b/drivers/clk/mediatek/clk-mt8135-apmixedsys.c
index e3b7dc13b458..fe868417de48 100644
--- a/drivers/clk/mediatek/clk-mt8135-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8135-apmixedsys.c
@@ -47,56 +47,20 @@ static const struct mtk_pll_data plls[] = {
PLL(CLK_APMIXED_VDECPLL, "vdecpll", 0x304, 0x31c, 0x80000000, 0, 21, 0x2b0, 6, 0x0, 0x308, 0),
};
-static int clk_mt8135_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- int ret;
-
- clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- ret = mtk_clk_register_plls(&pdev->dev, plls, ARRAY_SIZE(plls),
- clk_data);
- if (ret)
- goto free_clk_data;
-
- ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (ret)
- goto unregister_plls;
-
- platform_set_drvdata(pdev, clk_data);
-
- return 0;
-
-unregister_plls:
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
-free_clk_data:
- mtk_free_clk_data(clk_data);
-
- return ret;
-}
-
-static void clk_mt8135_apmixed_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
- mtk_free_clk_data(clk_data);
-}
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+};
static const struct of_device_id of_match_clk_mt8135_apmixed[] = {
- { .compatible = "mediatek,mt8135-apmixedsys" },
+ { .compatible = "mediatek,mt8135-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8135_apmixed);
static struct platform_driver clk_mt8135_apmixed_drv = {
- .probe = clk_mt8135_apmixed_probe,
- .remove = clk_mt8135_apmixed_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8135-apmixed",
.of_match_table = of_match_clk_mt8135_apmixed,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 24/32] clk: mediatek: mt8167-apmixedsys: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (22 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 23/32] clk: mediatek: mt8135-apmixedsys: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 25/32] clk: mediatek: mt8173-infracfg: " Akari Tsuyukusa
` (8 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8167 apmixedsys driver can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Also, add a remove callback to properly support module unloading.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8167-apmixedsys.c | 50 ++++----------------
1 file changed, 10 insertions(+), 40 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8167-apmixedsys.c b/drivers/clk/mediatek/clk-mt8167-apmixedsys.c
index fb6c21bbeef8..2b1d1de74cdb 100644
--- a/drivers/clk/mediatek/clk-mt8167-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8167-apmixedsys.c
@@ -89,44 +89,13 @@ static const struct mtk_clk_divider adj_divs[] = {
0x1c4, 24, 3, CLK_DIVIDER_POWER_OF_TWO),
};
-static int clk_mt8167_apmixed_probe(struct platform_device *pdev)
-{
- void __iomem *base;
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- struct device *dev = &pdev->dev;
- int ret;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_devm_alloc_clk_data(dev, MT8167_CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- ret = mtk_clk_register_plls(dev, plls, ARRAY_SIZE(plls), clk_data);
- if (ret)
- return ret;
-
- ret = mtk_clk_register_dividers(dev, adj_divs, ARRAY_SIZE(adj_divs), base,
- &mt8167_apmixed_clk_lock, clk_data);
- if (ret)
- goto unregister_plls;
-
- ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (ret)
- goto unregister_dividers;
-
- return 0;
-
-unregister_dividers:
- mtk_clk_unregister_dividers(adj_divs, ARRAY_SIZE(adj_divs), clk_data);
-unregister_plls:
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
-
- return ret;
-}
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+ .divider_clks = adj_divs,
+ .num_divider_clks = ARRAY_SIZE(adj_divs),
+ .clk_lock = &mt8167_apmixed_clk_lock,
+};
static const struct of_device_id of_match_clk_mt8167_apmixed[] = {
{ .compatible = "mediatek,mt8167-apmixedsys" },
@@ -135,13 +104,14 @@ static const struct of_device_id of_match_clk_mt8167_apmixed[] = {
MODULE_DEVICE_TABLE(of, of_match_clk_mt8167_apmixed);
static struct platform_driver clk_mt8167_apmixed_drv = {
- .probe = clk_mt8167_apmixed_probe,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8167-apmixed",
.of_match_table = of_match_clk_mt8167_apmixed,
},
};
-builtin_platform_driver(clk_mt8167_apmixed_drv)
+module_platform_driver(clk_mt8167_apmixed_drv)
MODULE_DESCRIPTION("MediaTek MT8167 apmixedsys clocks driver");
MODULE_LICENSE("GPL");
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 25/32] clk: mediatek: mt8173-infracfg: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (23 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 24/32] clk: mediatek: mt8167-apmixedsys: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 26/32] clk: mediatek: mt8183: " Akari Tsuyukusa
` (7 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8173 infracfg driver can use the MediaTek clock framework common
initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Drop the CLK_OF_DECLARE_DRIVER early init for infracfg; the kernel's
deferred probe mechanism ensures dependent drivers like cpufreq are
initialized correctly.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8173-infracfg.c | 100 ++++-----------------
1 file changed, 16 insertions(+), 84 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8173-infracfg.c b/drivers/clk/mediatek/clk-mt8173-infracfg.c
index 9b8c35897789..fdd994736e83 100644
--- a/drivers/clk/mediatek/clk-mt8173-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt8173-infracfg.c
@@ -17,22 +17,20 @@
GATE_MTK(_id, _name, _parent, &infra_cg_regs, \
_shift, &mtk_clk_gate_ops_setclr)
-static struct clk_hw_onecell_data *infra_clk_data;
-
static const struct mtk_gate_regs infra_cg_regs = {
.set_ofs = 0x0040,
.clr_ofs = 0x0044,
.sta_ofs = 0x0048,
};
-static const char * const ca53_parents[] __initconst = {
+static const char * const ca53_parents[] = {
"clk26m",
"armca7pll",
"mainpll",
"univpll"
};
-static const char * const ca72_parents[] __initconst = {
+static const char * const ca72_parents[] = {
"clk26m",
"armca15pll",
"mainpll",
@@ -44,7 +42,7 @@ static const struct mtk_composite cpu_muxes[] = {
MUX(CLK_INFRA_CA72SEL, "infra_ca72_sel", ca72_parents, 0x0000, 2, 2),
};
-static const struct mtk_fixed_factor infra_early_divs[] = {
+static const struct mtk_fixed_factor infra_divs[] = {
FACTOR(CLK_INFRA_CLK_13M, "clk13m", "clk26m", 1, 2),
};
@@ -70,95 +68,29 @@ static const struct mtk_clk_rst_desc clk_rst_desc = {
.rst_bank_nr = ARRAY_SIZE(infrasys_rst_ofs),
};
+static const struct mtk_clk_desc infracfg_desc = {
+ .clks = infra_gates,
+ .num_clks = ARRAY_SIZE(infra_gates),
+ .factor_clks = infra_divs,
+ .num_factor_clks = ARRAY_SIZE(infra_divs),
+ .cpumuxes = cpu_muxes,
+ .num_cpumuxes = ARRAY_SIZE(cpu_muxes),
+ .rst_desc = &clk_rst_desc,
+};
+
static const struct of_device_id of_match_clk_mt8173_infracfg[] = {
- { .compatible = "mediatek,mt8173-infracfg" },
+ { .compatible = "mediatek,mt8173-infracfg", .data = &infracfg_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8173_infracfg);
-static void clk_mt8173_infra_init_early(struct device_node *node)
-{
- int i;
-
- infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
- if (!infra_clk_data)
- return;
-
- for (i = 0; i < CLK_INFRA_NR_CLK; i++)
- infra_clk_data->hws[i] = ERR_PTR(-EPROBE_DEFER);
-
- mtk_clk_register_factors(infra_early_divs,
- ARRAY_SIZE(infra_early_divs), infra_clk_data);
-
- of_clk_add_hw_provider(node, of_clk_hw_onecell_get, infra_clk_data);
-}
-CLK_OF_DECLARE_DRIVER(mtk_infrasys, "mediatek,mt8173-infracfg",
- clk_mt8173_infra_init_early);
-
-static int clk_mt8173_infracfg_probe(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- int r, i;
-
- if (!infra_clk_data) {
- infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
- if (!infra_clk_data)
- return -ENOMEM;
- } else {
- for (i = 0; i < CLK_INFRA_NR_CLK; i++)
- if (infra_clk_data->hws[i] == ERR_PTR(-EPROBE_DEFER))
- infra_clk_data->hws[i] = ERR_PTR(-ENOENT);
- }
-
- r = mtk_clk_register_gates(&pdev->dev, node, infra_gates,
- ARRAY_SIZE(infra_gates), infra_clk_data);
- if (r)
- return r;
-
- r = mtk_clk_register_cpumuxes(&pdev->dev, node, cpu_muxes,
- ARRAY_SIZE(cpu_muxes), infra_clk_data);
- if (r)
- goto unregister_gates;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, infra_clk_data);
- if (r)
- goto unregister_cpumuxes;
-
- r = mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
- if (r)
- goto unregister_clk_hw;
-
- platform_set_drvdata(pdev, infra_clk_data);
-
- return 0;
-
-unregister_clk_hw:
- of_clk_del_provider(node);
-unregister_cpumuxes:
- mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), infra_clk_data);
-unregister_gates:
- mtk_clk_unregister_gates(infra_gates, ARRAY_SIZE(infra_gates), infra_clk_data);
- return r;
-}
-
-static void clk_mt8173_infracfg_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
- mtk_clk_unregister_gates(infra_gates, ARRAY_SIZE(infra_gates), clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt8173_infracfg_drv = {
.driver = {
.name = "clk-mt8173-infracfg",
.of_match_table = of_match_clk_mt8173_infracfg,
},
- .probe = clk_mt8173_infracfg_probe,
- .remove = clk_mt8173_infracfg_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
};
module_platform_driver(clk_mt8173_infracfg_drv);
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 26/32] clk: mediatek: mt8183: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (24 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 25/32] clk: mediatek: mt8173-infracfg: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 27/32] clk: mediatek: mt8186-apmixedsys: " Akari Tsuyukusa
` (6 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8183 clock drivers can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
For the apmixedsys driver, add a remove callback to properly support
module unloading.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8183-apmixedsys.c | 51 ++++----------------
drivers/clk/mediatek/clk-mt8183-audio.c | 26 ++--------
2 files changed, 13 insertions(+), 64 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8183-apmixedsys.c b/drivers/clk/mediatek/clk-mt8183-apmixedsys.c
index 6242d4f5376e..deb96537a3ab 100644
--- a/drivers/clk/mediatek/clk-mt8183-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8183-apmixedsys.c
@@ -139,59 +139,28 @@ static const struct mtk_pll_data plls[] = {
0, 0, 32, 8, 0x02B4, 1, 0x02BC, 0x0014, 1, 0x02B8, 0, 0x02B4),
};
-static int clk_mt8183_apmixed_probe(struct platform_device *pdev)
-{
- void __iomem *base;
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- struct device *dev = &pdev->dev;
- int ret;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_devm_alloc_clk_data(dev, CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- ret = mtk_clk_register_plls(dev, plls, ARRAY_SIZE(plls), clk_data);
- if (ret)
- return ret;
-
- ret = mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
- ARRAY_SIZE(apmixed_clks), clk_data);
- if (ret)
- goto unregister_plls;
-
- ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (ret)
- goto unregister_gates;
-
- return 0;
-
-unregister_gates:
- mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
-unregister_plls:
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
-
- return ret;
-}
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+ .clks = apmixed_clks,
+ .num_clks = ARRAY_SIZE(apmixed_clks),
+};
static const struct of_device_id of_match_clk_mt8183_apmixed[] = {
- { .compatible = "mediatek,mt8183-apmixedsys" },
+ { .compatible = "mediatek,mt8183-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_apmixed);
static struct platform_driver clk_mt8183_apmixed_drv = {
- .probe = clk_mt8183_apmixed_probe,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8183-apmixed",
.of_match_table = of_match_clk_mt8183_apmixed,
},
};
-builtin_platform_driver(clk_mt8183_apmixed_drv)
+module_platform_driver(clk_mt8183_apmixed_drv)
MODULE_DESCRIPTION("MediaTek MT8183 apmixedsys clocks driver");
MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt8183-audio.c b/drivers/clk/mediatek/clk-mt8183-audio.c
index 011d329ad30e..0a53b0408dcc 100644
--- a/drivers/clk/mediatek/clk-mt8183-audio.c
+++ b/drivers/clk/mediatek/clk-mt8183-audio.c
@@ -70,29 +70,9 @@ static const struct mtk_gate audio_clks[] = {
static const struct mtk_clk_desc audio_desc = {
.clks = audio_clks,
.num_clks = ARRAY_SIZE(audio_clks),
+ .populate_children = true,
};
-static int clk_mt8183_audio_probe(struct platform_device *pdev)
-{
- int r;
-
- r = mtk_clk_simple_probe(pdev);
- if (r)
- return r;
-
- r = devm_of_platform_populate(&pdev->dev);
- if (r)
- mtk_clk_simple_remove(pdev);
-
- return r;
-}
-
-static void clk_mt8183_audio_remove(struct platform_device *pdev)
-{
- of_platform_depopulate(&pdev->dev);
- mtk_clk_simple_remove(pdev);
-}
-
static const struct of_device_id of_match_clk_mt8183_audio[] = {
{ .compatible = "mediatek,mt8183-audiosys", .data = &audio_desc },
{ /* sentinel */ }
@@ -100,8 +80,8 @@ static const struct of_device_id of_match_clk_mt8183_audio[] = {
MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_audio);
static struct platform_driver clk_mt8183_audio_drv = {
- .probe = clk_mt8183_audio_probe,
- .remove = clk_mt8183_audio_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8183-audio",
.of_match_table = of_match_clk_mt8183_audio,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 27/32] clk: mediatek: mt8186-apmixedsys: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (25 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 26/32] clk: mediatek: mt8183: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 28/32] clk: mediatek: mt8188-apmixedsys: " Akari Tsuyukusa
` (5 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8186 apmixedsys driver can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8186-apmixedsys.c | 59 ++++----------------
1 file changed, 11 insertions(+), 48 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8186-apmixedsys.c b/drivers/clk/mediatek/clk-mt8186-apmixedsys.c
index d35dd2632e43..b674b1e581a5 100644
--- a/drivers/clk/mediatek/clk-mt8186-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8186-apmixedsys.c
@@ -132,60 +132,23 @@ static struct mtk_pllfh_data pllfhs[] = {
FH(CLK_APMIXED_MSDCPLL, FH_MSDCPLL, 0x0118),
};
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+ .fhctl_node = "mediatek,mt8186-fhctl",
+ .pllfhs = pllfhs,
+ .num_pllfhs = ARRAY_SIZE(pllfhs),
+};
+
static const struct of_device_id of_match_clk_mt8186_apmixed[] = {
- { .compatible = "mediatek,mt8186-apmixedsys", },
+ { .compatible = "mediatek,mt8186-apmixedsys", .data = &apmixed_desc },
{}
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_apmixed);
-static int clk_mt8186_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- const u8 *fhctl_node = "mediatek,mt8186-fhctl";
- int r;
-
- clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- fhctl_parse_dt(fhctl_node, pllfhs, ARRAY_SIZE(pllfhs));
-
- r = mtk_clk_register_pllfhs(&pdev->dev, plls, ARRAY_SIZE(plls),
- pllfhs, ARRAY_SIZE(pllfhs), clk_data);
- if (r)
- goto free_apmixed_data;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- goto unregister_plls;
-
- platform_set_drvdata(pdev, clk_data);
-
- return r;
-
-unregister_plls:
- mtk_clk_unregister_pllfhs(plls, ARRAY_SIZE(plls), pllfhs,
- ARRAY_SIZE(pllfhs), clk_data);
-free_apmixed_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
-static void clk_mt8186_apmixed_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_pllfhs(plls, ARRAY_SIZE(plls), pllfhs,
- ARRAY_SIZE(pllfhs), clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt8186_apmixed_drv = {
- .probe = clk_mt8186_apmixed_probe,
- .remove = clk_mt8186_apmixed_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8186-apmixed",
.of_match_table = of_match_clk_mt8186_apmixed,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 28/32] clk: mediatek: mt8188-apmixedsys: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (26 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 27/32] clk: mediatek: mt8186-apmixedsys: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 29/32] clk: mediatek: mt8192: " Akari Tsuyukusa
` (4 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8188 apmixedsys driver can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8188-apmixedsys.c | 60 ++++----------------
1 file changed, 10 insertions(+), 50 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8188-apmixedsys.c b/drivers/clk/mediatek/clk-mt8188-apmixedsys.c
index 48a2f61d4b77..3937d93cac34 100644
--- a/drivers/clk/mediatek/clk-mt8188-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8188-apmixedsys.c
@@ -89,62 +89,22 @@ static const struct mtk_pll_data plls[] = {
0, 0, 22, 0x0344, 24, 0, 0, 0, 0x0344, 0, 0, 0, 9),
};
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+ .clks = apmixed_clks,
+ .num_clks = ARRAY_SIZE(apmixed_clks),
+};
+
static const struct of_device_id of_match_clk_mt8188_apmixed[] = {
- { .compatible = "mediatek,mt8188-apmixedsys" },
+ { .compatible = "mediatek,mt8188-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_apmixed);
-static int clk_mt8188_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- int r;
-
- clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- r = mtk_clk_register_plls(&pdev->dev, plls, ARRAY_SIZE(plls), clk_data);
- if (r)
- goto free_apmixed_data;
-
- r = mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
- ARRAY_SIZE(apmixed_clks), clk_data);
- if (r)
- goto unregister_plls;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- goto unregister_gates;
-
- platform_set_drvdata(pdev, clk_data);
-
- return 0;
-
-unregister_gates:
- mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
-unregister_plls:
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
-free_apmixed_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
-static void clk_mt8188_apmixed_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt8188_apmixed_drv = {
- .probe = clk_mt8188_apmixed_probe,
- .remove = clk_mt8188_apmixed_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8188-apmixed",
.of_match_table = of_match_clk_mt8188_apmixed,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 29/32] clk: mediatek: mt8192: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (27 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 28/32] clk: mediatek: mt8188-apmixedsys: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 30/32] clk: mediatek: mt8195: " Akari Tsuyukusa
` (3 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8192 clock drivers can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8192-apmixedsys.c | 69 ++++----------------
drivers/clk/mediatek/clk-mt8192-aud.c | 26 +-------
2 files changed, 16 insertions(+), 79 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8192-apmixedsys.c b/drivers/clk/mediatek/clk-mt8192-apmixedsys.c
index e6ac40e2f12d..92593370f23b 100644
--- a/drivers/clk/mediatek/clk-mt8192-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8192-apmixedsys.c
@@ -143,72 +143,29 @@ static struct mtk_pllfh_data pllfhs[] = {
FH(CLK_APMIXED_TVDPLL, FH_TVDPLL, 0x154),
};
+static const struct mtk_clk_desc apmixed_desc = {
+ .clks = apmixed_clks,
+ .num_clks = ARRAY_SIZE(apmixed_clks),
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+ .fhctl_node = "mediatek,mt8192-fhctl",
+ .pllfhs = pllfhs,
+ .num_pllfhs = ARRAY_SIZE(pllfhs),
+};
+
static const struct of_device_id of_match_clk_mt8192_apmixed[] = {
- { .compatible = "mediatek,mt8192-apmixedsys" },
+ { .compatible = "mediatek,mt8192-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_apmixed);
-static int clk_mt8192_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- const u8 *fhctl_node = "mediatek,mt8192-fhctl";
- int r;
-
- clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- fhctl_parse_dt(fhctl_node, pllfhs, ARRAY_SIZE(pllfhs));
-
- r = mtk_clk_register_pllfhs(&pdev->dev, plls, ARRAY_SIZE(plls),
- pllfhs, ARRAY_SIZE(pllfhs), clk_data);
- if (r)
- goto free_clk_data;
-
- r = mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
- ARRAY_SIZE(apmixed_clks), clk_data);
- if (r)
- goto unregister_plls;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- goto unregister_gates;
-
- platform_set_drvdata(pdev, clk_data);
-
- return r;
-
-unregister_gates:
- mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
-unregister_plls:
- mtk_clk_unregister_pllfhs(plls, ARRAY_SIZE(plls), pllfhs,
- ARRAY_SIZE(pllfhs), clk_data);
-free_clk_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
-static void clk_mt8192_apmixed_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
- mtk_clk_unregister_pllfhs(plls, ARRAY_SIZE(plls), pllfhs,
- ARRAY_SIZE(pllfhs), clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt8192_apmixed_drv = {
.driver = {
.name = "clk-mt8192-apmixed",
.of_match_table = of_match_clk_mt8192_apmixed,
},
- .probe = clk_mt8192_apmixed_probe,
- .remove = clk_mt8192_apmixed_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
};
module_platform_driver(clk_mt8192_apmixed_drv);
MODULE_DESCRIPTION("MediaTek MT8192 apmixed clocks driver");
diff --git a/drivers/clk/mediatek/clk-mt8192-aud.c b/drivers/clk/mediatek/clk-mt8192-aud.c
index f3ebf8713fbb..8625f656a2e4 100644
--- a/drivers/clk/mediatek/clk-mt8192-aud.c
+++ b/drivers/clk/mediatek/clk-mt8192-aud.c
@@ -80,29 +80,9 @@ static const struct mtk_gate aud_clks[] = {
static const struct mtk_clk_desc aud_desc = {
.clks = aud_clks,
.num_clks = ARRAY_SIZE(aud_clks),
+ .populate_children = true,
};
-static int clk_mt8192_aud_probe(struct platform_device *pdev)
-{
- int r;
-
- r = mtk_clk_simple_probe(pdev);
- if (r)
- return r;
-
- r = devm_of_platform_populate(&pdev->dev);
- if (r)
- mtk_clk_simple_remove(pdev);
-
- return r;
-}
-
-static void clk_mt8192_aud_remove(struct platform_device *pdev)
-{
- of_platform_depopulate(&pdev->dev);
- mtk_clk_simple_remove(pdev);
-}
-
static const struct of_device_id of_match_clk_mt8192_aud[] = {
{ .compatible = "mediatek,mt8192-audsys", .data = &aud_desc },
{ /* sentinel */ }
@@ -110,8 +90,8 @@ static const struct of_device_id of_match_clk_mt8192_aud[] = {
MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_aud);
static struct platform_driver clk_mt8192_aud_drv = {
- .probe = clk_mt8192_aud_probe,
- .remove = clk_mt8192_aud_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8192-aud",
.of_match_table = of_match_clk_mt8192_aud,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 30/32] clk: mediatek: mt8195: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (28 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 29/32] clk: mediatek: mt8192: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 31/32] clk: mediatek: mt8196: " Akari Tsuyukusa
` (2 subsequent siblings)
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8195 apusys_pll and apmixedsys drivers can use the MediaTek clock
framework common initialization sequence. Reduce boilerplate code by
creating struct mtk_clk_desc and using the mtk_clk_simple_probe/remove
helpers.
Note that the topckgen driver is excluded from this conversion because
it requires devm_mtk_clk_mux_notifier_register(), which is not
currently supported by the common simple probe helper.
Since all MT8195 clock drivers can now be built as modules,
change Kconfig setting to "tristate".
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/Kconfig | 12 ++--
drivers/clk/mediatek/clk-mt8195-apmixedsys.c | 67 ++++----------------
drivers/clk/mediatek/clk-mt8195-apusys_pll.c | 49 ++------------
3 files changed, 25 insertions(+), 103 deletions(-)
diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig
index 6449b77d56ed..ac992cfc6c3e 100644
--- a/drivers/clk/mediatek/Kconfig
+++ b/drivers/clk/mediatek/Kconfig
@@ -909,13 +909,13 @@ config COMMON_CLK_MT8192_VENCSYS
This driver supports MediaTek MT8192 vencsys clocks.
config COMMON_CLK_MT8195
- bool "Clock driver for MediaTek MT8195"
- depends on ARM64 || COMPILE_TEST
- select COMMON_CLK_MEDIATEK
+ tristate "Clock driver for MediaTek MT8195"
+ depends on ARM64 || COMPILE_TEST
+ select COMMON_CLK_MEDIATEK
select COMMON_CLK_MEDIATEK_FHCTL
- default ARCH_MEDIATEK
- help
- This driver supports MediaTek MT8195 clocks.
+ default ARCH_MEDIATEK
+ help
+ This driver supports MediaTek MT8195 clocks.
config COMMON_CLK_MT8195_APUSYS
tristate "Clock driver for MediaTek MT8195 apusys"
diff --git a/drivers/clk/mediatek/clk-mt8195-apmixedsys.c b/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
index a120c3305547..fc60cd4d9382 100644
--- a/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
@@ -161,68 +161,25 @@ static struct mtk_pllfh_data pllfhs[] = {
FH(CLK_APMIXED_TVDPLL2, FH_TVDPLL1, 0x154),
};
+static const struct mtk_clk_desc apmixed_desc = {
+ .clks = apmixed_clks,
+ .num_clks = ARRAY_SIZE(apmixed_clks),
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+ .fhctl_node = "mediatek,mt8195-fhctl",
+ .pllfhs = pllfhs,
+ .num_pllfhs = ARRAY_SIZE(pllfhs),
+};
+
static const struct of_device_id of_match_clk_mt8195_apmixed[] = {
{ .compatible = "mediatek,mt8195-apmixedsys", },
{}
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_apmixed);
-static int clk_mt8195_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- const u8 *fhctl_node = "mediatek,mt8195-fhctl";
- int r;
-
- clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- fhctl_parse_dt(fhctl_node, pllfhs, ARRAY_SIZE(pllfhs));
-
- r = mtk_clk_register_pllfhs(&pdev->dev, plls, ARRAY_SIZE(plls),
- pllfhs, ARRAY_SIZE(pllfhs), clk_data);
- if (r)
- goto free_apmixed_data;
-
- r = mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
- ARRAY_SIZE(apmixed_clks), clk_data);
- if (r)
- goto unregister_plls;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- goto unregister_gates;
-
- platform_set_drvdata(pdev, clk_data);
-
- return r;
-
-unregister_gates:
- mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
-unregister_plls:
- mtk_clk_unregister_pllfhs(plls, ARRAY_SIZE(plls), pllfhs,
- ARRAY_SIZE(pllfhs), clk_data);
-free_apmixed_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
-static void clk_mt8195_apmixed_remove(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
-
- of_clk_del_provider(node);
- mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
- mtk_clk_unregister_pllfhs(plls, ARRAY_SIZE(plls), pllfhs,
- ARRAY_SIZE(pllfhs), clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt8195_apmixed_drv = {
- .probe = clk_mt8195_apmixed_probe,
- .remove = clk_mt8195_apmixed_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8195-apmixed",
.of_match_table = of_match_clk_mt8195_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt8195-apusys_pll.c b/drivers/clk/mediatek/clk-mt8195-apusys_pll.c
index a2d98ed58e34..36d358141ecb 100644
--- a/drivers/clk/mediatek/clk-mt8195-apusys_pll.c
+++ b/drivers/clk/mediatek/clk-mt8195-apusys_pll.c
@@ -56,55 +56,20 @@ static const struct mtk_pll_data apusys_plls[] = {
PLL(CLK_APUSYS_PLL_APUPLL2, "apusys_pll_apupll2", 0x038, 0x044, 0x03c, 0x03c),
};
-static int clk_mt8195_apusys_pll_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- int r;
-
- clk_data = mtk_alloc_clk_data(CLK_APUSYS_PLL_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- r = mtk_clk_register_plls(&pdev->dev, apusys_plls,
- ARRAY_SIZE(apusys_plls), clk_data);
- if (r)
- goto free_apusys_pll_data;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- goto unregister_plls;
-
- platform_set_drvdata(pdev, clk_data);
-
- return r;
-
-unregister_plls:
- mtk_clk_unregister_plls(apusys_plls, ARRAY_SIZE(apusys_plls), clk_data);
-free_apusys_pll_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
-static void clk_mt8195_apusys_pll_remove(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
- struct device_node *node = pdev->dev.of_node;
-
- of_clk_del_provider(node);
- mtk_clk_unregister_plls(apusys_plls, ARRAY_SIZE(apusys_plls), clk_data);
- mtk_free_clk_data(clk_data);
-}
+static const struct mtk_clk_desc apu_pll_desc = {
+ .plls = apusys_plls,
+ .num_plls = ARRAY_SIZE(apusys_plls),
+};
static const struct of_device_id of_match_clk_mt8195_apusys_pll[] = {
- { .compatible = "mediatek,mt8195-apusys_pll", },
+ { .compatible = "mediatek,mt8195-apusys_pll", .data = &apu_pll_desc },
{}
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_apusys_pll);
static struct platform_driver clk_mt8195_apusys_pll_drv = {
- .probe = clk_mt8195_apusys_pll_probe,
- .remove = clk_mt8195_apusys_pll_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8195-apusys_pll",
.of_match_table = of_match_clk_mt8195_apusys_pll,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 31/32] clk: mediatek: mt8196: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (29 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 30/32] clk: mediatek: mt8195: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 32/32] clk: mediatek: mt8516-apmixedsys: " Akari Tsuyukusa
2026-08-03 19:50 ` [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Jakub Kicinski
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8196 apmixedsys, mcusys and mfg clock drivers can use the
MediaTek clock framework common initialization sequence.
Reduce boilerplate code by creating struct mtk_clk_desc and using the
mtk_clk_simple_probe/remove helpers.
Note that the vlpckgen driver is excluded from this conversion because
its probe callback needs to initialize the APLL tuner registers, which
is not currently supported by the common simple probe helper.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8196-apmixedsys.c | 67 ++------------
drivers/clk/mediatek/clk-mt8196-mcu.c | 96 +++++++-------------
drivers/clk/mediatek/clk-mt8196-mfg.c | 84 +++++------------
3 files changed, 63 insertions(+), 184 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8196-apmixedsys.c b/drivers/clk/mediatek/clk-mt8196-apmixedsys.c
index c4ebb0170b82..a20fa02070a8 100644
--- a/drivers/clk/mediatek/clk-mt8196-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8196-apmixedsys.c
@@ -86,11 +86,6 @@
.ops = &mtk_pll_fenc_clr_set_ops, \
}
-struct mtk_pll_desc {
- const struct mtk_pll_data *clks;
- size_t num_clks;
-};
-
static const struct mtk_pll_data apmixed_plls[] = {
PLL_FENC(CLK_APMIXED_MAINPLL, "mainpll", MAINPLL_CON0, FENC_STATUS_CON0,
7, PLL_AO, MAINPLL_CON1, 24, MAINPLL_CON1, 0, 22, 0),
@@ -110,9 +105,9 @@ static const struct mtk_pll_data apmixed_plls[] = {
0, 0, SGMIIPLL_CON1, 24, SGMIIPLL_CON1, 0, 22, 7),
};
-static const struct mtk_pll_desc apmixed_desc = {
- .clks = apmixed_plls,
- .num_clks = ARRAY_SIZE(apmixed_plls),
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = apmixed_plls,
+ .num_plls = ARRAY_SIZE(apmixed_plls),
};
static const struct mtk_pll_data apmixed2_plls[] = {
@@ -132,57 +127,11 @@ static const struct mtk_pll_data apmixed2_plls[] = {
0, 0, TVDPLL3_CON1, 24, TVDPLL3_CON1, 0, 22, 6),
};
-static const struct mtk_pll_desc apmixed2_desc = {
- .clks = apmixed2_plls,
- .num_clks = ARRAY_SIZE(apmixed2_plls),
+static const struct mtk_clk_desc apmixed2_desc = {
+ .plls = apmixed2_plls,
+ .num_plls = ARRAY_SIZE(apmixed2_plls),
};
-static int clk_mt8196_apmixed_probe(struct platform_device *pdev)
-{
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- const struct mtk_pll_desc *mcd;
- int r;
-
- mcd = device_get_match_data(&pdev->dev);
- if (!mcd)
- return -EINVAL;
-
- clk_data = mtk_alloc_clk_data(mcd->num_clks);
- if (!clk_data)
- return -ENOMEM;
-
- r = mtk_clk_register_plls(&pdev->dev, mcd->clks, mcd->num_clks,
- clk_data);
- if (r)
- goto free_apmixed_data;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- goto unregister_plls;
-
- platform_set_drvdata(pdev, clk_data);
-
- return r;
-
-unregister_plls:
- mtk_clk_unregister_plls(mcd->clks, mcd->num_clks, clk_data);
-free_apmixed_data:
- mtk_free_clk_data(clk_data);
- return r;
-}
-
-static void clk_mt8196_apmixed_remove(struct platform_device *pdev)
-{
- const struct mtk_pll_desc *mcd = device_get_match_data(&pdev->dev);
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
- struct device_node *node = pdev->dev.of_node;
-
- of_clk_del_provider(node);
- mtk_clk_unregister_plls(mcd->clks, mcd->num_clks, clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static const struct of_device_id of_match_clk_mt8196_apmixed[] = {
{ .compatible = "mediatek,mt8196-apmixedsys", .data = &apmixed_desc },
{ .compatible = "mediatek,mt8196-apmixedsys-gp2",
@@ -192,8 +141,8 @@ static const struct of_device_id of_match_clk_mt8196_apmixed[] = {
MODULE_DEVICE_TABLE(of, of_match_clk_mt8196_apmixed);
static struct platform_driver clk_mt8196_apmixed_drv = {
- .probe = clk_mt8196_apmixed_probe,
- .remove = clk_mt8196_apmixed_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8196-apmixed",
.of_match_table = of_match_clk_mt8196_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt8196-mcu.c b/drivers/clk/mediatek/clk-mt8196-mcu.c
index 13642fc673c2..e392408c93b2 100644
--- a/drivers/clk/mediatek/clk-mt8196-mcu.c
+++ b/drivers/clk/mediatek/clk-mt8196-mcu.c
@@ -68,29 +68,44 @@
.pcwibits = MT8196_INTEGER_BITS, \
}
-static const struct mtk_pll_data cpu_bl_plls[] = {
- PLL(CLK_CPBL_ARMPLL_BL, "armpll-bl", ARMPLL_BL_CON0, ARMPLL_BL_CON0, 0,
- 0, PLL_AO, BIT(0), ARMPLL_BL_CON1, 24, 0, 0, 0, ARMPLL_BL_CON1, 0, 22),
+static const struct mtk_clk_desc cpu_bl_plls = {
+ .plls = (const struct mtk_pll_data[]){
+ PLL(CLK_CPBL_ARMPLL_BL, "armpll-bl", ARMPLL_BL_CON0, ARMPLL_BL_CON0, 0,
+ 0, PLL_AO, BIT(0), ARMPLL_BL_CON1, 24, 0, 0, 0, ARMPLL_BL_CON1, 0, 22),
+ },
+ .num_plls = 1,
};
-static const struct mtk_pll_data cpu_b_plls[] = {
- PLL(CLK_CPB_ARMPLL_B, "armpll-b", ARMPLL_B_CON0, ARMPLL_B_CON0, 0, 0,
- PLL_AO, BIT(0), ARMPLL_B_CON1, 24, 0, 0, 0, ARMPLL_B_CON1, 0, 22),
+static const struct mtk_clk_desc cpu_b_plls = {
+ .plls = (const struct mtk_pll_data[]){
+ PLL(CLK_CPB_ARMPLL_B, "armpll-b", ARMPLL_B_CON0, ARMPLL_B_CON0, 0, 0,
+ PLL_AO, BIT(0), ARMPLL_B_CON1, 24, 0, 0, 0, ARMPLL_B_CON1, 0, 22),
+ },
+ .num_plls = 1,
};
-static const struct mtk_pll_data cpu_ll_plls[] = {
- PLL(CLK_CPLL_ARMPLL_LL, "armpll-ll", ARMPLL_LL_CON0, ARMPLL_LL_CON0, 0,
- 0, PLL_AO, BIT(0), ARMPLL_LL_CON1, 24, 0, 0, 0, ARMPLL_LL_CON1, 0, 22),
+static const struct mtk_clk_desc cpu_ll_plls = {
+ .plls = (const struct mtk_pll_data[]){
+ PLL(CLK_CPLL_ARMPLL_LL, "armpll-ll", ARMPLL_LL_CON0, ARMPLL_LL_CON0, 0,
+ 0, PLL_AO, BIT(0), ARMPLL_LL_CON1, 24, 0, 0, 0, ARMPLL_LL_CON1, 0, 22),
+ },
+ .num_plls = 1,
};
-static const struct mtk_pll_data cci_plls[] = {
- PLL(CLK_CCIPLL, "ccipll", CCIPLL_CON0, CCIPLL_CON0, 0, 0, PLL_AO,
- BIT(0), CCIPLL_CON1, 24, 0, 0, 0, CCIPLL_CON1, 0, 22),
+static const struct mtk_clk_desc cci_plls = {
+ .plls = (const struct mtk_pll_data[]){
+ PLL(CLK_CCIPLL, "ccipll", CCIPLL_CON0, CCIPLL_CON0, 0, 0, PLL_AO,
+ BIT(0), CCIPLL_CON1, 24, 0, 0, 0, CCIPLL_CON1, 0, 22),
+ },
+ .num_plls = 1,
};
-static const struct mtk_pll_data ptp_plls[] = {
- PLL(CLK_PTPPLL, "ptppll", PTPPLL_CON0, PTPPLL_CON0, 0, 0, PLL_AO,
- BIT(0), PTPPLL_CON1, 24, 0, 0, 0, PTPPLL_CON1, 0, 22),
+static const struct mtk_clk_desc ptp_plls = {
+ .plls = (const struct mtk_pll_data[]){
+ PLL(CLK_PTPPLL, "ptppll", PTPPLL_CON0, PTPPLL_CON0, 0, 0, PLL_AO,
+ BIT(0), PTPPLL_CON1, 24, 0, 0, 0, PTPPLL_CON1, 0, 22),
+ },
+ .num_plls = 1,
};
static const struct of_device_id of_match_clk_mt8196_mcu[] = {
@@ -106,56 +121,9 @@ static const struct of_device_id of_match_clk_mt8196_mcu[] = {
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8196_mcu);
-static int clk_mt8196_mcu_probe(struct platform_device *pdev)
-{
- const struct mtk_pll_data *plls;
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- const int num_plls = 1;
- int r;
-
- plls = of_device_get_match_data(&pdev->dev);
- if (!plls)
- return -EINVAL;
-
- clk_data = mtk_alloc_clk_data(num_plls);
- if (!clk_data)
- return -ENOMEM;
-
- r = mtk_clk_register_plls(&pdev->dev, plls, num_plls, clk_data);
- if (r)
- goto free_clk_data;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- goto unregister_plls;
-
- platform_set_drvdata(pdev, clk_data);
-
- return r;
-
-unregister_plls:
- mtk_clk_unregister_plls(plls, num_plls, clk_data);
-free_clk_data:
- mtk_free_clk_data(clk_data);
-
- return r;
-}
-
-static void clk_mt8196_mcu_remove(struct platform_device *pdev)
-{
- const struct mtk_pll_data *plls = of_device_get_match_data(&pdev->dev);
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
- struct device_node *node = pdev->dev.of_node;
-
- of_clk_del_provider(node);
- mtk_clk_unregister_plls(plls, 1, clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt8196_mcu_drv = {
- .probe = clk_mt8196_mcu_probe,
- .remove = clk_mt8196_mcu_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8196-mcu",
.of_match_table = of_match_clk_mt8196_mcu,
diff --git a/drivers/clk/mediatek/clk-mt8196-mfg.c b/drivers/clk/mediatek/clk-mt8196-mfg.c
index a317183f1681..a209162f6207 100644
--- a/drivers/clk/mediatek/clk-mt8196-mfg.c
+++ b/drivers/clk/mediatek/clk-mt8196-mfg.c
@@ -61,22 +61,31 @@
.parent_name = "mfg_eb", \
}
-static const struct mtk_pll_data mfg_ao_plls[] = {
- PLL(CLK_MFG_AO_MFGPLL, "mfgpll", MFGPLL_CON0, MFGPLL_CON0, 0, 0,
- PLL_PARENT_EN, BIT(0), MFGPLL_CON1, 24, 0, 0, 0,
- MFGPLL_CON1, 0, 22),
+static const struct mtk_clk_desc mfg_ao_plls = {
+ .plls = (const struct mtk_pll_data[]){
+ PLL(CLK_MFG_AO_MFGPLL, "mfgpll", MFGPLL_CON0,
+ MFGPLL_CON0, 0, 0, PLL_PARENT_EN, BIT(0),
+ MFGPLL_CON1, 24, 0, 0, 0, MFGPLL_CON1, 0, 22),
+ },
+ .num_plls = 1,
};
-static const struct mtk_pll_data mfgsc0_ao_plls[] = {
- PLL(CLK_MFGSC0_AO_MFGPLL_SC0, "mfgpll-sc0", MFGPLL_SC0_CON0,
- MFGPLL_SC0_CON0, 0, 0, PLL_PARENT_EN, BIT(0), MFGPLL_SC0_CON1, 24,
- 0, 0, 0, MFGPLL_SC0_CON1, 0, 22),
+static const struct mtk_clk_desc mfgsc0_ao_plls = {
+ .plls = (const struct mtk_pll_data[]){
+ PLL(CLK_MFGSC0_AO_MFGPLL_SC0, "mfgpll-sc0", MFGPLL_SC0_CON0,
+ MFGPLL_SC0_CON0, 0, 0, PLL_PARENT_EN, BIT(0),
+ MFGPLL_SC0_CON1, 24, 0, 0, 0, MFGPLL_SC0_CON1, 0, 22),
+ },
+ .num_plls = 1,
};
-static const struct mtk_pll_data mfgsc1_ao_plls[] = {
- PLL(CLK_MFGSC1_AO_MFGPLL_SC1, "mfgpll-sc1", MFGPLL_SC1_CON0,
- MFGPLL_SC1_CON0, 0, 0, PLL_PARENT_EN, BIT(0), MFGPLL_SC1_CON1, 24,
- 0, 0, 0, MFGPLL_SC1_CON1, 0, 22),
+static const struct mtk_clk_desc mfgsc1_ao_plls = {
+ .plls = (const struct mtk_pll_data[]){
+ PLL(CLK_MFGSC1_AO_MFGPLL_SC1, "mfgpll-sc1", MFGPLL_SC1_CON0,
+ MFGPLL_SC1_CON0, 0, 0, PLL_PARENT_EN, BIT(0),
+ MFGPLL_SC1_CON1, 24, 0, 0, 0, MFGPLL_SC1_CON1, 0, 22),
+ },
+ .num_plls = 1,
};
static const struct of_device_id of_match_clk_mt8196_mfg[] = {
@@ -90,56 +99,9 @@ static const struct of_device_id of_match_clk_mt8196_mfg[] = {
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8196_mfg);
-static int clk_mt8196_mfg_probe(struct platform_device *pdev)
-{
- const struct mtk_pll_data *plls;
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- const int num_plls = 1;
- int r;
-
- plls = of_device_get_match_data(&pdev->dev);
- if (!plls)
- return -EINVAL;
-
- clk_data = mtk_alloc_clk_data(num_plls);
- if (!clk_data)
- return -ENOMEM;
-
- r = mtk_clk_register_plls(&pdev->dev, plls, num_plls, clk_data);
- if (r)
- goto free_clk_data;
-
- r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (r)
- goto unregister_plls;
-
- platform_set_drvdata(pdev, clk_data);
-
- return r;
-
-unregister_plls:
- mtk_clk_unregister_plls(plls, num_plls, clk_data);
-free_clk_data:
- mtk_free_clk_data(clk_data);
-
- return r;
-}
-
-static void clk_mt8196_mfg_remove(struct platform_device *pdev)
-{
- const struct mtk_pll_data *plls = of_device_get_match_data(&pdev->dev);
- struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
- struct device_node *node = pdev->dev.of_node;
-
- of_clk_del_provider(node);
- mtk_clk_unregister_plls(plls, 1, clk_data);
- mtk_free_clk_data(clk_data);
-}
-
static struct platform_driver clk_mt8196_mfg_drv = {
- .probe = clk_mt8196_mfg_probe,
- .remove = clk_mt8196_mfg_remove,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8196-mfg",
.of_match_table = of_match_clk_mt8196_mfg,
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH 32/32] clk: mediatek: mt8516-apmixedsys: Switch to common probe/remove helpers
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (30 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 31/32] clk: mediatek: mt8196: " Akari Tsuyukusa
@ 2026-08-03 14:16 ` Akari Tsuyukusa
2026-08-03 19:50 ` [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Jakub Kicinski
32 siblings, 0 replies; 38+ messages in thread
From: Akari Tsuyukusa @ 2026-08-03 14:16 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran
Cc: Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Akari Tsuyukusa, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
The MT8516 apmixedsys driver can use the MediaTek clock framework
common initialization sequence. Reduce boilerplate code by creating
struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
Also, add a remove callback to properly support module unloading.
Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
---
drivers/clk/mediatek/clk-mt8516-apmixedsys.c | 42 ++++----------------
1 file changed, 8 insertions(+), 34 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8516-apmixedsys.c b/drivers/clk/mediatek/clk-mt8516-apmixedsys.c
index 2a6206cae2f0..2fb09e7acde7 100644
--- a/drivers/clk/mediatek/clk-mt8516-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8516-apmixedsys.c
@@ -71,52 +71,26 @@ static const struct mtk_pll_data plls[] = {
31, 0x01A0, 1, 0x01B4, 0x01A4, 0),
};
-static int clk_mt8516_apmixed_probe(struct platform_device *pdev)
-{
- void __iomem *base;
- struct clk_hw_onecell_data *clk_data;
- struct device_node *node = pdev->dev.of_node;
- struct device *dev = &pdev->dev;
- int ret;
-
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- clk_data = mtk_devm_alloc_clk_data(dev, CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
-
- ret = mtk_clk_register_plls(dev, plls, ARRAY_SIZE(plls), clk_data);
- if (ret)
- return ret;
-
- ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
- if (ret)
- goto unregister_plls;
-
- return 0;
-
-unregister_plls:
- mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
-
- return ret;
-}
+static const struct mtk_clk_desc apmixed_desc = {
+ .plls = plls,
+ .num_plls = ARRAY_SIZE(plls),
+};
static const struct of_device_id of_match_clk_mt8516_apmixed[] = {
- { .compatible = "mediatek,mt8516-apmixedsys" },
+ { .compatible = "mediatek,mt8516-apmixedsys", .data = &apmixed_desc },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, of_match_clk_mt8516_apmixed);
static struct platform_driver clk_mt8516_apmixed_drv = {
- .probe = clk_mt8516_apmixed_probe,
+ .probe = mtk_clk_simple_probe,
+ .remove = mtk_clk_simple_remove,
.driver = {
.name = "clk-mt8516-apmixed",
.of_match_table = of_match_clk_mt8516_apmixed,
},
};
-builtin_platform_driver(clk_mt8516_apmixed_drv)
+module_platform_driver(clk_mt8516_apmixed_drv)
MODULE_DESCRIPTION("MediaTek MT8516 apmixedsys clocks driver");
MODULE_LICENSE("GPL");
--
2.55.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
` (31 preceding siblings ...)
2026-08-03 14:16 ` [PATCH 32/32] clk: mediatek: mt8516-apmixedsys: " Akari Tsuyukusa
@ 2026-08-03 19:50 ` Jakub Kicinski
2026-08-03 20:28 ` Brian Masney
32 siblings, 1 reply; 38+ messages in thread
From: Jakub Kicinski @ 2026-08-03 19:50 UTC (permalink / raw)
To: Akari Tsuyukusa
Cc: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran,
Laura Nao, Nícolas F. R. A. Prado, Chen-Yu Tsai,
Bartosz Golaszewski, Danilo Krummrich, Bjorn Helgaas,
Uwe Kleine-König (The Capable Hub), Nicolas Frattaroli,
Takashi Sakamoto, Haotian Zhang, Kees Cook, Miles Chen,
Daniel Golle, Sam Shih, open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
On Mon, 3 Aug 2026 23:16:27 +0900 Akari Tsuyukusa wrote:
> This series migrates most MediaTek clock drivers to the common
> probe/remove helpers provided by the MTK clock framework.
Why are you CCing netdev on this? None of it touches networking
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks
2026-08-03 19:50 ` [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Jakub Kicinski
@ 2026-08-03 20:28 ` Brian Masney
2026-08-04 1:40 ` Jakub Kicinski
0 siblings, 1 reply; 38+ messages in thread
From: Brian Masney @ 2026-08-03 20:28 UTC (permalink / raw)
To: Jakub Kicinski
Cc: Akari Tsuyukusa, Michael Turquette, Stephen Boyd,
Matthias Brugger, AngeloGioacchino Del Regno, Yassine Oudjana,
Richard Cochran, Laura Nao, Nícolas F. R. A. Prado,
Chen-Yu Tsai, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
Hi Jakub,
On Mon, Aug 03, 2026 at 12:50:34PM -0700, Jakub Kicinski wrote:
> On Mon, 3 Aug 2026 23:16:27 +0900 Akari Tsuyukusa wrote:
> > This series migrates most MediaTek clock drivers to the common
> > probe/remove helpers provided by the MTK clock framework.
>
> Why are you CCing netdev on this? None of it touches networking
I saw that message from you about two different mediatek patch series
from different submitters. This series has 38 files, all under
drivers/clk/mediatek/. If I run get_maintainers.pl on each file path
individuall like this:
$ cat filelist | awk '{print $1}' | \
xargs -iblah echo ./scripts/get_maintainer.pl blah
Then netdev list doesn't show up.
However, if I look at it as a whole, then it shows up:
$ b4 am 20260803141659.559129-1-akkun11.open@gmail.com
$ ./scripts/get_maintainer.pl \
./20260803_akkun11_open_clk_mediatek_migrate_to_common_probe_remove_helpers_and_fix_memory_leaks.mbx
...
netdev@vger.kernel.org (open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:\b|_)ptp(?:\b|_))
I think it's matching on this entry in MAINTAINERS:
PTP HARDWARE CLOCK SUPPORT
M: Richard Cochran <richardcochran@gmail.com>
L: netdev@vger.kernel.org
S: Maintained
W: http://linuxptp.sourceforge.net/
F: Documentation/ABI/testing/sysfs-ptp
F: Documentation/driver-api/ptp.rst
F: drivers/net/phy/dp83640*
F: drivers/ptp/*
F: include/linux/ptp_cl*
K: (?:\b|_)ptp(?:\b|_)
I think it's the K: for the ptp that's matching.
$ grep ptp 20260803_akkun11_open_clk_mediatek_migrate_to_common_probe_remove_helpers_and_fix_memory_leaks.mbx
-static const struct mtk_pll_data ptp_plls[] = {
- PLL(CLK_PTPPLL, "ptppll", PTPPLL_CON0, PTPPLL_CON0, 0, 0, PLL_AO,
+static const struct mtk_clk_desc ptp_plls = {
+ PLL(CLK_PTPPLL, "ptppll", PTPPLL_CON0, PTPPLL_CON0, 0, 0, PLL_AO,
Brian
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks
2026-08-03 20:28 ` Brian Masney
@ 2026-08-04 1:40 ` Jakub Kicinski
0 siblings, 0 replies; 38+ messages in thread
From: Jakub Kicinski @ 2026-08-04 1:40 UTC (permalink / raw)
To: Brian Masney
Cc: Akari Tsuyukusa, Michael Turquette, Stephen Boyd,
Matthias Brugger, AngeloGioacchino Del Regno, Yassine Oudjana,
Richard Cochran, Laura Nao, Nícolas F. R. A. Prado,
Chen-Yu Tsai, Bartosz Golaszewski, Danilo Krummrich,
Bjorn Helgaas, Uwe Kleine-König (The Capable Hub),
Nicolas Frattaroli, Takashi Sakamoto, Haotian Zhang, Kees Cook,
Miles Chen, Daniel Golle, Sam Shih,
open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
On Mon, 3 Aug 2026 16:28:07 -0400 Brian Masney wrote:
> Hi Jakub,
>
> On Mon, Aug 03, 2026 at 12:50:34PM -0700, Jakub Kicinski wrote:
> > On Mon, 3 Aug 2026 23:16:27 +0900 Akari Tsuyukusa wrote:
> > > This series migrates most MediaTek clock drivers to the common
> > > probe/remove helpers provided by the MTK clock framework.
> >
> > Why are you CCing netdev on this? None of it touches networking
>
> I saw that message from you about two different mediatek patch series
> from different submitters. This series has 38 files, all under
> drivers/clk/mediatek/. If I run get_maintainers.pl on each file path
> individuall like this:
>
> $ cat filelist | awk '{print $1}' | \
> xargs -iblah echo ./scripts/get_maintainer.pl blah
>
> Then netdev list doesn't show up.
>
> However, if I look at it as a whole, then it shows up:
>
> $ b4 am 20260803141659.559129-1-akkun11.open@gmail.com
> $ ./scripts/get_maintainer.pl \
> ./20260803_akkun11_open_clk_mediatek_migrate_to_common_probe_remove_helpers_and_fix_memory_leaks.mbx
>
> ...
> netdev@vger.kernel.org (open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:\b|_)ptp(?:\b|_))
>
> I think it's matching on this entry in MAINTAINERS:
>
> PTP HARDWARE CLOCK SUPPORT
> M: Richard Cochran <richardcochran@gmail.com>
> L: netdev@vger.kernel.org
> S: Maintained
> W: http://linuxptp.sourceforge.net/
> F: Documentation/ABI/testing/sysfs-ptp
> F: Documentation/driver-api/ptp.rst
> F: drivers/net/phy/dp83640*
> F: drivers/ptp/*
> F: include/linux/ptp_cl*
> K: (?:\b|_)ptp(?:\b|_)
>
> I think it's the K: for the ptp that's matching.
>
> $ grep ptp 20260803_akkun11_open_clk_mediatek_migrate_to_common_probe_remove_helpers_and_fix_memory_leaks.mbx
> -static const struct mtk_pll_data ptp_plls[] = {
> - PLL(CLK_PTPPLL, "ptppll", PTPPLL_CON0, PTPPLL_CON0, 0, 0, PLL_AO,
> +static const struct mtk_clk_desc ptp_plls = {
> + PLL(CLK_PTPPLL, "ptppll", PTPPLL_CON0, PTPPLL_CON0, 0, 0, PLL_AO,
>
I see, thanks for digging thru this!
Patchwork matching rules must be missing the PTP side because none of
the patches end up assigned to netdev. No big deal but going forward
I think you can drop this extra CC.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH 11/32] clk: mediatek: Add auto-population of sub-devices support in simple probe
2026-08-03 14:16 ` [PATCH 11/32] clk: mediatek: Add auto-population of sub-devices support in simple probe Akari Tsuyukusa
@ 2026-08-04 2:43 ` Chen-Yu Tsai
0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2026-08-04 2:43 UTC (permalink / raw)
To: Akari Tsuyukusa
Cc: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran,
Laura Nao, Nícolas F. R. A. Prado, Bartosz Golaszewski,
Danilo Krummrich, Bjorn Helgaas,
Uwe Kleine-König (The Capable Hub), Nicolas Frattaroli,
Takashi Sakamoto, Haotian Zhang, Kees Cook, Miles Chen,
Daniel Golle, Sam Shih, open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
On Mon, Aug 3, 2026 at 10:18 PM Akari Tsuyukusa <akkun11.open@gmail.com> wrote:
>
> MediaTek audio clock drivers call devm_of_platform_populate() after
> mtk_clk_simple_probe(). Extend __mtk_clk_simple_probe() to run
> devm_of_platform_populate() when the new 'populate_children' flag is
> set, reducing boilerplate.
>
> Note that explicit of_platform_depopulate() calls in remove functions
> are unnecessary because devm_of_platform_populate() is managed by
> devres and cleans up automatically.
>
> Signed-off-by: Akari Tsuyukusa <akkun11.open@gmail.com>
> ---
> drivers/clk/mediatek/clk-mtk.c | 7 +++++++
> drivers/clk/mediatek/clk-mtk.h | 1 +
> 2 files changed, 8 insertions(+)
>
> diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
> index c3369a04cdec..71d70b5a9990 100644
> --- a/drivers/clk/mediatek/clk-mtk.c
> +++ b/drivers/clk/mediatek/clk-mtk.c
> @@ -12,6 +12,7 @@
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_address.h>
> +#include <linux/of_platform.h>
> #include <linux/platform_device.h>
> #include <linux/pm_runtime.h>
> #include <linux/slab.h>
> @@ -609,6 +610,12 @@ static int __mtk_clk_simple_probe(struct platform_device *pdev,
> if (mcd->need_runtime_pm)
> pm_runtime_put(&pdev->dev);
>
> + if (mcd->populate_children) {
> + r = devm_of_platform_populate(&pdev->dev);
> + if (r)
> + goto unregister_clks;
You cannot use devm_* here, as they get unrolled _after_ the probe function
returns an error or after the remove function returns. A child could be
referencing a clock that got tore down in the error path below.
All devm_* functions need to happen before anything that requires manual
tear down. You can't mix the two together.
ChenYu
> + }
> +
> return r;
>
> unregister_clks:
> diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h
> index b6504b3e77ed..11939e3e0b38 100644
> --- a/drivers/clk/mediatek/clk-mtk.h
> +++ b/drivers/clk/mediatek/clk-mtk.h
> @@ -265,6 +265,7 @@ struct mtk_clk_desc {
> unsigned int mfg_clk_idx;
>
> bool need_runtime_pm;
> + bool populate_children;
> };
>
> int mtk_clk_pdev_probe(struct platform_device *pdev);
> --
> 2.55.0
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH 13/32] clk: mediatek: mt2701: Switch to common probe/remove helpers
2026-08-03 14:16 ` [PATCH 13/32] clk: mediatek: mt2701: Switch " Akari Tsuyukusa
@ 2026-08-04 2:45 ` Chen-Yu Tsai
0 siblings, 0 replies; 38+ messages in thread
From: Chen-Yu Tsai @ 2026-08-04 2:45 UTC (permalink / raw)
To: Akari Tsuyukusa
Cc: Michael Turquette, Stephen Boyd, Brian Masney, Matthias Brugger,
AngeloGioacchino Del Regno, Yassine Oudjana, Richard Cochran,
Laura Nao, Nícolas F. R. A. Prado, Bartosz Golaszewski,
Danilo Krummrich, Bjorn Helgaas,
Uwe Kleine-König (The Capable Hub), Nicolas Frattaroli,
Takashi Sakamoto, Haotian Zhang, Kees Cook, Miles Chen,
Daniel Golle, Sam Shih, open list:COMMON CLK FRAMEWORK, open list,
moderated list:ARM/Mediatek SoC support,
moderated list:ARM/Mediatek SoC support,
open list:PTP HARDWARE CLOCK SUPPORT:Keyword:(?:b|_)ptp(?:b|_),
stable
On Mon, Aug 3, 2026 at 10:18 PM Akari Tsuyukusa <akkun11.open@gmail.com> wrote:
>
> The MT2701 clock drivers can use the MediaTek clock framework
> common initialization sequence. Reduce boilerplate code by creating
> struct mtk_clk_desc and using the mtk_clk_simple_probe/remove helpers.
For all the subsequent conversion patches, please try to mention _what_
led to the converted driver being able to use the common helpers, i.e.
what prevented it from being used before. Was it the PLL, or PLLFH, or
something else?
Details matter.
ChenYu
^ permalink raw reply [flat|nested] 38+ messages in thread
end of thread, other threads:[~2026-08-04 2:45 UTC | newest]
Thread overview: 38+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-03 14:16 [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 01/32] clk: mediatek: mt2712: fix memory leak on module removal Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 02/32] clk: mediatek: mt6795: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 03/32] clk: mediatek: mt7622: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 04/32] clk: mediatek: mt8135: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 05/32] clk: mediatek: mt8173: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 06/32] clk: mediatek: mt8192: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 07/32] clk: mediatek: mt6735: Add missing MODULE_DEVICE_TABLE() Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 08/32] clk: mediatek: mt7988-apmixed: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 09/32] clk: mediatek: Add cpumux support to common probe/remove helpers Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 10/32] clk: mediatek: Add PLL " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 11/32] clk: mediatek: Add auto-population of sub-devices support in simple probe Akari Tsuyukusa
2026-08-04 2:43 ` Chen-Yu Tsai
2026-08-03 14:16 ` [PATCH 12/32] clk: mediatek: Add pllfh support to common probe/remove helpers Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 13/32] clk: mediatek: mt2701: Switch " Akari Tsuyukusa
2026-08-04 2:45 ` Chen-Yu Tsai
2026-08-03 14:16 ` [PATCH 14/32] clk: mediatek: mt2712-apmixedsys: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 15/32] clk: mediatek: mt6735-apmixedsys: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 16/32] clk: mediatek: mt6779: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 17/32] clk: mediatek: mt6795: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 18/32] clk: mediatek: mt6797: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 19/32] clk: mediatek: mt7622: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 20/32] clk: mediatek: mt7981-apmixed: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 21/32] clk: mediatek: mt7986-apmixed: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 22/32] clk: mediatek: mt7988-apmixed: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 23/32] clk: mediatek: mt8135-apmixedsys: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 24/32] clk: mediatek: mt8167-apmixedsys: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 25/32] clk: mediatek: mt8173-infracfg: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 26/32] clk: mediatek: mt8183: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 27/32] clk: mediatek: mt8186-apmixedsys: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 28/32] clk: mediatek: mt8188-apmixedsys: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 29/32] clk: mediatek: mt8192: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 30/32] clk: mediatek: mt8195: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 31/32] clk: mediatek: mt8196: " Akari Tsuyukusa
2026-08-03 14:16 ` [PATCH 32/32] clk: mediatek: mt8516-apmixedsys: " Akari Tsuyukusa
2026-08-03 19:50 ` [PATCH 00/32] clk: mediatek: Migrate to common probe/remove helpers and fix memory leaks Jakub Kicinski
2026-08-03 20:28 ` Brian Masney
2026-08-04 1:40 ` Jakub Kicinski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox