summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2026-07-23 10:55:18 -0600
committerTom Rini <[email protected]>2026-07-23 10:55:18 -0600
commit88226db737b258c36141b66dabe5542b2407f5cd (patch)
treec5b58e3f7dba5fca5c71c8cb1996bcba0b1057c9
parenta814edb52d93b6355c9ea1cb86ce29adb32ebbc2 (diff)
parentd0c49353a648e135f269a2953dc9326505ba87de (diff)
Merge tag 'mediatek-for-main-2026-07-22' of https://git.u-boot-project.org/u-boot/custodians/u-boot-mediatek
Fixes: * Fixed some wrong parents of VLP clocks on mt8189. * Added a missing perficfg_ao clock in mt8188. * Disabled watchdog by default on Genio 510/700. * Fixed U-Boot DT overrides not included on Genio 510/700. Cleanups/refactoring: * Changed how clock parent providers are registered and looked up for all MediaTek targets. * Removed duplicate devicetree node in mt7623. * Removed unused/non-standard DT properties in mt798{1,6,8}. * Simplified MAINTAINERS by using N: instead of F: when possible. * Replaced duplicate driver names in all MediaTek clock drivers. * Cleaned up MediaTek power domain driver and split into separate driver per compatible target. * Removed unused power domain enablement from mt798{1,6,6a,7,8}. Features: * Added power domain driver for mt8188.
-rw-r--r--MAINTAINERS38
-rw-r--r--arch/arm/dts/mt7623-u-boot.dtsi4
-rw-r--r--arch/arm/dts/mt7981.dtsi3
-rw-r--r--arch/arm/dts/mt7986.dtsi3
-rw-r--r--arch/arm/dts/mt7988.dtsi12
-rw-r--r--arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi7
-rw-r--r--arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi7
-rw-r--r--arch/arm/mach-mediatek/mt7629/init.c4
-rw-r--r--arch/arm/mach-mediatek/mt8516/init.c2
-rw-r--r--board/mediatek/MAINTAINERS3
-rw-r--r--configs/mt7622_rfb_defconfig2
-rw-r--r--configs/mt7623a_unielec_u7623_02_defconfig2
-rw-r--r--configs/mt7623n_bpir2_defconfig2
-rw-r--r--configs/mt7629_rfb_defconfig2
-rw-r--r--configs/mt7981_emmc_rfb_defconfig2
-rw-r--r--configs/mt7981_rfb_defconfig2
-rw-r--r--configs/mt7981_sd_rfb_defconfig2
-rw-r--r--configs/mt7986_rfb_defconfig2
-rw-r--r--configs/mt7986a_bpir3_emmc_defconfig2
-rw-r--r--configs/mt7986a_bpir3_sd_defconfig2
-rw-r--r--configs/mt7987_emmc_rfb_defconfig2
-rw-r--r--configs/mt7987_rfb_defconfig2
-rw-r--r--configs/mt7987_sd_rfb_defconfig2
-rw-r--r--configs/mt7988_rfb_defconfig2
-rw-r--r--configs/mt7988_sd_rfb_defconfig2
-rw-r--r--configs/mt8188.config3
-rw-r--r--configs/mt8365_evk_defconfig1
-rw-r--r--drivers/clk/mediatek/clk-mt7622.c51
-rw-r--r--drivers/clk/mediatek/clk-mt7623.c20
-rw-r--r--drivers/clk/mediatek/clk-mt7629.c46
-rw-r--r--drivers/clk/mediatek/clk-mt7981.c31
-rw-r--r--drivers/clk/mediatek/clk-mt7986.c23
-rw-r--r--drivers/clk/mediatek/clk-mt7987.c23
-rw-r--r--drivers/clk/mediatek/clk-mt7988.c36
-rw-r--r--drivers/clk/mediatek/clk-mt8183.c30
-rw-r--r--drivers/clk/mediatek/clk-mt8188.c19
-rw-r--r--drivers/clk/mediatek/clk-mt8189.c28
-rw-r--r--drivers/clk/mediatek/clk-mt8195.c10
-rw-r--r--drivers/clk/mediatek/clk-mt8365.c10
-rw-r--r--drivers/clk/mediatek/clk-mt8512.c32
-rw-r--r--drivers/clk/mediatek/clk-mt8516.c30
-rw-r--r--drivers/clk/mediatek/clk-mt8518.c30
-rw-r--r--drivers/clk/mediatek/clk-mtk.c184
-rw-r--r--drivers/clk/mediatek/clk-mtk.h21
-rw-r--r--drivers/power/domain/Kconfig89
-rw-r--r--drivers/power/domain/Makefile15
-rw-r--r--drivers/power/domain/mt2701-power-domain.c89
-rw-r--r--drivers/power/domain/mt7622-power-domain.c56
-rw-r--r--drivers/power/domain/mt8188-power-domain.c665
-rw-r--r--drivers/power/domain/mtk-power-domain.c576
-rw-r--r--drivers/power/domain/mtk-power-domain.h131
51 files changed, 1745 insertions, 617 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index 323b1b172b1..53034b703df 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -418,46 +418,12 @@ R: GSS_MTK_Uboot_upstream <[email protected]>
T: git https://git.u-boot-project.org/u-boot/custodians/u-boot-mediatek.git
S: Maintained
F: arch/arm/dts/mt*
-F: arch/arm/mach-mediatek/
-F: arch/arm/include/asm/arch-mediatek/
-F: board/mediatek/
-F: doc/device-tree-bindings/phy/phy-mtk-*
-F: doc/device-tree-bindings/usb/mediatek,*
-F: doc/README.mediatek
-F: drivers/clk/mediatek/
-F: drivers/cpu/mtk_cpu.c
-F: drivers/i2c/mtk_i2c.c
-F: drivers/mmc/mtk-sd.c
-F: drivers/net/dwc_eth_qos_mtk.c
-F: drivers/net/mtk_eth/
-F: drivers/net/phy/mediatek/
-F: drivers/phy/phy-mtk-*
-F: drivers/pinctrl/mediatek/
-F: drivers/power/domain/mtk-power-domain.c
-F: drivers/power/pmic/mtk-pwrap.c
+F: drivers/power/domain/mt*
F: drivers/power/regulator/mt*.c
-F: drivers/pci/pcie_mediatek_gen3.c
-F: drivers/pci/pcie_mediatek.c
-F: drivers/pwm/pwm-mtk.c
-F: drivers/ram/mediatek/
-F: drivers/spi/mtk_snfi_spi.c
-F: drivers/spi/mtk_spim.c
-F: drivers/spi/mtk_snor.c
-F: drivers/timer/mtk_timer.c
-F: drivers/ufs/ufs-mediatek*
-F: drivers/usb/host/xhci-mtk.c
F: drivers/usb/mtu3/
-F: drivers/watchdog/mtk_wdt.c
-F: drivers/reset/reset-mediatek.c
-F: drivers/serial/serial_mtk.c
-F: include/dt-bindings/clock/mediatek,*
-F: include/dt-bindings/power/mediatek,*
F: include/power/mt*.h
-F: tools/mtk_image.c
-F: tools/mtk_image.h
-F: tools/mtk_nand_headers.c
-F: tools/mtk_nand_headers.h
N: mediatek
+N: mtk
ARM METHODE SUPPORT
M: Robert Marko <[email protected]>
diff --git a/arch/arm/dts/mt7623-u-boot.dtsi b/arch/arm/dts/mt7623-u-boot.dtsi
index b9fd49900ce..06414180f29 100644
--- a/arch/arm/dts/mt7623-u-boot.dtsi
+++ b/arch/arm/dts/mt7623-u-boot.dtsi
@@ -8,10 +8,6 @@
bootph-all;
};
-&topckgen {
- bootph-all;
-};
-
&pericfg {
bootph-all;
};
diff --git a/arch/arm/dts/mt7981.dtsi b/arch/arm/dts/mt7981.dtsi
index 5b4cadc22f7..675b14a0b7e 100644
--- a/arch/arm/dts/mt7981.dtsi
+++ b/arch/arm/dts/mt7981.dtsi
@@ -94,7 +94,6 @@
topckgen: topckgen@1001b000 {
compatible = "mediatek,mt7981-topckgen";
reg = <0x1001b000 0x1000>;
- clock-parent = <&fixed_plls>;
#clock-cells = <1>;
bootph-all;
};
@@ -102,7 +101,6 @@
infracfg: infracfg@10001000 {
compatible = "mediatek,mt7981-infracfg";
reg = <0x10001000 0x30>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
bootph-all;
};
@@ -221,7 +219,6 @@
ethsys: syscon@15000000 {
compatible = "mediatek,mt7981-ethsys", "syscon";
reg = <0x15000000 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
#reset-cells = <1>;
};
diff --git a/arch/arm/dts/mt7986.dtsi b/arch/arm/dts/mt7986.dtsi
index b2c57098a5e..5b62d8917ac 100644
--- a/arch/arm/dts/mt7986.dtsi
+++ b/arch/arm/dts/mt7986.dtsi
@@ -111,14 +111,12 @@
topckgen: topckgen@1001B000 {
compatible = "mediatek,mt7986-topckgen";
reg = <0x1001B000 0x1000>;
- clock-parent = <&fixed_plls>;
#clock-cells = <1>;
};
infracfg: infracfg@10001040 {
compatible = "mediatek,mt7986-infracfg";
reg = <0x10001000 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
@@ -217,7 +215,6 @@
ethsys: syscon@15000000 {
compatible = "mediatek,mt7986-ethsys", "syscon";
reg = <0x15000000 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
#reset-cells = <1>;
};
diff --git a/arch/arm/dts/mt7988.dtsi b/arch/arm/dts/mt7988.dtsi
index 2d57c6f5709..0f7a85230d4 100644
--- a/arch/arm/dts/mt7988.dtsi
+++ b/arch/arm/dts/mt7988.dtsi
@@ -106,7 +106,6 @@
topckgen: topckgen@1001b000 {
compatible = "mediatek,mt7988-topckgen", "syscon";
reg = <0 0x1001b000 0 0x1000>;
- clock-parent = <&apmixedsys>;
#clock-cells = <1>;
};
@@ -129,28 +128,24 @@
sgmiisys0: syscon@10060000 {
compatible = "mediatek,mt7988-sgmiisys_0", "syscon";
reg = <0 0x10060000 0 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
sgmiisys1: syscon@10070000 {
compatible = "mediatek,mt7988-sgmiisys_1", "syscon";
reg = <0 0x10070000 0 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
usxgmiisys0: syscon@10080000 {
compatible = "mediatek,mt7988-usxgmiisys_0", "syscon";
reg = <0 0x10080000 0 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
usxgmiisys1: syscon@10081000 {
compatible = "mediatek,mt7988-usxgmiisys_1", "syscon";
reg = <0 0x10081000 0 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
@@ -378,21 +373,18 @@
xfi_pextp0: syscon@11f20000 {
compatible = "mediatek,mt7988-xfi_pextp_0", "syscon";
reg = <0 0x11f20000 0 0x10000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
xfi_pextp1: syscon@11f30000 {
compatible = "mediatek,mt7988-xfi_pextp_1", "syscon";
reg = <0 0x11f30000 0 0x10000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
xfi_pll: syscon@11f40000 {
compatible = "mediatek,mt7988-xfi_pll", "syscon";
reg = <0 0x11f40000 0 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
@@ -400,14 +392,12 @@
compatible = "mediatek,mt7988-topmisc", "syscon",
"mediatek,mt7988-power-controller";
reg = <0 0x11d10000 0 0x10000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
infracfg: infracfg@10001000 {
compatible = "mediatek,mt7988-infracfg", "syscon";
reg = <0 0x10001000 0 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
};
@@ -572,7 +562,6 @@
ethdma: syscon@15000000 {
compatible = "mediatek,mt7988-ethdma", "syscon";
reg = <0 0x15000000 0 0x20000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
#reset-cells = <1>;
};
@@ -580,7 +569,6 @@
ethwarp: syscon@15031000 {
compatible = "mediatek,mt7988-ethwarp", "syscon";
reg = <0 0x15031000 0 0x1000>;
- clock-parent = <&topckgen>;
#clock-cells = <1>;
#reset-cells = <1>;
};
diff --git a/arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi b/arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi
new file mode 100644
index 00000000000..586d15bf72e
--- /dev/null
+++ b/arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (c) 2026 BayLibre, SAS.
+ * Author: Julien Stephan <[email protected]>
+ */
+
+#include "mt8188-u-boot.dtsi"
diff --git a/arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi b/arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi
new file mode 100644
index 00000000000..586d15bf72e
--- /dev/null
+++ b/arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (c) 2026 BayLibre, SAS.
+ * Author: Julien Stephan <[email protected]>
+ */
+
+#include "mt8188-u-boot.dtsi"
diff --git a/arch/arm/mach-mediatek/mt7629/init.c b/arch/arm/mach-mediatek/mt7629/init.c
index ff027ed03ef..d12eb5339e9 100644
--- a/arch/arm/mach-mediatek/mt7629/init.c
+++ b/arch/arm/mach-mediatek/mt7629/init.c
@@ -41,7 +41,7 @@ static int mtk_pll_early_init(void)
int ret, i;
ret = uclass_get_device_by_driver(UCLASS_CLK,
- DM_DRIVER_GET(mtk_clk_apmixedsys), &dev);
+ DM_DRIVER_GET(mt7629_clk_apmixedsys), &dev);
if (ret)
return ret;
@@ -60,7 +60,7 @@ static int mtk_pll_early_init(void)
/* setup mcu bus */
ret = uclass_get_device_by_driver(UCLASS_SYSCON,
- DM_DRIVER_GET(mtk_mcucfg), &dev);
+ DM_DRIVER_GET(mt7629_mcucfg), &dev);
if (ret)
return ret;
diff --git a/arch/arm/mach-mediatek/mt8516/init.c b/arch/arm/mach-mediatek/mt8516/init.c
index b470910da7f..d9fe8fc8505 100644
--- a/arch/arm/mach-mediatek/mt8516/init.c
+++ b/arch/arm/mach-mediatek/mt8516/init.c
@@ -44,7 +44,7 @@ static int mtk_pll_early_init(void)
int ret, i;
ret = uclass_get_device_by_driver(UCLASS_CLK,
- DM_DRIVER_GET(mtk_clk_apmixedsys), &dev);
+ DM_DRIVER_GET(mt8516_clk_apmixedsys), &dev);
if (ret)
return ret;
diff --git a/board/mediatek/MAINTAINERS b/board/mediatek/MAINTAINERS
index 37ca35b4dd4..d99c6d708b2 100644
--- a/board/mediatek/MAINTAINERS
+++ b/board/mediatek/MAINTAINERS
@@ -21,6 +21,9 @@ MT8188/MT8370/MT8390
M: Macpaul Lin <[email protected]>
M: Julien Stephan <[email protected]>
S: Maintained
+F: arch/arm/dts/mt8188-u-boot.dtsi
+F: arch/arm/dts/mt8370-genio-510-evk-u-boot.dtsi
+F: arch/arm/dts/mt8390-genio-700-evk-u-boot.dtsi
F: configs/mt8188.config
F: configs/mt8370_genio_510_evk_defconfig
F: configs/mt8390_genio_700_evk_defconfig
diff --git a/configs/mt7622_rfb_defconfig b/configs/mt7622_rfb_defconfig
index b3b688ff825..10df7847a4b 100644
--- a/configs/mt7622_rfb_defconfig
+++ b/configs/mt7622_rfb_defconfig
@@ -51,7 +51,7 @@ CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7622=y
CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
+CONFIG_MT7622_POWER_DOMAIN=y
CONFIG_RAM=y
CONFIG_DM_SERIAL=y
CONFIG_MTK_SERIAL=y
diff --git a/configs/mt7623a_unielec_u7623_02_defconfig b/configs/mt7623a_unielec_u7623_02_defconfig
index 826f49a9626..77473e2731f 100644
--- a/configs/mt7623a_unielec_u7623_02_defconfig
+++ b/configs/mt7623a_unielec_u7623_02_defconfig
@@ -49,7 +49,7 @@ CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7623=y
CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
+CONFIG_MT2701_POWER_DOMAIN=y
CONFIG_DM_SERIAL=y
CONFIG_MTK_SERIAL=y
CONFIG_SYSRESET=y
diff --git a/configs/mt7623n_bpir2_defconfig b/configs/mt7623n_bpir2_defconfig
index aeef3bebe96..aacaf5380fa 100644
--- a/configs/mt7623n_bpir2_defconfig
+++ b/configs/mt7623n_bpir2_defconfig
@@ -51,7 +51,7 @@ CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7623=y
CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
+CONFIG_MT2701_POWER_DOMAIN=y
CONFIG_DM_SERIAL=y
CONFIG_MTK_SERIAL=y
CONFIG_SYSRESET=y
diff --git a/configs/mt7629_rfb_defconfig b/configs/mt7629_rfb_defconfig
index 72b1c83312e..91da684939a 100644
--- a/configs/mt7629_rfb_defconfig
+++ b/configs/mt7629_rfb_defconfig
@@ -83,7 +83,7 @@ CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7629=y
CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
+CONFIG_MT7622_POWER_DOMAIN=y
CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_RAM=y
diff --git a/configs/mt7981_emmc_rfb_defconfig b/configs/mt7981_emmc_rfb_defconfig
index e5f193b7233..75e7140bdfa 100644
--- a/configs/mt7981_emmc_rfb_defconfig
+++ b/configs/mt7981_emmc_rfb_defconfig
@@ -52,8 +52,6 @@ CONFIG_PHY_FIXED=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7981=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_SERIAL=y
diff --git a/configs/mt7981_rfb_defconfig b/configs/mt7981_rfb_defconfig
index bf361bc3ccc..6322af51b18 100644
--- a/configs/mt7981_rfb_defconfig
+++ b/configs/mt7981_rfb_defconfig
@@ -54,8 +54,6 @@ CONFIG_PHY_FIXED=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7981=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_SERIAL=y
CONFIG_MTK_SERIAL=y
CONFIG_SPI=y
diff --git a/configs/mt7981_sd_rfb_defconfig b/configs/mt7981_sd_rfb_defconfig
index f77d80f3a0a..de05e2486a0 100644
--- a/configs/mt7981_sd_rfb_defconfig
+++ b/configs/mt7981_sd_rfb_defconfig
@@ -52,8 +52,6 @@ CONFIG_PHY_FIXED=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7981=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_SERIAL=y
diff --git a/configs/mt7986_rfb_defconfig b/configs/mt7986_rfb_defconfig
index 2cbed019147..87fbe677624 100644
--- a/configs/mt7986_rfb_defconfig
+++ b/configs/mt7986_rfb_defconfig
@@ -54,8 +54,6 @@ CONFIG_PHY_FIXED=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7986=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_SERIAL=y
CONFIG_MTK_SERIAL=y
CONFIG_SPI=y
diff --git a/configs/mt7986a_bpir3_emmc_defconfig b/configs/mt7986a_bpir3_emmc_defconfig
index 80962adb43a..92459ad9fe2 100644
--- a/configs/mt7986a_bpir3_emmc_defconfig
+++ b/configs/mt7986a_bpir3_emmc_defconfig
@@ -52,8 +52,6 @@ CONFIG_PHY_FIXED=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7986=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_SERIAL=y
diff --git a/configs/mt7986a_bpir3_sd_defconfig b/configs/mt7986a_bpir3_sd_defconfig
index 0b91b275500..2c88255e69d 100644
--- a/configs/mt7986a_bpir3_sd_defconfig
+++ b/configs/mt7986a_bpir3_sd_defconfig
@@ -52,8 +52,6 @@ CONFIG_PHY_FIXED=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7986=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_SERIAL=y
diff --git a/configs/mt7987_emmc_rfb_defconfig b/configs/mt7987_emmc_rfb_defconfig
index 11673f9a1f2..00d7e5a610a 100644
--- a/configs/mt7987_emmc_rfb_defconfig
+++ b/configs/mt7987_emmc_rfb_defconfig
@@ -77,8 +77,6 @@ CONFIG_PHY_ETHERNET_ID=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7987=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_PWM=y
CONFIG_PWM_MTK=y
CONFIG_DM_SERIAL=y
diff --git a/configs/mt7987_rfb_defconfig b/configs/mt7987_rfb_defconfig
index fd2c67de4f8..0b353c6cf01 100644
--- a/configs/mt7987_rfb_defconfig
+++ b/configs/mt7987_rfb_defconfig
@@ -72,8 +72,6 @@ CONFIG_PHY_ETHERNET_ID=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7987=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_PWM=y
CONFIG_PWM_MTK=y
CONFIG_DM_SERIAL=y
diff --git a/configs/mt7987_sd_rfb_defconfig b/configs/mt7987_sd_rfb_defconfig
index b8e01475b22..30ff09365da 100644
--- a/configs/mt7987_sd_rfb_defconfig
+++ b/configs/mt7987_sd_rfb_defconfig
@@ -77,8 +77,6 @@ CONFIG_PHY_ETHERNET_ID=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7987=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_PWM=y
CONFIG_PWM_MTK=y
CONFIG_DM_SERIAL=y
diff --git a/configs/mt7988_rfb_defconfig b/configs/mt7988_rfb_defconfig
index 8230628312d..375df418ce0 100644
--- a/configs/mt7988_rfb_defconfig
+++ b/configs/mt7988_rfb_defconfig
@@ -67,8 +67,6 @@ CONFIG_PHY_FIXED=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7988=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_PWM=y
CONFIG_PWM_MTK=y
CONFIG_RAM=y
diff --git a/configs/mt7988_sd_rfb_defconfig b/configs/mt7988_sd_rfb_defconfig
index db3ca7801f9..aafbed7bea5 100644
--- a/configs/mt7988_sd_rfb_defconfig
+++ b/configs/mt7988_sd_rfb_defconfig
@@ -55,8 +55,6 @@ CONFIG_PHY_FIXED=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT7988=y
-CONFIG_POWER_DOMAIN=y
-CONFIG_MTK_POWER_DOMAIN=y
CONFIG_DM_PWM=y
CONFIG_PWM_MTK=y
CONFIG_RAM=y
diff --git a/configs/mt8188.config b/configs/mt8188.config
index 0f748415602..29e2b3db878 100644
--- a/configs/mt8188.config
+++ b/configs/mt8188.config
@@ -19,9 +19,12 @@ CONFIG_MMC_MTK=y
CONFIG_PINCTRL=y
CONFIG_PINCONF=y
CONFIG_PINCTRL_MT8188=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_MT8188_POWER_DOMAIN=y
CONFIG_BAUDRATE=921600
CONFIG_DM_SERIAL=y
CONFIG_MTK_SERIAL=y
+# CONFIG_WATCHDOG_AUTOSTART is not set
CONFIG_WDT=y
CONFIG_WDT_MTK=y
# CONFIG_RANDOM_UUID is not set
diff --git a/configs/mt8365_evk_defconfig b/configs/mt8365_evk_defconfig
index 202879ba66d..5db8418e36f 100644
--- a/configs/mt8365_evk_defconfig
+++ b/configs/mt8365_evk_defconfig
@@ -31,5 +31,6 @@ CONFIG_DM_REGULATOR_MT6357=y
CONFIG_BAUDRATE=921600
CONFIG_DM_SERIAL=y
CONFIG_MTK_SERIAL=y
+# CONFIG_WATCHDOG_AUTOSTART is not set
CONFIG_WDT=y
CONFIG_WDT_MTK=y
diff --git a/drivers/clk/mediatek/clk-mt7622.c b/drivers/clk/mediatek/clk-mt7622.c
index 79315912fd4..76bc31f06d2 100644
--- a/drivers/clk/mediatek/clk-mt7622.c
+++ b/drivers/clk/mediatek/clk-mt7622.c
@@ -85,7 +85,7 @@ static const struct mtk_gate_regs apmixed_cg_regs = {
.parent = _parent, \
.regs = &apmixed_cg_regs, \
.shift = _shift, \
- .flags = CLK_GATE_NO_SETCLR_INV, \
+ .flags = CLK_GATE_NO_SETCLR_INV | CLK_PARENT_APMIXED, \
}
static const struct mtk_gate apmixed_cgs[] = {
@@ -613,6 +613,21 @@ static const struct mtk_clk_tree mt7622_apmixed_clk_tree = {
.gates = apmixed_cgs,
.num_plls = ARRAY_SIZE(apmixed_plls),
.num_gates = ARRAY_SIZE(apmixed_cgs),
+ .type = MTK_CLK_TREE_APMIXED,
+};
+
+static const struct mtk_clk_tree mt7622_topckgen_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
+ .fdivs_offs = CLK_TOP_TO_USB3_SYS,
+ .muxes_offs = CLK_TOP_AXI_SEL,
+ .fclks = top_fixed_clks,
+ .fdivs = top_fixed_divs,
+ .muxes = top_muxes,
+ .num_fclks = ARRAY_SIZE(top_fixed_clks),
+ .num_fdivs = ARRAY_SIZE(top_fixed_divs),
+ .num_muxes = ARRAY_SIZE(top_muxes),
+ .type = MTK_CLK_TREE_TOPCKGEN,
};
static const struct mtk_clk_tree mt7622_infra_clk_tree = {
@@ -640,14 +655,6 @@ static const struct mtk_clk_tree mt7622_peri_clk_tree = {
static const struct mtk_clk_tree mt7622_clk_tree = {
.ext_clk_rates = ext_clock_rates,
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
- .fdivs_offs = CLK_TOP_TO_USB3_SYS,
- .muxes_offs = CLK_TOP_AXI_SEL,
- .fclks = top_fixed_clks,
- .fdivs = top_fixed_divs,
- .muxes = top_muxes,
- .num_fclks = ARRAY_SIZE(top_fixed_clks),
- .num_fdivs = ARRAY_SIZE(top_fixed_divs),
- .num_muxes = ARRAY_SIZE(top_muxes),
};
static int mt7622_mcucfg_probe(struct udevice *dev)
@@ -687,17 +694,17 @@ static int mt7622_apmixedsys_probe(struct udevice *dev)
static int mt7622_topckgen_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt7622_clk_tree);
+ return mtk_common_clk_init(dev, &mt7622_topckgen_clk_tree);
}
static int mt7622_infracfg_probe(struct udevice *dev)
{
- return mtk_common_clk_infrasys_init(dev, &mt7622_infra_clk_tree);
+ return mtk_common_clk_init(dev, &mt7622_infra_clk_tree);
}
static int mt7622_pericfg_probe(struct udevice *dev)
{
- return mtk_common_clk_infrasys_init(dev, &mt7622_peri_clk_tree);
+ return mtk_common_clk_init(dev, &mt7622_peri_clk_tree);
}
static int mt7622_pciesys_probe(struct udevice *dev)
@@ -795,7 +802,7 @@ static const struct udevice_id mt7622_ssusbsys_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_mcucfg) = {
+U_BOOT_DRIVER(mt7622_mcucfg) = {
.name = "mt7622-mcucfg",
.id = UCLASS_SYSCON,
.of_match = mt7622_mcucfg_compat,
@@ -803,27 +810,29 @@ U_BOOT_DRIVER(mtk_mcucfg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt7622_clk_apmixedsys) = {
.name = "mt7622-clock-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt7622_apmixed_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7622_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt7622_clk_topckgen) = {
.name = "mt7622-clock-topckgen",
.id = UCLASS_CLK,
.of_match = mt7622_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7622_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt7622_clk_infracfg) = {
.name = "mt7622-clock-infracfg",
.id = UCLASS_CLK,
.of_match = mt7622_infracfg_compat,
@@ -833,7 +842,7 @@ U_BOOT_DRIVER(mtk_clk_infracfg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_pericfg) = {
+U_BOOT_DRIVER(mt7622_clk_pericfg) = {
.name = "mt7622-clock-pericfg",
.id = UCLASS_CLK,
.of_match = mt7622_pericfg_compat,
@@ -843,7 +852,7 @@ U_BOOT_DRIVER(mtk_clk_pericfg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_pciesys) = {
+U_BOOT_DRIVER(mt7622_clk_pciesys) = {
.name = "mt7622-clock-pciesys",
.id = UCLASS_CLK,
.of_match = mt7622_pciesys_compat,
@@ -853,7 +862,7 @@ U_BOOT_DRIVER(mtk_clk_pciesys) = {
.ops = &mtk_clk_gate_ops,
};
-U_BOOT_DRIVER(mtk_clk_ethsys) = {
+U_BOOT_DRIVER(mt7622_clk_ethsys) = {
.name = "mt7622-clock-ethsys",
.id = UCLASS_CLK,
.of_match = mt7622_ethsys_compat,
@@ -863,7 +872,7 @@ U_BOOT_DRIVER(mtk_clk_ethsys) = {
.ops = &mtk_clk_gate_ops,
};
-U_BOOT_DRIVER(mtk_clk_sgmiisys) = {
+U_BOOT_DRIVER(mt7622_clk_sgmiisys) = {
.name = "mt7622-clock-sgmiisys",
.id = UCLASS_CLK,
.of_match = mt7622_sgmiisys_compat,
@@ -872,7 +881,7 @@ U_BOOT_DRIVER(mtk_clk_sgmiisys) = {
.ops = &mtk_clk_gate_ops,
};
-U_BOOT_DRIVER(mtk_clk_ssusbsys) = {
+U_BOOT_DRIVER(mt7622_clk_ssusbsys) = {
.name = "mt7622-clock-ssusbsys",
.id = UCLASS_CLK,
.of_match = mt7622_ssusbsys_compat,
diff --git a/drivers/clk/mediatek/clk-mt7623.c b/drivers/clk/mediatek/clk-mt7623.c
index 0a302b405e2..56912ebdb53 100644
--- a/drivers/clk/mediatek/clk-mt7623.c
+++ b/drivers/clk/mediatek/clk-mt7623.c
@@ -1009,6 +1009,7 @@ static const struct mtk_clk_tree mt7623_apmixedsys_clk_tree = {
.id_offs_map_size = ARRAY_SIZE(pll_id_offs_map),
.plls = apmixed_plls,
.num_plls = ARRAY_SIZE(apmixed_plls),
+ .type = MTK_CLK_TREE_APMIXED,
};
static const struct mtk_clk_tree mt7623_topckgen_clk_tree = {
@@ -1024,6 +1025,7 @@ static const struct mtk_clk_tree mt7623_topckgen_clk_tree = {
.num_fclks = ARRAY_SIZE(top_fixed_clks),
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
+ .type = MTK_CLK_TREE_TOPCKGEN,
};
static int mt7623_mcucfg_probe(struct udevice *dev)
@@ -1088,7 +1090,7 @@ static const struct mtk_clk_tree mt7623_clk_peri_tree = {
static int mt7623_pericfg_probe(struct udevice *dev)
{
- return mtk_common_clk_infrasys_init(dev, &mt7623_clk_peri_tree);
+ return mtk_common_clk_init(dev, &mt7623_clk_peri_tree);
}
static int mt7623_hifsys_probe(struct udevice *dev)
@@ -1151,7 +1153,7 @@ static const struct udevice_id mt7623_mcucfg_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_mcucfg) = {
+U_BOOT_DRIVER(mt7623_mcucfg) = {
.name = "mt7623-mcucfg",
.id = UCLASS_SYSCON,
.of_match = mt7623_mcucfg_compat,
@@ -1159,27 +1161,29 @@ U_BOOT_DRIVER(mtk_mcucfg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt7623_clk_apmixedsys) = {
.name = "mt7623-clock-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt7623_apmixed_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7623_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt7623_clk_topckgen) = {
.name = "mt7623-clock-topckgen",
.id = UCLASS_CLK,
.of_match = mt7623_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7623_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt7623_clk_infracfg) = {
.name = "mt7623-infracfg",
.id = UCLASS_CLK,
.of_match = mt7623_infracfg_compat,
@@ -1189,7 +1193,7 @@ U_BOOT_DRIVER(mtk_clk_infracfg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_pericfg) = {
+U_BOOT_DRIVER(mt7623_clk_pericfg) = {
.name = "mt7623-pericfg",
.id = UCLASS_CLK,
.of_match = mt7623_pericfg_compat,
@@ -1199,7 +1203,7 @@ U_BOOT_DRIVER(mtk_clk_pericfg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_hifsys) = {
+U_BOOT_DRIVER(mt7623_clk_hifsys) = {
.name = "mt7623-clock-hifsys",
.id = UCLASS_CLK,
.of_match = mt7623_hifsys_compat,
@@ -1209,7 +1213,7 @@ U_BOOT_DRIVER(mtk_clk_hifsys) = {
.ops = &mtk_clk_gate_ops,
};
-U_BOOT_DRIVER(mtk_clk_ethsys) = {
+U_BOOT_DRIVER(mt7623_clk_ethsys) = {
.name = "mt7623-clock-ethsys",
.id = UCLASS_CLK,
.of_match = mt7623_ethsys_compat,
diff --git a/drivers/clk/mediatek/clk-mt7629.c b/drivers/clk/mediatek/clk-mt7629.c
index 74510ee36a9..aee340aeb37 100644
--- a/drivers/clk/mediatek/clk-mt7629.c
+++ b/drivers/clk/mediatek/clk-mt7629.c
@@ -575,36 +575,32 @@ static const struct mtk_gate ssusb_cgs[] = {
GATE_SSUSB(CLK_SSUSB_DMA_EN, CLK_TOP_TO_USB3_DMA, 8),
};
-static const struct mtk_clk_tree mt7629_clk_tree = {
+static const struct mtk_clk_tree mt7629_apmixed_clk_tree = {
.pll_parent = EXT_PARENT(CLK_PAD_CLK20M),
.ext_clk_rates = ext_clock_rates,
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
- .fdivs_offs = CLK_TOP_TO_USB3_SYS,
- .muxes_offs = CLK_TOP_AXI_SEL,
.plls = apmixed_plls,
- .fclks = top_fixed_clks,
- .fdivs = top_fixed_divs,
- .muxes = top_muxes,
.num_plls = ARRAY_SIZE(apmixed_plls),
- .num_fclks = ARRAY_SIZE(top_fixed_clks),
- .num_fdivs = ARRAY_SIZE(top_fixed_divs),
- .num_muxes = ARRAY_SIZE(top_muxes),
+ .type = MTK_CLK_TREE_APMIXED,
};
-static const struct mtk_clk_tree mt7629_peri_clk_tree = {
- .pll_parent = EXT_PARENT(CLK_PAD_CLK20M),
+static const struct mtk_clk_tree mt7629_topckgen_clk_tree = {
.ext_clk_rates = ext_clock_rates,
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
.fdivs_offs = CLK_TOP_TO_USB3_SYS,
.muxes_offs = CLK_TOP_AXI_SEL,
- .plls = apmixed_plls,
.fclks = top_fixed_clks,
.fdivs = top_fixed_divs,
.muxes = top_muxes,
- .num_plls = ARRAY_SIZE(apmixed_plls),
.num_fclks = ARRAY_SIZE(top_fixed_clks),
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
+ .type = MTK_CLK_TREE_TOPCKGEN,
+};
+
+static const struct mtk_clk_tree mt7629_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static int mt7629_mcucfg_probe(struct udevice *dev)
@@ -628,7 +624,7 @@ static int mt7629_apmixedsys_probe(struct udevice *dev)
struct mtk_clk_priv *priv = dev_get_priv(dev);
int ret;
- ret = mtk_common_clk_init(dev, &mt7629_clk_tree);
+ ret = mtk_common_clk_init(dev, &mt7629_apmixed_clk_tree);
if (ret)
return ret;
@@ -642,7 +638,7 @@ static int mt7629_apmixedsys_probe(struct udevice *dev)
static int mt7629_topckgen_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt7629_clk_tree);
+ return mtk_common_clk_init(dev, &mt7629_topckgen_clk_tree);
}
static int mt7629_infracfg_probe(struct udevice *dev)
@@ -653,7 +649,7 @@ static int mt7629_infracfg_probe(struct udevice *dev)
static int mt7629_pericfg_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7629_peri_clk_tree, peri_cgs,
+ return mtk_common_clk_gate_init(dev, &mt7629_clk_tree, peri_cgs,
ARRAY_SIZE(peri_cgs), CLK_PERI_PWM1_PD);
}
@@ -728,7 +724,7 @@ static const struct udevice_id mt7629_mcucfg_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_mcucfg) = {
+U_BOOT_DRIVER(mt7629_mcucfg) = {
.name = "mt7629-mcucfg",
.id = UCLASS_SYSCON,
.of_match = mt7629_mcucfg_compat,
@@ -736,27 +732,29 @@ U_BOOT_DRIVER(mtk_mcucfg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt7629_clk_apmixedsys) = {
.name = "mt7629-clock-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt7629_apmixed_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7629_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt7629_clk_topckgen) = {
.name = "mt7629-clock-topckgen",
.id = UCLASS_CLK,
.of_match = mt7629_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7629_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt7629_clk_infracfg) = {
.name = "mt7629-clock-infracfg",
.id = UCLASS_CLK,
.of_match = mt7629_infracfg_compat,
@@ -766,7 +764,7 @@ U_BOOT_DRIVER(mtk_clk_infracfg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_pericfg) = {
+U_BOOT_DRIVER(mt7629_clk_pericfg) = {
.name = "mt7629-clock-pericfg",
.id = UCLASS_CLK,
.of_match = mt7629_pericfg_compat,
@@ -776,7 +774,7 @@ U_BOOT_DRIVER(mtk_clk_pericfg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_ethsys) = {
+U_BOOT_DRIVER(mt7629_clk_ethsys) = {
.name = "mt7629-clock-ethsys",
.id = UCLASS_CLK,
.of_match = mt7629_ethsys_compat,
@@ -786,7 +784,7 @@ U_BOOT_DRIVER(mtk_clk_ethsys) = {
.ops = &mtk_clk_gate_ops,
};
-U_BOOT_DRIVER(mtk_clk_sgmiisys) = {
+U_BOOT_DRIVER(mt7629_clk_sgmiisys) = {
.name = "mt7629-clock-sgmiisys",
.id = UCLASS_CLK,
.of_match = mt7629_sgmiisys_compat,
@@ -795,7 +793,7 @@ U_BOOT_DRIVER(mtk_clk_sgmiisys) = {
.ops = &mtk_clk_gate_ops,
};
-U_BOOT_DRIVER(mtk_clk_ssusbsys) = {
+U_BOOT_DRIVER(mt7629_clk_ssusbsys) = {
.name = "mt7629-clock-ssusbsys",
.id = UCLASS_CLK,
.of_match = mt7629_ssusbsys_compat,
diff --git a/drivers/clk/mediatek/clk-mt7981.c b/drivers/clk/mediatek/clk-mt7981.c
index 8c2944b7fb3..4e3a1c9d835 100644
--- a/drivers/clk/mediatek/clk-mt7981.c
+++ b/drivers/clk/mediatek/clk-mt7981.c
@@ -622,6 +622,7 @@ static const struct mtk_clk_tree mt7981_fixed_pll_clk_tree = {
.fdivs_offs = CLK_APMIXED_NR_CLK,
.fclks = fixed_pll_clks,
.num_fclks = ARRAY_SIZE(fixed_pll_clks),
+ .type = MTK_CLK_TREE_APMIXED,
};
static const struct mtk_clk_tree mt7981_topckgen_clk_tree = {
@@ -636,6 +637,7 @@ static const struct mtk_clk_tree mt7981_topckgen_clk_tree = {
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
.flags = CLK_PARENT_TOPCKGEN,
+ .type = MTK_CLK_TREE_TOPCKGEN,
};
static const struct mtk_clk_tree mt7981_infracfg_clk_tree = {
@@ -651,6 +653,12 @@ static const struct mtk_clk_tree mt7981_infracfg_clk_tree = {
.num_muxes = ARRAY_SIZE(infra_muxes),
.num_gates = ARRAY_SIZE(infracfg_gates),
.flags = CLK_PARENT_INFRASYS,
+ .type = MTK_CLK_TREE_INFRASYS,
+};
+
+static const struct mtk_clk_tree mt7981_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static const struct udevice_id mt7981_fixed_pll_compat[] = {
@@ -679,20 +687,22 @@ static int mt7981_topckgen_probe(struct udevice *dev)
return mtk_common_clk_init(dev, &mt7981_topckgen_clk_tree);
}
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt7981_clk_apmixedsys) = {
.name = "mt7981-clock-fixed-pll",
.id = UCLASS_CLK,
.of_match = mt7981_fixed_pll_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7981_fixed_pll_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_fixed_pll_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt7981_clk_topckgen) = {
.name = "mt7981-clock-topckgen",
.id = UCLASS_CLK,
.of_match = mt7981_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7981_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
@@ -706,13 +716,14 @@ static const struct udevice_id mt7981_infracfg_compat[] = {
static int mt7981_infracfg_probe(struct udevice *dev)
{
- return mtk_common_clk_infrasys_init(dev, &mt7981_infracfg_clk_tree);
+ return mtk_common_clk_init(dev, &mt7981_infracfg_clk_tree);
}
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt7981_clk_infracfg) = {
.name = "mt7981-clock-infracfg",
.id = UCLASS_CLK,
.of_match = mt7981_infracfg_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7981_infracfg_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_infrasys_ops,
@@ -742,7 +753,7 @@ static const struct mtk_gate sgmii0_cgs[] = {
static int mt7981_sgmii0sys_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7981_topckgen_clk_tree,
+ return mtk_common_clk_gate_init(dev, &mt7981_clk_tree,
sgmii0_cgs, ARRAY_SIZE(sgmii0_cgs), 0);
}
@@ -751,7 +762,7 @@ static const struct udevice_id mt7981_sgmii0sys_compat[] = {
{}
};
-U_BOOT_DRIVER(mtk_clk_sgmii0sys) = {
+U_BOOT_DRIVER(mt7981_clk_sgmii0sys) = {
.name = "mt7981-clock-sgmii0sys",
.id = UCLASS_CLK,
.of_match = mt7981_sgmii0sys_compat,
@@ -769,7 +780,7 @@ static const struct mtk_gate sgmii1_cgs[] = {
static int mt7981_sgmii1sys_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7981_topckgen_clk_tree,
+ return mtk_common_clk_gate_init(dev, &mt7981_clk_tree,
sgmii1_cgs, ARRAY_SIZE(sgmii1_cgs), 0);
}
@@ -778,7 +789,7 @@ static const struct udevice_id mt7981_sgmii1sys_compat[] = {
{}
};
-U_BOOT_DRIVER(mtk_clk_sgmii1sys) = {
+U_BOOT_DRIVER(mt7981_clk_sgmii1sys) = {
.name = "mt7981-clock-sgmii1sys",
.id = UCLASS_CLK,
.of_match = mt7981_sgmii1sys_compat,
@@ -810,7 +821,7 @@ static const struct mtk_gate eth_cgs[] = {
static int mt7981_ethsys_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7981_topckgen_clk_tree,
+ return mtk_common_clk_gate_init(dev, &mt7981_clk_tree,
eth_cgs, ARRAY_SIZE(eth_cgs), 0);
}
@@ -832,7 +843,7 @@ static const struct udevice_id mt7981_ethsys_compat[] = {
{}
};
-U_BOOT_DRIVER(mtk_clk_ethsys) = {
+U_BOOT_DRIVER(mt7981_clk_ethsys) = {
.name = "mt7981-clock-ethsys",
.id = UCLASS_CLK,
.of_match = mt7981_ethsys_compat,
diff --git a/drivers/clk/mediatek/clk-mt7986.c b/drivers/clk/mediatek/clk-mt7986.c
index 9c6514120a6..56e18d403c8 100644
--- a/drivers/clk/mediatek/clk-mt7986.c
+++ b/drivers/clk/mediatek/clk-mt7986.c
@@ -530,6 +530,7 @@ static const struct mtk_clk_tree mt7986_fixed_pll_clk_tree = {
.fclks = fixed_pll_clks,
.num_fclks = ARRAY_SIZE(fixed_pll_clks),
.flags = CLK_PARENT_APMIXED,
+ .type = MTK_CLK_TREE_APMIXED,
};
static const struct mtk_clk_tree mt7986_topckgen_clk_tree = {
@@ -544,6 +545,7 @@ static const struct mtk_clk_tree mt7986_topckgen_clk_tree = {
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
.flags = CLK_PARENT_TOPCKGEN,
+ .type = MTK_CLK_TREE_TOPCKGEN,
};
static const struct mtk_clk_tree mt7986_infracfg_clk_tree = {
@@ -559,6 +561,12 @@ static const struct mtk_clk_tree mt7986_infracfg_clk_tree = {
.num_muxes = ARRAY_SIZE(infra_muxes),
.num_gates = ARRAY_SIZE(infracfg_gates),
.flags = CLK_PARENT_INFRASYS,
+ .type = MTK_CLK_TREE_INFRASYS,
+};
+
+static const struct mtk_clk_tree mt7986_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static const struct udevice_id mt7986_fixed_pll_compat[] = {
@@ -587,20 +595,22 @@ static int mt7986_topckgen_probe(struct udevice *dev)
return mtk_common_clk_init(dev, &mt7986_topckgen_clk_tree);
}
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt7986_clk_apmixedsys) = {
.name = "mt7986-clock-fixed-pll",
.id = UCLASS_CLK,
.of_match = mt7986_fixed_pll_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7986_fixed_pll_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_fixed_pll_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt7986_clk_topckgen) = {
.name = "mt7986-clock-topckgen",
.id = UCLASS_CLK,
.of_match = mt7986_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7986_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
@@ -614,13 +624,14 @@ static const struct udevice_id mt7986_infracfg_compat[] = {
static int mt7986_infracfg_probe(struct udevice *dev)
{
- return mtk_common_clk_infrasys_init(dev, &mt7986_infracfg_clk_tree);
+ return mtk_common_clk_init(dev, &mt7986_infracfg_clk_tree);
}
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt7986_clk_infracfg) = {
.name = "mt7986-clock-infracfg",
.id = UCLASS_CLK,
.of_match = mt7986_infracfg_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7986_infracfg_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_infrasys_ops,
@@ -649,7 +660,7 @@ static const struct mtk_gate eth_cgs[] = {
static int mt7986_ethsys_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7986_topckgen_clk_tree, eth_cgs,
+ return mtk_common_clk_gate_init(dev, &mt7986_clk_tree, eth_cgs,
ARRAY_SIZE(eth_cgs), 0);
}
@@ -671,7 +682,7 @@ static const struct udevice_id mt7986_ethsys_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_clk_ethsys) = {
+U_BOOT_DRIVER(mt7986_clk_ethsys) = {
.name = "mt7986-clock-ethsys",
.id = UCLASS_CLK,
.of_match = mt7986_ethsys_compat,
diff --git a/drivers/clk/mediatek/clk-mt7987.c b/drivers/clk/mediatek/clk-mt7987.c
index 5f102636079..4ac0c6faa94 100644
--- a/drivers/clk/mediatek/clk-mt7987.c
+++ b/drivers/clk/mediatek/clk-mt7987.c
@@ -60,6 +60,7 @@ static const struct mtk_clk_tree mt7987_fixed_pll_clk_tree = {
.fclks = apmixedsys_mtk_plls,
.num_fclks = ARRAY_SIZE(apmixedsys_mtk_plls),
.flags = CLK_PARENT_APMIXED,
+ .type = MTK_CLK_TREE_APMIXED,
};
static const struct udevice_id mt7987_fixed_pll_compat[] = {
@@ -73,10 +74,11 @@ static int mt7987_fixed_pll_probe(struct udevice *dev)
return mtk_common_clk_init(dev, &mt7987_fixed_pll_clk_tree);
}
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt7987_clk_apmixedsys) = {
.name = "mt7987-clock-fixed-pll",
.id = UCLASS_CLK,
.of_match = mt7987_fixed_pll_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7987_fixed_pll_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_fixed_pll_ops,
@@ -457,6 +459,12 @@ static const struct mtk_clk_tree mt7987_topckgen_clk_tree = {
.num_fdivs = ARRAY_SIZE(topckgen_mtk_fixed_factors),
.num_muxes = ARRAY_SIZE(topckgen_mtk_muxes),
.flags = CLK_PARENT_TOPCKGEN,
+ .type = MTK_CLK_TREE_TOPCKGEN,
+};
+
+static const struct mtk_clk_tree mt7987_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static const struct udevice_id mt7987_topckgen_compat[] = {
@@ -476,10 +484,11 @@ static int mt7987_topckgen_probe(struct udevice *dev)
return mtk_common_clk_init(dev, &mt7987_topckgen_clk_tree);
}
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt7987_clk_topckgen) = {
.name = "mt7987-clock-topckgen",
.id = UCLASS_CLK,
.of_match = mt7987_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7987_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
@@ -783,6 +792,7 @@ static const struct mtk_clk_tree mt7987_infracfg_clk_tree = {
.gates = infracfg_mtk_gates,
.num_muxes = ARRAY_SIZE(infracfg_mtk_mux),
.num_gates = ARRAY_SIZE(infracfg_mtk_gates),
+ .type = MTK_CLK_TREE_INFRASYS,
};
static const struct udevice_id mt7987_infracfg_compat[] = {
@@ -793,13 +803,14 @@ static const struct udevice_id mt7987_infracfg_compat[] = {
static int mt7987_infracfg_probe(struct udevice *dev)
{
- return mtk_common_clk_infrasys_init(dev, &mt7987_infracfg_clk_tree);
+ return mtk_common_clk_init(dev, &mt7987_infracfg_clk_tree);
}
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt7987_clk_infracfg) = {
.name = "mt7987-clock-infracfg",
.id = UCLASS_CLK,
.of_match = mt7987_infracfg_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7987_infracfg_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_infrasys_ops,
@@ -829,7 +840,7 @@ static const struct mtk_gate eth_cgs[] = {
static int mt7987_ethsys_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7987_topckgen_clk_tree, eth_cgs,
+ return mtk_common_clk_gate_init(dev, &mt7987_clk_tree, eth_cgs,
ARRAY_SIZE(eth_cgs), 0);
}
@@ -853,7 +864,7 @@ static const struct udevice_id mt7987_ethsys_compat[] = {
{}
};
-U_BOOT_DRIVER(mtk_clk_ethsys) = {
+U_BOOT_DRIVER(mt7987_clk_ethsys) = {
.name = "mt7987-clock-ethsys",
.id = UCLASS_CLK,
.of_match = mt7987_ethsys_compat,
diff --git a/drivers/clk/mediatek/clk-mt7988.c b/drivers/clk/mediatek/clk-mt7988.c
index 4e19f285da0..ebad78a9151 100644
--- a/drivers/clk/mediatek/clk-mt7988.c
+++ b/drivers/clk/mediatek/clk-mt7988.c
@@ -808,6 +808,7 @@ static const struct mtk_clk_tree mt7988_fixed_pll_clk_tree = {
.fclks = apmixedsys_mtk_plls,
.num_fclks = ARRAY_SIZE(apmixedsys_mtk_plls),
.flags = CLK_PARENT_APMIXED,
+ .type = MTK_CLK_TREE_APMIXED,
};
static const struct mtk_clk_tree mt7988_topckgen_clk_tree = {
@@ -822,6 +823,7 @@ static const struct mtk_clk_tree mt7988_topckgen_clk_tree = {
.num_fdivs = ARRAY_SIZE(topckgen_mtk_fixed_factors),
.num_muxes = ARRAY_SIZE(topckgen_mtk_muxes),
.flags = CLK_PARENT_TOPCKGEN,
+ .type = MTK_CLK_TREE_TOPCKGEN,
};
static const struct mtk_clk_tree mt7988_infracfg_clk_tree = {
@@ -833,6 +835,12 @@ static const struct mtk_clk_tree mt7988_infracfg_clk_tree = {
.gates = infracfg_mtk_gates,
.num_muxes = ARRAY_SIZE(infracfg_mtk_mux),
.num_gates = ARRAY_SIZE(infracfg_mtk_gates),
+ .type = MTK_CLK_TREE_INFRASYS,
+};
+
+static const struct mtk_clk_tree mt7988_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static const struct udevice_id mt7988_fixed_pll_compat[] = {
@@ -863,20 +871,22 @@ static int mt7988_topckgen_probe(struct udevice *dev)
return mtk_common_clk_init(dev, &mt7988_topckgen_clk_tree);
}
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt7988_clk_apmixedsys) = {
.name = "mt7988-clock-fixed-pll",
.id = UCLASS_CLK,
.of_match = mt7988_fixed_pll_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7988_fixed_pll_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_fixed_pll_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt7988_clk_topckgen) = {
.name = "mt7988-clock-topckgen",
.id = UCLASS_CLK,
.of_match = mt7988_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7988_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
@@ -890,13 +900,14 @@ static const struct udevice_id mt7988_infracfg_compat[] = {
static int mt7988_infracfg_probe(struct udevice *dev)
{
- return mtk_common_clk_infrasys_init(dev, &mt7988_infracfg_clk_tree);
+ return mtk_common_clk_init(dev, &mt7988_infracfg_clk_tree);
}
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt7988_clk_infracfg) = {
.name = "mt7988-clock-infracfg",
.id = UCLASS_CLK,
.of_match = mt7988_infracfg_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt7988_infracfg_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_infrasys_ops,
@@ -924,8 +935,7 @@ static const struct mtk_gate ethdma_mtk_gate[] = {
static int mt7988_ethdma_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree,
- ethdma_mtk_gate,
+ return mtk_common_clk_gate_init(dev, &mt7988_clk_tree, ethdma_mtk_gate,
ARRAY_SIZE(ethdma_mtk_gate), 0);
}
@@ -949,7 +959,7 @@ static const struct udevice_id mt7988_ethdma_compat[] = {
{}
};
-U_BOOT_DRIVER(mtk_clk_ethdma) = {
+U_BOOT_DRIVER(mt7988_clk_ethdma) = {
.name = "mt7988-clock-ethdma",
.id = UCLASS_CLK,
.of_match = mt7988_ethdma_compat,
@@ -983,7 +993,7 @@ static const struct mtk_gate sgmiisys_0_mtk_gate[] = {
static int mt7988_sgmiisys_0_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree,
+ return mtk_common_clk_gate_init(dev, &mt7988_clk_tree,
sgmiisys_0_mtk_gate,
ARRAY_SIZE(sgmiisys_0_mtk_gate), 0);
}
@@ -995,7 +1005,7 @@ static const struct udevice_id mt7988_sgmiisys_0_compat[] = {
{}
};
-U_BOOT_DRIVER(mtk_clk_sgmiisys_0) = {
+U_BOOT_DRIVER(mt7988_clk_sgmiisys_0) = {
.name = "mt7988-clock-sgmiisys_0",
.id = UCLASS_CLK,
.of_match = mt7988_sgmiisys_0_compat,
@@ -1028,7 +1038,7 @@ static const struct mtk_gate sgmiisys_1_mtk_gate[] = {
static int mt7988_sgmiisys_1_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree,
+ return mtk_common_clk_gate_init(dev, &mt7988_clk_tree,
sgmiisys_1_mtk_gate,
ARRAY_SIZE(sgmiisys_1_mtk_gate), 0);
}
@@ -1040,7 +1050,7 @@ static const struct udevice_id mt7988_sgmiisys_1_compat[] = {
{}
};
-U_BOOT_DRIVER(mtk_clk_sgmiisys_1) = {
+U_BOOT_DRIVER(mt7988_clk_sgmiisys_1) = {
.name = "mt7988-clock-sgmiisys_1",
.id = UCLASS_CLK,
.of_match = mt7988_sgmiisys_1_compat,
@@ -1075,7 +1085,7 @@ static const struct mtk_gate ethwarp_mtk_gate[] = {
static int mt7988_ethwarp_probe(struct udevice *dev)
{
- return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree,
+ return mtk_common_clk_gate_init(dev, &mt7988_clk_tree,
ethwarp_mtk_gate,
ARRAY_SIZE(ethwarp_mtk_gate), 0);
}
@@ -1100,7 +1110,7 @@ static const struct udevice_id mt7988_ethwarp_compat[] = {
{}
};
-U_BOOT_DRIVER(mtk_clk_ethwarp) = {
+U_BOOT_DRIVER(mt7988_clk_ethwarp) = {
.name = "mt7988-clock-ethwarp",
.id = UCLASS_CLK,
.of_match = mt7988_ethwarp_compat,
diff --git a/drivers/clk/mediatek/clk-mt8183.c b/drivers/clk/mediatek/clk-mt8183.c
index 7b2d796bc6c..a619dce5ca3 100644
--- a/drivers/clk/mediatek/clk-mt8183.c
+++ b/drivers/clk/mediatek/clk-mt8183.c
@@ -604,20 +604,32 @@ static const struct mtk_composite top_muxes[] = {
MUX(CLK_TOP_MUX_AUD_2, aud_2_parents, 0xe0, 8, 1),
};
-static const struct mtk_clk_tree mt8183_clk_tree = {
+static const struct mtk_clk_tree mt8183_apmixed_clk_tree = {
.pll_parent = EXT_PARENT(CLK_PAD_CLK26M),
.ext_clk_rates = ext_clock_rates,
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
+ .plls = apmixed_plls,
+ .num_plls = ARRAY_SIZE(apmixed_plls),
+ .type = MTK_CLK_TREE_APMIXED,
+};
+
+static const struct mtk_clk_tree mt8183_topckgen_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
.fdivs_offs = CLK_TOP_CLK13M,
.muxes_offs = CLK_TOP_MUX_AXI,
- .plls = apmixed_plls,
.fclks = top_fixed_clks,
.fdivs = top_fixed_divs,
.muxes = top_muxes,
- .num_plls = ARRAY_SIZE(apmixed_plls),
.num_fclks = ARRAY_SIZE(top_fixed_clks),
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
+ .type = MTK_CLK_TREE_TOPCKGEN,
+};
+
+static const struct mtk_clk_tree mt8183_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static const struct mtk_gate_regs infra0_cg_regs = {
@@ -782,12 +794,12 @@ static const struct mtk_gate infra_clks[] = {
static int mt8183_apmixedsys_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt8183_clk_tree);
+ return mtk_common_clk_init(dev, &mt8183_apmixed_clk_tree);
}
static int mt8183_topckgen_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt8183_clk_tree);
+ return mtk_common_clk_init(dev, &mt8183_topckgen_clk_tree);
}
static int mt8183_infracfg_probe(struct udevice *dev)
@@ -811,27 +823,29 @@ static const struct udevice_id mt8183_infracfg_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt8183_clk_apmixedsys) = {
.name = "mt8183-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt8183_apmixed_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8183_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt8183_clk_topckgen) = {
.name = "mt8183-topckgen",
.id = UCLASS_CLK,
.of_match = mt8183_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8183_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt8183_clk_infracfg) = {
.name = "mt8183-infracfg",
.id = UCLASS_CLK,
.of_match = mt8183_infracfg_compat,
diff --git a/drivers/clk/mediatek/clk-mt8188.c b/drivers/clk/mediatek/clk-mt8188.c
index 3e413e111f1..f73fa1fce95 100644
--- a/drivers/clk/mediatek/clk-mt8188.c
+++ b/drivers/clk/mediatek/clk-mt8188.c
@@ -89,6 +89,7 @@ static const struct mtk_clk_tree mt8188_apmixedsys_clk_tree = {
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
.plls = apmixed_plls,
.num_plls = ARRAY_SIZE(apmixed_plls),
+ .type = MTK_CLK_TREE_APMIXED,
};
#define FIXED_CLK0(_id, _rate) \
@@ -1422,6 +1423,7 @@ static const struct mtk_clk_tree mt8188_topckgen_clk_tree = {
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
.num_gates = ARRAY_SIZE(topckgen_cg_clks),
+ .type = MTK_CLK_TREE_TOPCKGEN,
};
static const struct mtk_gate_regs infra_ao0_cg_regs = {
@@ -1657,6 +1659,7 @@ static const struct mtk_gate pericfg_ao_clks[] = {
GATE_PERI_AO(CLK_PERI_AO_SSUSB_BUS, CLK_TOP_USB_TOP, 13),
GATE_PERI_AO(CLK_PERI_AO_SSUSB_XHCI, CLK_TOP_SSUSB_XHCI, 14),
GATE_PERI_AO(CLK_PERI_AO_ETHERNET_MAC, CLK_TOP_SNPS_ETH_250M, 16),
+ GATE_PERI_AO(CLK_PERI_AO_PCIE_P0_FMEM, CLK_TOP_466M_FMEM, 24),
};
static const struct mtk_clk_tree mt8188_pericfg_ao_clk_tree = {
@@ -1789,27 +1792,29 @@ static const struct udevice_id mt8188_imp_iic_wrap_en_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt8188_clk_apmixedsys) = {
.name = "mt8188-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt8188_apmixed_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8188_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt8188_clk_topckgen) = {
.name = "mt8188-topckgen",
.id = UCLASS_CLK,
.of_match = mt8188_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8188_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_infracfg_ao) = {
+U_BOOT_DRIVER(mt8188_clk_infracfg_ao) = {
.name = "mt8188-infracfg-ao",
.id = UCLASS_CLK,
.of_match = mt8188_infracfg_ao_compat,
@@ -1819,7 +1824,7 @@ U_BOOT_DRIVER(mtk_clk_infracfg_ao) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_pericfg_ao) = {
+U_BOOT_DRIVER(mt8188_clk_pericfg_ao) = {
.name = "mt8188-pericfg-ao",
.id = UCLASS_CLK,
.of_match = mt8188_pericfg_ao_compat,
@@ -1829,7 +1834,7 @@ U_BOOT_DRIVER(mtk_clk_pericfg_ao) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_imp_iic_wrap_c) = {
+U_BOOT_DRIVER(mt8188_clk_imp_iic_wrap_c) = {
.name = "mt8188-imp_iic_wrap_c",
.id = UCLASS_CLK,
.of_match = mt8188_imp_iic_wrap_c_compat,
@@ -1839,7 +1844,7 @@ U_BOOT_DRIVER(mtk_clk_imp_iic_wrap_c) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_imp_iic_wrap_w) = {
+U_BOOT_DRIVER(mt8188_clk_imp_iic_wrap_w) = {
.name = "mt8188-imp_iic_wrap_w",
.id = UCLASS_CLK,
.of_match = mt8188_imp_iic_wrap_w_compat,
@@ -1849,7 +1854,7 @@ U_BOOT_DRIVER(mtk_clk_imp_iic_wrap_w) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_imp_iic_wrap_en) = {
+U_BOOT_DRIVER(mt8188_clk_imp_iic_wrap_en) = {
.name = "mt8188-imp_iic_wrap_en",
.id = UCLASS_CLK,
.of_match = mt8188_imp_iic_wrap_en_compat,
diff --git a/drivers/clk/mediatek/clk-mt8189.c b/drivers/clk/mediatek/clk-mt8189.c
index d11947ee461..3093fac23ce 100644
--- a/drivers/clk/mediatek/clk-mt8189.c
+++ b/drivers/clk/mediatek/clk-mt8189.c
@@ -1898,6 +1898,7 @@ static const struct mtk_gate_regs vlpcfg_ao_regs = {
* arbitrary parent trees.
*/
#define CLK_PARENT_VLP_CK CLK_PARENT_INFRASYS
+#define MTK_CLK_TREE_VLP_CK MTK_CLK_TREE_INFRASYS
#define GATE_VLPCFG_AO(id, parent, shift, flags) \
GATE_FLAGS(id, parent, &vlpcfg_ao_regs, shift, flags | CLK_GATE_NO_SETCLR_INV)
@@ -1915,8 +1916,8 @@ static const struct mtk_gate vlpcfg_ao_clks[] = {
GATE_VLPCFG_AO_VLP(CLK_VLPCFG_REG_SCP, CLK_VLP_CK_SCP_SEL, 28),
GATE_VLPCFG_AO_EXT(CLK_VLPCFG_REG_RG_R_APXGPT_26M, CLK_PAD_CLK26M, 24),
GATE_VLPCFG_AO_EXT(CLK_VLPCFG_REG_DPMSRCK_TEST, CLK_PAD_CLK26M, 23),
- GATE_VLPCFG_AO_VLP(CLK_VLPCFG_REG_RG_DPMSRRTC_TEST, CLK_PAD_CLK32K, 22),
- GATE_VLPCFG_AO_VLP(CLK_VLPCFG_REG_DPMSRULP_TEST, CLK_TOP_OSC_D10, 21),
+ GATE_VLPCFG_AO_EXT(CLK_VLPCFG_REG_RG_DPMSRRTC_TEST, CLK_PAD_CLK32K, 22),
+ GATE_VLPCFG_AO_TOP(CLK_VLPCFG_REG_DPMSRULP_TEST, CLK_TOP_OSC_D10, 21),
GATE_VLPCFG_AO_VLP(CLK_VLPCFG_REG_SPMI_P_MST, CLK_VLP_CK_SPMI_P_MST_SEL, 20),
GATE_VLPCFG_AO_EXT(CLK_VLPCFG_REG_SPMI_P_MST_32K, CLK_PAD_CLK32K, 18),
GATE_VLPCFG_AO_VLP(CLK_VLPCFG_REG_PMIF_SPMI_P_SYS, CLK_VLP_CK_PWRAP_ULPOSC_SEL, 13),
@@ -1939,6 +1940,7 @@ static const struct mtk_clk_tree mt8189_apmixedsys_clk_tree = {
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
.plls = apmixed_plls,
.num_plls = ARRAY_SIZE(apmixed_plls),
+ .type = MTK_CLK_TREE_APMIXED,
};
static const struct mtk_clk_tree mt8189_topckgen_clk_tree = {
@@ -1953,6 +1955,7 @@ static const struct mtk_clk_tree mt8189_topckgen_clk_tree = {
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
.num_gates = ARRAY_SIZE(top_gates),
+ .type = MTK_CLK_TREE_TOPCKGEN,
};
static const struct mtk_clk_tree mt8189_vlpckgen_clk_tree = {
@@ -1964,6 +1967,12 @@ static const struct mtk_clk_tree mt8189_vlpckgen_clk_tree = {
.gates = vlp_ck_gates,
.num_muxes = ARRAY_SIZE(vlp_ck_muxes),
.num_gates = ARRAY_SIZE(vlp_ck_gates),
+ .type = MTK_CLK_TREE_VLP_CK,
+};
+
+static const struct mtk_clk_tree mt8189_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static const struct udevice_id mt8189_apmixed[] = {
@@ -2022,7 +2031,7 @@ static int mt8189_topckgen_probe(struct udevice *dev)
static int mt8189_infrasys_probe(struct udevice *dev)
{
- return mtk_common_clk_infrasys_init(dev, &mt8189_vlpckgen_clk_tree);
+ return mtk_common_clk_init(dev, &mt8189_vlpckgen_clk_tree);
}
static int mt8189_clk_gate_probe(struct udevice *dev)
@@ -2031,42 +2040,45 @@ static int mt8189_clk_gate_probe(struct udevice *dev)
data = (void *)dev_get_driver_data(dev);
- return mtk_common_clk_gate_init(dev, &mt8189_topckgen_clk_tree,
+ return mtk_common_clk_gate_init(dev, &mt8189_clk_tree,
data->gates, data->num_gates,
data->gates[0].id);
}
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt8189_clk_apmixedsys) = {
.name = "mt8189-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt8189_apmixed,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8189_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt8189_clk_topckgen) = {
.name = "mt8189-topckgen",
.id = UCLASS_CLK,
.of_match = mt8189_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8189_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_vlpckgen) = {
+U_BOOT_DRIVER(mt8189_clk_vlpckgen) = {
.name = "mt8189-vlpckgen",
.id = UCLASS_CLK,
.of_match = mt8189_vlpckgen,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8189_infrasys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_infrasys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_gate) = {
+U_BOOT_DRIVER(mt8189_clk_gate) = {
.name = "mt8189-gate-clk",
.id = UCLASS_CLK,
.of_match = of_match_mt8189_clk_gate,
diff --git a/drivers/clk/mediatek/clk-mt8195.c b/drivers/clk/mediatek/clk-mt8195.c
index 37cceb5f32b..c12463cc616 100644
--- a/drivers/clk/mediatek/clk-mt8195.c
+++ b/drivers/clk/mediatek/clk-mt8195.c
@@ -101,6 +101,7 @@ static const struct mtk_clk_tree mt8195_apmixedsys_clk_tree = {
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
.plls = apmixed_plls,
.num_plls = ARRAY_SIZE(apmixed_plls),
+ .type = MTK_CLK_TREE_APMIXED,
};
#define FIXED_CLK0(_id, _rate) \
@@ -1423,6 +1424,7 @@ static const struct mtk_clk_tree mt8195_topckgen_clk_tree = {
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
.num_gates = ARRAY_SIZE(top_cg_clks),
+ .type = MTK_CLK_TREE_TOPCKGEN,
};
static const struct mtk_gate_regs infra_ao0_cg_regs = {
@@ -1631,27 +1633,29 @@ static const struct udevice_id of_match_clk_mt8195_infra_ao[] = {
{ }
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt8195_clk_apmixedsys) = {
.name = "mt8195-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt8195_apmixed,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8195_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt8195_clk_topckgen) = {
.name = "mt8195-topckgen",
.id = UCLASS_CLK,
.of_match = mt8195_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8195_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_infra_ao) = {
+U_BOOT_DRIVER(mt8195_clk_infra_ao) = {
.name = "mt8195-infra_ao",
.id = UCLASS_CLK,
.of_match = of_match_clk_mt8195_infra_ao,
diff --git a/drivers/clk/mediatek/clk-mt8365.c b/drivers/clk/mediatek/clk-mt8365.c
index eb94b86622c..bb00d6154e1 100644
--- a/drivers/clk/mediatek/clk-mt8365.c
+++ b/drivers/clk/mediatek/clk-mt8365.c
@@ -79,6 +79,7 @@ static const struct mtk_clk_tree mt8365_apmixed_tree = {
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
.plls = apmixed_plls,
.num_plls = ARRAY_SIZE(apmixed_plls),
+ .type = MTK_CLK_TREE_APMIXED,
};
/* topckgen */
@@ -595,6 +596,7 @@ static const struct mtk_clk_tree mt8365_topckgen_tree = {
.num_fdivs = ARRAY_SIZE(top_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
.num_gates = ARRAY_SIZE(top_clk_gates),
+ .type = MTK_CLK_TREE_TOPCKGEN,
};
/* infracfg */
@@ -788,27 +790,29 @@ static const struct udevice_id mt8365_infracfg_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt8365_clk_apmixedsys) = {
.name = "mt8365-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt8365_apmixed_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8365_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt8365_clk_topckgen) = {
.name = "mt8365-topckgen",
.id = UCLASS_CLK,
.of_match = mt8365_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8365_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt8365_clk_infracfg) = {
.name = "mt8365-infracfg",
.id = UCLASS_CLK,
.of_match = mt8365_infracfg_compat,
diff --git a/drivers/clk/mediatek/clk-mt8512.c b/drivers/clk/mediatek/clk-mt8512.c
index d6e58be8e22..88c55e5ac6c 100644
--- a/drivers/clk/mediatek/clk-mt8512.c
+++ b/drivers/clk/mediatek/clk-mt8512.c
@@ -792,30 +792,42 @@ static const struct mtk_gate infra_clks[] = {
GATE_INFRA5(CLK_INFRA_USB_XHCI, CLK_TOP_SSUSB_XHCI_SEL, 11),
};
-static const struct mtk_clk_tree mt8512_clk_tree = {
+static const struct mtk_clk_tree mt8512_apmixed_clk_tree = {
.pll_parent = EXT_PARENT(CLK_PAD_CLK26M),
.ext_clk_rates = ext_clock_rates,
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
+ .plls = apmixed_plls,
+ .num_plls = ARRAY_SIZE(apmixed_plls),
+ .type = MTK_CLK_TREE_APMIXED,
+};
+
+static const struct mtk_clk_tree mt8512_topckgen_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
.fdivs_offs = CLK_TOP_SYSPLL1_D2,
.muxes_offs = CLK_TOP_AXI_SEL,
- .plls = apmixed_plls,
.fclks = top_fixed_clks,
.fdivs = top_fixed_divs,
.muxes = top_muxes,
- .num_plls = ARRAY_SIZE(apmixed_plls),
.num_fclks = ARRAY_SIZE(top_fixed_clks),
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
+ .type = MTK_CLK_TREE_TOPCKGEN,
+};
+
+static const struct mtk_clk_tree mt8512_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static int mt8512_apmixedsys_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt8512_clk_tree);
+ return mtk_common_clk_init(dev, &mt8512_apmixed_clk_tree);
}
static int mt8512_topckgen_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt8512_clk_tree);
+ return mtk_common_clk_init(dev, &mt8512_topckgen_clk_tree);
}
static int mt8512_topckgen_cg_probe(struct udevice *dev)
@@ -850,27 +862,29 @@ static const struct udevice_id mt8512_infracfg_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt8512_clk_apmixedsys) = {
.name = "mt8512-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt8512_apmixed_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8512_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt8512_clk_topckgen) = {
.name = "mt8512-topckgen",
.id = UCLASS_CLK,
.of_match = mt8512_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8512_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen_cg) = {
+U_BOOT_DRIVER(mt8512_clk_topckgen_cg) = {
.name = "mt8512-topckgen-cg",
.id = UCLASS_CLK,
.of_match = mt8512_topckgen_cg_compat,
@@ -880,7 +894,7 @@ U_BOOT_DRIVER(mtk_clk_topckgen_cg) = {
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_infracfg) = {
+U_BOOT_DRIVER(mt8512_clk_infracfg) = {
.name = "mt8512-infracfg",
.id = UCLASS_CLK,
.of_match = mt8512_infracfg_compat,
diff --git a/drivers/clk/mediatek/clk-mt8516.c b/drivers/clk/mediatek/clk-mt8516.c
index 1070dd1551b..9c510005b42 100644
--- a/drivers/clk/mediatek/clk-mt8516.c
+++ b/drivers/clk/mediatek/clk-mt8516.c
@@ -744,30 +744,42 @@ static const struct mtk_gate top_clks[] = {
GATE_TOP5(CLK_TOP_APLL12_DIV6, CLK_TOP_APLL12_CK_DIV6, 8),
};
-static const struct mtk_clk_tree mt8516_clk_tree = {
+static const struct mtk_clk_tree mt8516_apmixed_clk_tree = {
.pll_parent = EXT_PARENT(CLK_PAD_CLK26M),
.ext_clk_rates = ext_clock_rates,
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
+ .plls = apmixed_plls,
+ .num_plls = ARRAY_SIZE(apmixed_plls),
+ .type = MTK_CLK_TREE_APMIXED,
+};
+
+static const struct mtk_clk_tree mt8516_topckgen_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
.fdivs_offs = CLK_TOP_DMPLL,
.muxes_offs = CLK_TOP_UART0_SEL,
- .plls = apmixed_plls,
.fclks = top_fixed_clks,
.fdivs = top_fixed_divs,
.muxes = top_muxes,
- .num_plls = ARRAY_SIZE(apmixed_plls),
.num_fclks = ARRAY_SIZE(top_fixed_clks),
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
+ .type = MTK_CLK_TREE_TOPCKGEN,
+};
+
+static const struct mtk_clk_tree mt8516_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static int mt8516_apmixedsys_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt8516_clk_tree);
+ return mtk_common_clk_init(dev, &mt8516_apmixed_clk_tree);
}
static int mt8516_topckgen_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt8516_clk_tree);
+ return mtk_common_clk_init(dev, &mt8516_topckgen_clk_tree);
}
static int mt8516_topckgen_cg_probe(struct udevice *dev)
@@ -791,27 +803,29 @@ static const struct udevice_id mt8516_topckgen_cg_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt8516_clk_apmixedsys) = {
.name = "mt8516-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt8516_apmixed_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8516_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt8516_clk_topckgen) = {
.name = "mt8516-topckgen",
.id = UCLASS_CLK,
.of_match = mt8516_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8516_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen_cg) = {
+U_BOOT_DRIVER(mt8516_clk_topckgen_cg) = {
.name = "mt8516-topckgen-cg",
.id = UCLASS_CLK,
.of_match = mt8516_topckgen_cg_compat,
diff --git a/drivers/clk/mediatek/clk-mt8518.c b/drivers/clk/mediatek/clk-mt8518.c
index 2b213e720a0..1033ecae187 100644
--- a/drivers/clk/mediatek/clk-mt8518.c
+++ b/drivers/clk/mediatek/clk-mt8518.c
@@ -1500,30 +1500,42 @@ static const struct mtk_gate top_clks[] = {
GATE_TOP7(CLK_TOP_DISP_DPI, CLK_TOP_DISP_DPI_CK_SEL, 0),
};
-static const struct mtk_clk_tree mt8518_clk_tree = {
+static const struct mtk_clk_tree mt8518_apmixed_clk_tree = {
.pll_parent = EXT_PARENT(CLK_PAD_CLK26M),
.ext_clk_rates = ext_clock_rates,
.num_ext_clks = ARRAY_SIZE(ext_clock_rates),
+ .plls = apmixed_plls,
+ .num_plls = ARRAY_SIZE(apmixed_plls),
+ .type = MTK_CLK_TREE_APMIXED,
+};
+
+static const struct mtk_clk_tree mt8518_topckgen_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
.fdivs_offs = CLK_TOP_DMPLL,
.muxes_offs = CLK_TOP_UART0_SEL,
- .plls = apmixed_plls,
.fclks = top_fixed_clks,
.fdivs = top_fixed_divs,
.muxes = top_muxes,
- .num_plls = ARRAY_SIZE(apmixed_plls),
.num_fclks = ARRAY_SIZE(top_fixed_clks),
.num_fdivs = ARRAY_SIZE(top_fixed_divs),
.num_muxes = ARRAY_SIZE(top_muxes),
+ .type = MTK_CLK_TREE_TOPCKGEN,
+};
+
+static const struct mtk_clk_tree mt8518_clk_tree = {
+ .ext_clk_rates = ext_clock_rates,
+ .num_ext_clks = ARRAY_SIZE(ext_clock_rates),
};
static int mt8518_apmixedsys_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt8518_clk_tree);
+ return mtk_common_clk_init(dev, &mt8518_apmixed_clk_tree);
}
static int mt8518_topckgen_probe(struct udevice *dev)
{
- return mtk_common_clk_init(dev, &mt8518_clk_tree);
+ return mtk_common_clk_init(dev, &mt8518_topckgen_clk_tree);
}
static int mt8518_topckgen_cg_probe(struct udevice *dev)
@@ -1547,27 +1559,29 @@ static const struct udevice_id mt8518_topckgen_cg_compat[] = {
{ }
};
-U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
+U_BOOT_DRIVER(mt8518_clk_apmixedsys) = {
.name = "mt8518-apmixedsys",
.id = UCLASS_CLK,
.of_match = mt8518_apmixed_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8518_apmixedsys_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_apmixedsys_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen) = {
+U_BOOT_DRIVER(mt8518_clk_topckgen) = {
.name = "mt8518-topckgen",
.id = UCLASS_CLK,
.of_match = mt8518_topckgen_compat,
+ .bind = mtk_common_clk_parent_bind,
.probe = mt8518_topckgen_probe,
.priv_auto = sizeof(struct mtk_clk_priv),
.ops = &mtk_clk_topckgen_ops,
.flags = DM_FLAG_PRE_RELOC,
};
-U_BOOT_DRIVER(mtk_clk_topckgen_cg) = {
+U_BOOT_DRIVER(mt8518_clk_topckgen_cg) = {
.name = "mt8518-topckgen-cg",
.id = UCLASS_CLK,
.of_match = mt8518_topckgen_cg_compat,
diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
index 9d0a6cd79cf..61d718f162d 100644
--- a/drivers/clk/mediatek/clk-mtk.c
+++ b/drivers/clk/mediatek/clk-mtk.c
@@ -34,6 +34,54 @@
#define SCP_AXICK_DCM_DIS_EN BIT(0)
#define SCP_AXICK_26M_SEL_EN BIT(4)
+static struct udevice *mtk_clk_providers[MTK_CLK_TREE_NUM_TYPES];
+
+static bool mtk_clk_tree_type_is_provider(enum mtk_clk_tree_type type)
+{
+ return type != MTK_CLK_TREE_NONE && type < MTK_CLK_TREE_NUM_TYPES;
+}
+
+static enum mtk_clk_tree_type mtk_clk_tree_type_from_parent_flags(u16 flags)
+{
+ switch (flags & CLK_PARENT_MASK) {
+ case CLK_PARENT_APMIXED:
+ return MTK_CLK_TREE_APMIXED;
+ case CLK_PARENT_TOPCKGEN:
+ return MTK_CLK_TREE_TOPCKGEN;
+ case CLK_PARENT_INFRASYS:
+ return MTK_CLK_TREE_INFRASYS;
+ default:
+ return MTK_CLK_TREE_NONE;
+ }
+}
+
+static struct udevice *mtk_clk_tree_get_provider(enum mtk_clk_tree_type type)
+{
+ if (!mtk_clk_tree_type_is_provider(type))
+ return NULL;
+
+ return mtk_clk_providers[type] ?: ERR_PTR(-ENOENT);
+}
+
+static struct udevice *mtk_clk_parent_get_provider(u16 flags)
+{
+ return mtk_clk_tree_get_provider(mtk_clk_tree_type_from_parent_flags(flags));
+}
+
+static int mtk_clk_tree_register_provider(struct udevice *dev,
+ const struct mtk_clk_tree *tree)
+{
+ if (!mtk_clk_tree_type_is_provider(tree->type))
+ return 0;
+
+ if (mtk_clk_providers[tree->type])
+ return -EEXIST;
+
+ mtk_clk_providers[tree->type] = dev;
+
+ return 0;
+}
+
/* shared functions */
static const int mtk_common_clk_of_xlate(struct clk *clk,
@@ -207,50 +255,16 @@ static ulong mtk_clk_find_parent_rate(struct clk *clk, int id,
static ulong mtk_find_parent_rate(struct mtk_clk_priv *priv, struct clk *clk,
const int parent, u16 flags)
{
- struct udevice *parent_dev;
-
- switch (flags & CLK_PARENT_MASK) {
- case CLK_PARENT_APMIXED:
- /* APMIXEDSYS can be parent or grandparent. */
- if (dev_get_driver_ops(clk->dev) == &mtk_clk_apmixedsys_ops ||
- dev_get_driver_ops(clk->dev) == &mtk_clk_fixed_pll_ops) {
- parent_dev = clk->dev;
- } else if (dev_get_driver_ops(priv->parent) == &mtk_clk_apmixedsys_ops ||
- dev_get_driver_ops(priv->parent) == &mtk_clk_fixed_pll_ops) {
- parent_dev = priv->parent;
- } else {
- struct udevice *grandparent_dev = dev_get_parent(priv->parent);
+ struct udevice *pdev;
- if (dev_get_driver_ops(grandparent_dev) == &mtk_clk_apmixedsys_ops ||
- dev_get_driver_ops(grandparent_dev) == &mtk_clk_fixed_pll_ops)
- parent_dev = grandparent_dev;
- else
- return -EINVAL;
- }
- break;
- case CLK_PARENT_TOPCKGEN:
- if (dev_get_driver_ops(clk->dev) == &mtk_clk_topckgen_ops)
- parent_dev = clk->dev;
- else if (dev_get_driver_ops(priv->parent) == &mtk_clk_topckgen_ops)
- parent_dev = priv->parent;
- else
- return -EINVAL;
-
- break;
- case CLK_PARENT_INFRASYS:
- if (dev_get_driver_ops(clk->dev) != &mtk_clk_infrasys_ops)
- return -EINVAL;
-
- parent_dev = clk->dev;
- break;
- case CLK_PARENT_EXT:
+ if ((flags & CLK_PARENT_MASK) == CLK_PARENT_EXT)
return mtk_ext_clock_get_rate(priv->tree, parent);
- default:
- parent_dev = NULL;
- break;
- }
- return mtk_clk_find_parent_rate(clk, parent, parent_dev);
+ pdev = mtk_clk_parent_get_provider(flags);
+ if (IS_ERR(pdev))
+ return PTR_ERR(pdev);
+
+ return mtk_clk_find_parent_rate(clk, parent, pdev);
}
static ulong mtk_clk_mux_get_rate(struct clk *clk, u32 off)
@@ -306,11 +320,6 @@ static int mtk_clk_mux_set_parent(void __iomem *base, u32 parent,
}
#if CONFIG_IS_ENABLED(CMD_CLK)
-static void mtk_clk_print_dev_parent(struct udevice *parent)
-{
- printf("Parent device: %s %s\n", parent->driver->name, parent->name);
-}
-
static void mtk_clk_print_mapped_id(int unmapped_id, int mapped_id, bool has_map)
{
/*
@@ -663,8 +672,6 @@ static void mtk_apmixedsys_dump(struct udevice *dev)
const struct mtk_clk_tree *tree = priv->tree;
u32 i;
- mtk_clk_print_dev_parent(priv->parent);
-
for (i = 0; i < tree->num_plls; i++) {
const struct mtk_pll_data *pll = &tree->plls[i];
@@ -869,8 +876,6 @@ static void mtk_topckgen_dump(struct udevice *dev)
const struct mtk_clk_tree *tree = priv->tree;
u32 i;
- mtk_clk_print_dev_parent(priv->parent);
-
for (i = 0; i < tree->num_fclks; i++) {
const struct mtk_fixed_clk *fclk = &tree->fclks[i];
@@ -1005,8 +1010,6 @@ static void mtk_infrasys_dump(struct udevice *dev)
const struct mtk_clk_tree *tree = priv->tree;
u32 i;
- mtk_clk_print_dev_parent(priv->parent);
-
for (i = 0; i < tree->num_fdivs; i++) {
const struct mtk_fixed_factor *fdiv = &tree->fdivs[i];
@@ -1083,29 +1086,22 @@ static int mtk_clk_gate_disable(struct clk *clk)
static ulong mtk_clk_gate_get_rate(struct clk *clk)
{
struct mtk_cg_priv *priv = dev_get_priv(clk->dev);
- struct udevice *parent = priv->parent;
const struct mtk_gate *gate;
+ struct udevice *pdev;
if (clk->id < priv->gates_offs)
return -EINVAL;
gate = &priv->gates[clk->id - priv->gates_offs];
- /*
- * With requesting a TOPCKGEN parent, make sure the dev parent
- * is actually topckgen. This might not be the case for an
- * infracfg-ao implementation where:
- * parent = infracfg
- * parent->parent = topckgen
- */
- if (gate->flags & CLK_PARENT_TOPCKGEN &&
- parent->driver != DM_DRIVER_GET(mtk_clk_topckgen)) {
- priv = dev_get_priv(parent);
- parent = priv->parent;
- } else if (gate->flags & CLK_PARENT_EXT) {
+
+ if (gate->flags & CLK_PARENT_EXT)
return mtk_ext_clock_get_rate(priv->tree, gate->parent);
- }
- return mtk_clk_find_parent_rate(clk, gate->parent, parent);
+ pdev = mtk_clk_parent_get_provider(gate->flags);
+ if (IS_ERR(pdev))
+ return -ENOENT;
+
+ return mtk_clk_find_parent_rate(clk, gate->parent, pdev);
}
#if CONFIG_IS_ENABLED(CMD_CLK)
@@ -1115,8 +1111,6 @@ static void mtk_clk_gate_dump(struct udevice *dev)
const struct mtk_clk_tree *tree = priv->tree;
u32 i;
- mtk_clk_print_dev_parent(priv->parent);
-
for (i = 0; i < priv->num_gates; i++) {
const struct mtk_gate *gate = &priv->gates[i];
@@ -1182,43 +1176,28 @@ const struct clk_ops mtk_clk_gate_ops = {
#endif
};
-static int mtk_common_clk_init_drv(struct udevice *dev,
- const struct mtk_clk_tree *tree,
- const struct driver *drv)
+int mtk_common_clk_parent_bind(struct udevice *dev)
+{
+ /*
+ * Clock trees that provide parent clocks need to be probed right away
+ * so that any clock depending on them will work correctly.
+ */
+ dev_or_flags(dev, DM_FLAG_PROBE_AFTER_BIND);
+
+ return 0;
+}
+
+int mtk_common_clk_init(struct udevice *dev, const struct mtk_clk_tree *tree)
{
struct mtk_clk_priv *priv = dev_get_priv(dev);
- struct udevice *parent;
- int ret;
priv->base = dev_read_addr_ptr(dev);
if (!priv->base)
return -ENOENT;
- ret = uclass_get_device_by_phandle(UCLASS_CLK, dev, "clock-parent", &parent);
- if (ret || !parent) {
- ret = uclass_get_device_by_driver(UCLASS_CLK, drv, &parent);
- if (ret || !parent)
- return -ENOENT;
- }
-
- priv->parent = parent;
priv->tree = tree;
- return 0;
-}
-
-int mtk_common_clk_init(struct udevice *dev,
- const struct mtk_clk_tree *tree)
-{
- return mtk_common_clk_init_drv(dev, tree,
- DM_DRIVER_GET(mtk_clk_apmixedsys));
-}
-
-int mtk_common_clk_infrasys_init(struct udevice *dev,
- const struct mtk_clk_tree *tree)
-{
- return mtk_common_clk_init_drv(dev, tree,
- DM_DRIVER_GET(mtk_clk_topckgen));
+ return mtk_clk_tree_register_provider(dev, tree);
}
int mtk_common_clk_gate_init(struct udevice *dev,
@@ -1227,22 +1206,11 @@ int mtk_common_clk_gate_init(struct udevice *dev,
int gates_offs)
{
struct mtk_cg_priv *priv = dev_get_priv(dev);
- struct udevice *parent;
- int ret;
priv->base = dev_read_addr_ptr(dev);
if (!priv->base)
return -ENOENT;
- ret = uclass_get_device_by_phandle(UCLASS_CLK, dev, "clock-parent", &parent);
- if (ret || !parent) {
- ret = uclass_get_device_by_driver(UCLASS_CLK,
- DM_DRIVER_GET(mtk_clk_topckgen), &parent);
- if (ret || !parent)
- return -ENOENT;
- }
-
- priv->parent = parent;
priv->tree = tree;
priv->gates = gates;
priv->num_gates = num_gates;
diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h
index b39a62edc43..437797dd0df 100644
--- a/drivers/clk/mediatek/clk-mtk.h
+++ b/drivers/clk/mediatek/clk-mtk.h
@@ -32,6 +32,15 @@
#define ETHSYS_HIFSYS_RST_CTRL_OFS 0x34
+/* These get matched to CLK_PARENT_* when looking up parent clocks. */
+enum mtk_clk_tree_type {
+ MTK_CLK_TREE_NONE,
+ MTK_CLK_TREE_APMIXED,
+ MTK_CLK_TREE_TOPCKGEN,
+ MTK_CLK_TREE_INFRASYS,
+ MTK_CLK_TREE_NUM_TYPES
+};
+
/* struct mtk_pll_data - hardware-specific PLLs data */
struct mtk_pll_data {
/* unmapped ID of clock */
@@ -261,16 +270,21 @@ struct mtk_clk_tree {
const int num_muxes;
const int num_gates;
u32 flags;
+ /*
+ * Set this if this tree provides a specific type for parent lookup.
+ * Devices that set this should also include mtk_common_clk_parent_bind()
+ * in the driver bind function to ensure that it will be registered as
+ * a provider.
+ */
+ enum mtk_clk_tree_type type;
};
struct mtk_clk_priv {
- struct udevice *parent;
void __iomem *base;
const struct mtk_clk_tree *tree;
};
struct mtk_cg_priv {
- struct udevice *parent;
void __iomem *base;
const struct mtk_clk_tree *tree;
const struct mtk_gate *gates;
@@ -284,10 +298,9 @@ extern const struct clk_ops mtk_clk_topckgen_ops;
extern const struct clk_ops mtk_clk_infrasys_ops;
extern const struct clk_ops mtk_clk_gate_ops;
+int mtk_common_clk_parent_bind(struct udevice *dev);
int mtk_common_clk_init(struct udevice *dev,
const struct mtk_clk_tree *tree);
-int mtk_common_clk_infrasys_init(struct udevice *dev,
- const struct mtk_clk_tree *tree);
int mtk_common_clk_gate_init(struct udevice *dev,
const struct mtk_clk_tree *tree,
const struct mtk_gate *gates, int num_gates,
diff --git a/drivers/power/domain/Kconfig b/drivers/power/domain/Kconfig
index bb9c52155d2..12b0e2c9914 100644
--- a/drivers/power/domain/Kconfig
+++ b/drivers/power/domain/Kconfig
@@ -9,6 +9,14 @@ config POWER_DOMAIN
domains). This may be used to save power. This API provides the
means to control such power management hardware.
+config AGILEX5_PMGR_POWER_DOMAIN
+ bool "Enable the Agilex5 PMGR power domain driver"
+ depends on SPL_POWER_DOMAIN && ARCH_SOCFPGA_SOC64
+ help
+ Enable support for power gating peripherals' SRAM specified in
+ the handoff data values obtained from the bitstream to reduce
+ power consumption.
+
config APPLE_PMGR_POWER_DOMAIN
bool "Enable the Apple PMGR power domain driver"
depends on POWER_DOMAIN
@@ -18,14 +26,6 @@ config APPLE_PMGR_POWER_DOMAIN
This driver is needed to power on parts of the SoC that have
not been powered on by previous boot stages.
-config AGILEX5_PMGR_POWER_DOMAIN
- bool "Enable the Agilex5 PMGR power domain driver"
- depends on SPL_POWER_DOMAIN && ARCH_SOCFPGA_SOC64
- help
- Enable support for power gating peripherals' SRAM specified in
- the handoff data values obtained from the bitstream to reduce
- power consumption.
-
config BCM6328_POWER_DOMAIN
bool "Enable the BCM6328 power domain driver"
depends on POWER_DOMAIN && ARCH_BMIPS
@@ -62,12 +62,12 @@ config IMX8MP_MEDIAMIX_BLKCTRL
help
Enable support for manipulating NXP i.MX8MP on-SoC MEDIAMIX block controller.
-config MTK_POWER_DOMAIN
- bool "Enable the MediaTek power domain driver"
- depends on POWER_DOMAIN && ARCH_MEDIATEK
+config MESON_EE_POWER_DOMAIN
+ bool "Enable Amlogic Everything-Else power domain driver"
+ depends on POWER_DOMAIN && ARCH_MESON
help
- Enable support for manipulating MediaTek power domains via MMIO
- mapped registers.
+ Enable support for manipulating Amlogic Meson Everything-Else power
+ domains.
config MESON_GX_VPU_POWER_DOMAIN
bool "Enable Amlogic Meson GX VPU power domain driver"
@@ -76,13 +76,6 @@ config MESON_GX_VPU_POWER_DOMAIN
Enable support for manipulating Amlogic Meson GX Video Processing
Unit power domain.
-config MESON_EE_POWER_DOMAIN
- bool "Enable Amlogic Everything-Else power domain driver"
- depends on POWER_DOMAIN && ARCH_MESON
- help
- Enable support for manipulating Amlogic Meson Everything-Else power
- domains.
-
config MESON_SECURE_POWER_DOMAIN
bool "Enable Amlogic Secure power domain driver"
depends on POWER_DOMAIN && ARCH_MESON && MESON_A1
@@ -90,6 +83,40 @@ config MESON_SECURE_POWER_DOMAIN
Enable support for manipulating Amlogic Meson Secure power domains.
Support for Amlogic A1 series.
+config MT2701_POWER_DOMAIN
+ bool "Enable the MediaTek power domain driver for MT2701 compatible SoC"
+ depends on POWER_DOMAIN && ARCH_MEDIATEK
+ select MTK_POWER_DOMAIN
+ help
+ Enable support for manipulating MediaTek power domains via MMIO
+ mapped registers for MT2701 compatible SoC. The driver powers
+ the SoC power domains on and off and handles the associated bus
+ protection bits. It is also used on MT7623.
+
+config MT7622_POWER_DOMAIN
+ bool "Enable the MediaTek power domain driver for MT7622 compatible SoC"
+ depends on POWER_DOMAIN && ARCH_MEDIATEK
+ select MTK_POWER_DOMAIN
+ help
+ Enable support for manipulating MediaTek power domains via MMIO
+ mapped registers for MT7622 compatible SoC. The driver powers
+ the SoC power domains on and off and handles the associated bus
+ protection bits. It is also used on MT7629.
+
+config MT8188_POWER_DOMAIN
+ bool "Enable the MediaTek power domain driver for MT8188 compatible SoC"
+ depends on POWER_DOMAIN && ARCH_MEDIATEK
+ select MTK_POWER_DOMAIN
+ help
+ Enable support for manipulating MediaTek power domains via MMIO
+ mapped registers for MT8188 compatible SoC. The driver powers
+ the SoC power domains on and off and handles the associated bus
+ protection steps, per-domain clocks and parent domains.
+
+config MTK_POWER_DOMAIN
+ bool
+ depends on POWER_DOMAIN && ARCH_MEDIATEK
+
config QCOM_RPMH_POWER_DOMAIN
bool "Enable the QCOM RPMH Power domain driver"
depends on POWER_DOMAIN && ARCH_SNAPDRAGON
@@ -128,12 +155,13 @@ config TEGRA186_POWER_DOMAIN
Enable support for manipulating Tegra's on-SoC power domains via IPC
requests to the BPMP (Boot and Power Management Processor).
-config TI_SCI_POWER_DOMAIN
- bool "Enable the TI SCI-based power domain driver"
- depends on POWER_DOMAIN && TI_SCI_PROTOCOL
+config TI_OMAP_PRM_POWER_DOMAIN
+ bool "Enable the TI OMAP PRM power domain driver"
+ depends on POWER_DOMAIN && ARCH_OMAP2PLUS
help
- Generic power domain implementation for TI devices implementing the
- TI SCI protocol.
+ Enable support for TI OMAP Power and Reset Manager (PRM) power domains.
+ The driver is currently a stub to be able to probe devices that
+ require this type of power domain device.
config TI_POWER_DOMAIN
bool "Enable the TI K3 Power domain driver"
@@ -141,13 +169,12 @@ config TI_POWER_DOMAIN
help
Generic power domain implementation for TI K3 devices.
-config TI_OMAP_PRM_POWER_DOMAIN
- bool "Enable the TI OMAP PRM power domain driver"
- depends on POWER_DOMAIN && ARCH_OMAP2PLUS
+config TI_SCI_POWER_DOMAIN
+ bool "Enable the TI SCI-based power domain driver"
+ depends on POWER_DOMAIN && TI_SCI_PROTOCOL
help
- Enable support for TI OMAP Power and Reset Manager (PRM) power domains.
- The driver is currently a stub to be able to probe devices that
- require this type of power domain device.
+ Generic power domain implementation for TI devices implementing the
+ TI SCI protocol.
config ZYNQMP_POWER_DOMAIN
bool "Enable the Xilinx ZynqMP Power domain driver"
diff --git a/drivers/power/domain/Makefile b/drivers/power/domain/Makefile
index 110153d5cf8..e6fe71c374a 100644
--- a/drivers/power/domain/Makefile
+++ b/drivers/power/domain/Makefile
@@ -4,24 +4,27 @@
#
obj-$(CONFIG_$(PHASE_)POWER_DOMAIN) += power-domain-uclass.o
-obj-$(CONFIG_APPLE_PMGR_POWER_DOMAIN) += apple-pmgr.o
obj-$(CONFIG_AGILEX5_PMGR_POWER_DOMAIN) += altr-pmgr-agilex5.o
+obj-$(CONFIG_APPLE_PMGR_POWER_DOMAIN) += apple-pmgr.o
obj-$(CONFIG_BCM6328_POWER_DOMAIN) += bcm6328-power-domain.o
obj-$(CONFIG_IMX8_POWER_DOMAIN) += imx8-power-domain-legacy.o imx8-power-domain.o
obj-$(CONFIG_IMX8M_POWER_DOMAIN) += imx8m-power-domain.o
obj-$(CONFIG_IMX8MP_HSIOMIX_BLKCTRL) += imx8mp-hsiomix.o
obj-$(CONFIG_IMX8MP_MEDIAMIX_BLKCTRL) += imx8mp-mediamix.o
-obj-$(CONFIG_MTK_POWER_DOMAIN) += mtk-power-domain.o
-obj-$(CONFIG_MESON_GX_VPU_POWER_DOMAIN) += meson-gx-pwrc-vpu.o
obj-$(CONFIG_MESON_EE_POWER_DOMAIN) += meson-ee-pwrc.o
+obj-$(CONFIG_MESON_GX_VPU_POWER_DOMAIN) += meson-gx-pwrc-vpu.o
obj-$(CONFIG_MESON_SECURE_POWER_DOMAIN) += meson-secure-pwrc.o
+obj-$(CONFIG_MT2701_POWER_DOMAIN) += mt2701-power-domain.o
+obj-$(CONFIG_MT7622_POWER_DOMAIN) += mt7622-power-domain.o
+obj-$(CONFIG_MT8188_POWER_DOMAIN) += mt8188-power-domain.o
+obj-$(CONFIG_MTK_POWER_DOMAIN) += mtk-power-domain.o
+obj-$(CONFIG_QCOM_RPMH_POWER_DOMAIN) += qcom-rpmhpd.o
obj-$(CONFIG_RENESAS_R8A78000_POWER_DOMAIN) += renesas-r8a78000-power-domain.o
obj-$(CONFIG_SANDBOX_POWER_DOMAIN) += sandbox-power-domain.o
obj-$(CONFIG_SANDBOX_POWER_DOMAIN) += sandbox-power-domain-test.o
obj-$(CONFIG_SCMI_POWER_DOMAIN) += scmi-power-domain.o
obj-$(CONFIG_TEGRA186_POWER_DOMAIN) += tegra186-power-domain.o
-obj-$(CONFIG_TI_SCI_POWER_DOMAIN) += ti-sci-power-domain.o
-obj-$(CONFIG_TI_POWER_DOMAIN) += ti-power-domain.o
obj-$(CONFIG_TI_OMAP_PRM_POWER_DOMAIN) += ti-omap-prm.o
+obj-$(CONFIG_TI_POWER_DOMAIN) += ti-power-domain.o
+obj-$(CONFIG_TI_SCI_POWER_DOMAIN) += ti-sci-power-domain.o
obj-$(CONFIG_ZYNQMP_POWER_DOMAIN) += zynqmp-power-domain.o
-obj-$(CONFIG_QCOM_RPMH_POWER_DOMAIN) += qcom-rpmhpd.o
diff --git a/drivers/power/domain/mt2701-power-domain.c b/drivers/power/domain/mt2701-power-domain.c
new file mode 100644
index 00000000000..5bef4aa97ea
--- /dev/null
+++ b/drivers/power/domain/mt2701-power-domain.c
@@ -0,0 +1,89 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 MediaTek Inc.
+ * Copyright (C) 2026 BayLibre, SAS
+ * Author: Ryder Lee <[email protected]>
+ * Julien Stephan <[email protected]>
+ */
+
+#include <dm.h>
+#include <dt-bindings/power/mt2701-power.h>
+#include <linux/bitops.h>
+
+#include "mtk-power-domain.h"
+
+static const struct mtk_scp_domain_data mt2701_scp_domain[] = {
+ [MT2701_POWER_DOMAIN_CONN] = {
+ .sta_mask = PWR_STATUS_CONN,
+ .ctl_offs = SPM_CONN_PWR_CON,
+ .bus_prot_mask = BIT(8) | BIT(2),
+ },
+ [MT2701_POWER_DOMAIN_DISP] = {
+ .sta_mask = PWR_STATUS_DISP,
+ .ctl_offs = SPM_DIS_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .bus_prot_mask = BIT(2),
+ },
+ [MT2701_POWER_DOMAIN_MFG] = {
+ .sta_mask = PWR_STATUS_MFG,
+ .ctl_offs = SPM_MFG_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ },
+ [MT2701_POWER_DOMAIN_VDEC] = {
+ .sta_mask = PWR_STATUS_VDEC,
+ .ctl_offs = SPM_VDE_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ },
+ [MT2701_POWER_DOMAIN_ISP] = {
+ .sta_mask = PWR_STATUS_ISP,
+ .ctl_offs = SPM_ISP_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(13, 12),
+ },
+ [MT2701_POWER_DOMAIN_BDP] = {
+ .sta_mask = PWR_STATUS_BDP,
+ .ctl_offs = SPM_BDP_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ },
+ [MT2701_POWER_DOMAIN_ETH] = {
+ .sta_mask = PWR_STATUS_ETH,
+ .ctl_offs = SPM_ETH_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(15, 12),
+ },
+ [MT2701_POWER_DOMAIN_HIF] = {
+ .sta_mask = PWR_STATUS_HIF,
+ .ctl_offs = SPM_HIF_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(15, 12),
+ },
+ [MT2701_POWER_DOMAIN_IFR_MSC] = {
+ .sta_mask = PWR_STATUS_IFR_MSC,
+ .ctl_offs = SPM_IFR_MSC_PWR_CON,
+ },
+};
+
+MTK_SCP_SOC_DATA(mt2701, mt2701_scp_domain);
+
+static const struct udevice_id mt2701_power_domain_ids[] = {
+ {
+ .compatible = "mediatek,mt2701-scpsys",
+ .data = (ulong)&mt2701_scp_soc_data,
+ },
+ {
+ .compatible = "mediatek,mt7623-scpsys",
+ .data = (ulong)&mt2701_scp_soc_data,
+ },
+ { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(mt2701_power_domain) = {
+ .name = "mt2701_power_domain",
+ .id = UCLASS_POWER_DOMAIN,
+ .ops = &mtk_power_domain_ops,
+ .probe = mtk_scpsys_probe,
+ .of_match = mt2701_power_domain_ids,
+ .priv_auto = sizeof(struct mtk_scpsys),
+};
diff --git a/drivers/power/domain/mt7622-power-domain.c b/drivers/power/domain/mt7622-power-domain.c
new file mode 100644
index 00000000000..13f2154e145
--- /dev/null
+++ b/drivers/power/domain/mt7622-power-domain.c
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 MediaTek Inc.
+ * Copyright (C) 2026 BayLibre, SAS
+ * Author: Ryder Lee <[email protected]>
+ * Julien Stephan <[email protected]>
+ */
+
+#include <dm.h>
+#include <dt-bindings/power/mt7622-power.h>
+#include <linux/bitops.h>
+
+#include "mtk-power-domain.h"
+
+static const struct mtk_scp_domain_data mt7622_scp_domain[] = {
+ [MT7622_POWER_DOMAIN_ETHSYS] = {
+ .sta_mask = PWR_STATUS_ETHSYS,
+ .ctl_offs = SPM_ETHSYS_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(15, 12),
+ .bus_prot_mask = (BIT(3) | BIT(17)),
+ },
+ [MT7622_POWER_DOMAIN_HIF0] = {
+ .sta_mask = PWR_STATUS_HIF0,
+ .ctl_offs = SPM_HIF0_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(15, 12),
+ .bus_prot_mask = GENMASK(25, 24),
+ },
+ [MT7622_POWER_DOMAIN_HIF1] = {
+ .sta_mask = PWR_STATUS_HIF1,
+ .ctl_offs = SPM_HIF1_PWR_CON,
+ .sram_pdn_bits = GENMASK(11, 8),
+ .sram_pdn_ack_bits = GENMASK(15, 12),
+ .bus_prot_mask = GENMASK(28, 26),
+ },
+};
+
+MTK_SCP_SOC_DATA(mt7622, mt7622_scp_domain);
+
+static const struct udevice_id mt7622_power_domain_ids[] = {
+ {
+ .compatible = "mediatek,mt7622-scpsys",
+ .data = (ulong)&mt7622_scp_soc_data,
+ },
+ { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(mt7622_power_domain) = {
+ .name = "mt7622_power_domain",
+ .id = UCLASS_POWER_DOMAIN,
+ .ops = &mtk_power_domain_ops,
+ .probe = mtk_scpsys_probe,
+ .of_match = mt7622_power_domain_ids,
+ .priv_auto = sizeof(struct mtk_scpsys),
+};
diff --git a/drivers/power/domain/mt8188-power-domain.c b/drivers/power/domain/mt8188-power-domain.c
new file mode 100644
index 00000000000..265d222f17a
--- /dev/null
+++ b/drivers/power/domain/mt8188-power-domain.c
@@ -0,0 +1,665 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2026 MediaTek Inc.
+ * Copyright (C) 2026 BayLibre, SAS.
+ * Authors: Chris-QJ Chen <[email protected]>
+ * Julien Stephan <[email protected]>
+ */
+
+#include <dm.h>
+#include <dt-bindings/power/mediatek,mt8188-power.h>
+#include <linux/bitops.h>
+
+#include "mtk-power-domain.h"
+
+/* Infra bus protection register offsets */
+#define MT8188_TOP_AXI_PROT_EN_SET 0x2A0
+#define MT8188_TOP_AXI_PROT_EN_CLR 0x2A4
+#define MT8188_TOP_AXI_PROT_EN_STA 0x228
+#define MT8188_TOP_AXI_PROT_EN_1_SET 0x2A8
+#define MT8188_TOP_AXI_PROT_EN_1_CLR 0x2AC
+#define MT8188_TOP_AXI_PROT_EN_1_STA 0x258
+#define MT8188_TOP_AXI_PROT_EN_2_SET 0x714
+#define MT8188_TOP_AXI_PROT_EN_2_CLR 0x718
+#define MT8188_TOP_AXI_PROT_EN_2_STA 0x724
+#define MT8188_TOP_AXI_PROT_EN_MM_SET 0x2D4
+#define MT8188_TOP_AXI_PROT_EN_MM_CLR 0x2D8
+#define MT8188_TOP_AXI_PROT_EN_MM_STA 0x2EC
+#define MT8188_TOP_AXI_PROT_EN_MM_2_SET 0xDCC
+#define MT8188_TOP_AXI_PROT_EN_MM_2_CLR 0xDD0
+#define MT8188_TOP_AXI_PROT_EN_MM_2_STA 0xDD8
+#define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET 0xB84
+#define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR 0xB88
+#define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA 0xB90
+#define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET 0xBCC
+#define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR 0xBD0
+#define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA 0xBD8
+
+/* MFG1 bus protection bits */
+#define MT8188_TOP_AXI_PROT_EN_MFG1_STEP1 BIT(11)
+#define MT8188_TOP_AXI_PROT_EN_2_MFG1_STEP2 BIT(7)
+#define MT8188_TOP_AXI_PROT_EN_1_MFG1_STEP3 BIT(19)
+#define MT8188_TOP_AXI_PROT_EN_2_MFG1_STEP4 BIT(5)
+#define MT8188_TOP_AXI_PROT_EN_MFG1_STEP5 GENMASK(22, 21)
+#define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_MFG1_STEP6 BIT(17)
+
+/* PCIe bus protection bits */
+#define MT8188_TOP_AXI_PROT_EN_PEXTP_MAC_P0_STEP1 BIT(2)
+#define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_PEXTP_MAC_P0_STEP2 (BIT(8) | BIT(18) | BIT(30))
+
+/* Ethernet / HDMI / DP / eDP bus protection bits */
+#define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_ETHER_STEP1 BIT(24)
+#define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_HDMI_TX_STEP1 BIT(20)
+#define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_DP_TX_STEP1 BIT(23)
+#define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_EDP_TX_STEP1 BIT(22)
+
+/* ADSP bus protection bits */
+#define MT8188_TOP_AXI_PROT_EN_2_ADSP_AO_STEP1 GENMASK(31, 29)
+#define MT8188_TOP_AXI_PROT_EN_2_ADSP_AO_STEP2 (GENMASK(4, 3) | BIT(28))
+#define MT8188_TOP_AXI_PROT_EN_2_ADSP_INFRA_STEP1 (GENMASK(16, 14) | BIT(23) | BIT(27))
+#define MT8188_TOP_AXI_PROT_EN_2_ADSP_INFRA_STEP2 (GENMASK(19, 17) | GENMASK(26, 25))
+#define MT8188_TOP_AXI_PROT_EN_2_ADSP_STEP1 GENMASK(11, 8)
+#define MT8188_TOP_AXI_PROT_EN_2_ADSP_STEP2 GENMASK(22, 21)
+
+/* Audio bus protection bits */
+#define MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1 BIT(20)
+#define MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2 BIT(12)
+#define MT8188_TOP_AXI_PROT_EN_2_AUDIO_ASRC_STEP1 BIT(24)
+#define MT8188_TOP_AXI_PROT_EN_2_AUDIO_ASRC_STEP2 BIT(13)
+
+/* Video / display bus protection bits */
+#define MT8188_TOP_AXI_PROT_EN_VPPSYS0_STEP1 BIT(10)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS0_STEP2 GENMASK(9, 8)
+#define MT8188_TOP_AXI_PROT_EN_VPPSYS0_STEP3 BIT(23)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS0_STEP4 (BIT(1) | BIT(4) | BIT(11))
+#define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_VPPSYS0_STEP5 BIT(20)
+#define MT8188_TOP_AXI_PROT_EN_MM_VDOSYS0_STEP1 (GENMASK(18, 17) | GENMASK(21, 20))
+#define MT8188_TOP_AXI_PROT_EN_VDOSYS0_STEP2 BIT(6)
+#define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_VDOSYS0_STEP3 BIT(21)
+#define MT8188_TOP_AXI_PROT_EN_MM_VDOSYS1_STEP1 GENMASK(31, 30)
+#define MT8188_TOP_AXI_PROT_EN_MM_VDOSYS1_STEP2 BIT(22)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_VDOSYS1_STEP3 BIT(10)
+#define MT8188_TOP_AXI_PROT_EN_MM_VPPSYS1_STEP1 GENMASK(6, 5)
+#define MT8188_TOP_AXI_PROT_EN_MM_VPPSYS1_STEP2 BIT(23)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS1_STEP3 BIT(18)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_WPE_STEP1 BIT(23)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_WPE_STEP2 BIT(21)
+#define MT8188_TOP_AXI_PROT_EN_MM_VDEC0_STEP1 BIT(13)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_VDEC0_STEP2 BIT(13)
+#define MT8188_TOP_AXI_PROT_EN_MM_VDEC1_STEP1 BIT(14)
+#define MT8188_TOP_AXI_PROT_EN_MM_VDEC1_STEP2 BIT(29)
+#define MT8188_TOP_AXI_PROT_EN_MM_VENC_STEP1 (BIT(9) | BIT(11))
+#define MT8188_TOP_AXI_PROT_EN_MM_VENC_STEP2 BIT(26)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_VENC_STEP3 BIT(2)
+#define MT8188_TOP_AXI_PROT_EN_MM_IMG_VCORE_STEP1 (BIT(1) | BIT(3))
+#define MT8188_TOP_AXI_PROT_EN_MM_IMG_VCORE_STEP2 BIT(25)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_IMG_VCORE_STEP3 BIT(16)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_IMG_MAIN_STEP1 GENMASK(27, 26)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_IMG_MAIN_STEP2 GENMASK(25, 24)
+#define MT8188_TOP_AXI_PROT_EN_MM_CAM_VCORE_STEP1 (BIT(2) | BIT(4))
+#define MT8188_TOP_AXI_PROT_EN_2_CAM_VCORE_STEP2 BIT(0)
+#define MT8188_TOP_AXI_PROT_EN_1_CAM_VCORE_STEP3 BIT(22)
+#define MT8188_TOP_AXI_PROT_EN_MM_CAM_VCORE_STEP4 BIT(24)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_CAM_VCORE_STEP5 BIT(17)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_CAM_MAIN_STEP1 GENMASK(31, 30)
+#define MT8188_TOP_AXI_PROT_EN_2_CAM_MAIN_STEP2 BIT(2)
+#define MT8188_TOP_AXI_PROT_EN_MM_2_CAM_MAIN_STEP3 GENMASK(29, 28)
+#define MT8188_TOP_AXI_PROT_EN_2_CAM_MAIN_STEP4 BIT(1)
+
+static const struct mtk_scp_domain_data mt8188_scp_domain[] = {
+ [MT8188_POWER_DOMAIN_MFG0] = {
+ .sta_mask = BIT(1),
+ .ctl_offs = 0x300,
+ .pwr_sta_offs = 0x174,
+ .pwr_sta2nd_offs = 0x178,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ },
+ [MT8188_POWER_DOMAIN_MFG1] = {
+ .sta_mask = BIT(2),
+ .ctl_offs = 0x304,
+ .pwr_sta_offs = 0x174,
+ .pwr_sta2nd_offs = 0x178,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MFG1_STEP1,
+ MT8188_TOP_AXI_PROT_EN_SET,
+ MT8188_TOP_AXI_PROT_EN_CLR,
+ MT8188_TOP_AXI_PROT_EN_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_MFG1_STEP2,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_1_MFG1_STEP3,
+ MT8188_TOP_AXI_PROT_EN_1_SET,
+ MT8188_TOP_AXI_PROT_EN_1_CLR,
+ MT8188_TOP_AXI_PROT_EN_1_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_MFG1_STEP4,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MFG1_STEP5,
+ MT8188_TOP_AXI_PROT_EN_SET,
+ MT8188_TOP_AXI_PROT_EN_CLR,
+ MT8188_TOP_AXI_PROT_EN_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_MFG1_STEP6,
+ MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET,
+ MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR,
+ MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_MFG2] = {
+ .sta_mask = BIT(3),
+ .ctl_offs = 0x308,
+ .pwr_sta_offs = 0x174,
+ .pwr_sta2nd_offs = 0x178,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ },
+ [MT8188_POWER_DOMAIN_MFG3] = {
+ .sta_mask = BIT(4),
+ .ctl_offs = 0x30C,
+ .pwr_sta_offs = 0x174,
+ .pwr_sta2nd_offs = 0x178,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ },
+ [MT8188_POWER_DOMAIN_MFG4] = {
+ .sta_mask = BIT(5),
+ .ctl_offs = 0x310,
+ .pwr_sta_offs = 0x174,
+ .pwr_sta2nd_offs = 0x178,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ },
+ [MT8188_POWER_DOMAIN_PEXTP_MAC_P0] = {
+ .sta_mask = BIT(10),
+ .ctl_offs = 0x324,
+ .pwr_sta_offs = 0x174,
+ .pwr_sta2nd_offs = 0x178,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_PEXTP_MAC_P0_STEP1,
+ MT8188_TOP_AXI_PROT_EN_SET,
+ MT8188_TOP_AXI_PROT_EN_CLR,
+ MT8188_TOP_AXI_PROT_EN_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_PEXTP_MAC_P0_STEP2,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_PEXTP_PHY_TOP] = {
+ .sta_mask = BIT(12),
+ .ctl_offs = 0x328,
+ .pwr_sta_offs = 0x174,
+ .pwr_sta2nd_offs = 0x178,
+ },
+ [MT8188_POWER_DOMAIN_CSIRX_TOP] = {
+ .sta_mask = BIT(17),
+ .ctl_offs = 0x3C4,
+ .pwr_sta_offs = 0x174,
+ .pwr_sta2nd_offs = 0x178,
+ },
+ [MT8188_POWER_DOMAIN_ETHER] = {
+ .sta_mask = BIT(1),
+ .ctl_offs = 0x338,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_ETHER_STEP1,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_HDMI_TX] = {
+ .sta_mask = BIT(18),
+ .ctl_offs = 0x37C,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_HDMI_TX_STEP1,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_ADSP_AO] = {
+ .sta_mask = BIT(10),
+ .ctl_offs = 0x35C,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_AO_STEP1,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_AO_STEP2,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_ADSP_INFRA] = {
+ .sta_mask = BIT(9),
+ .ctl_offs = 0x358,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_INFRA_STEP1,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_INFRA_STEP2,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_ADSP] = {
+ .sta_mask = BIT(8),
+ .ctl_offs = 0x354,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_STEP1,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_STEP2,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_AUDIO] = {
+ .sta_mask = BIT(6),
+ .ctl_offs = 0x34C,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_AUDIO_ASRC] = {
+ .sta_mask = BIT(7),
+ .ctl_offs = 0x350,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_AUDIO_ASRC_STEP1,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_AUDIO_ASRC_STEP2,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_VPPSYS0] = {
+ .sta_mask = BIT(11),
+ .ctl_offs = 0x360,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_VPPSYS0_STEP1,
+ MT8188_TOP_AXI_PROT_EN_SET,
+ MT8188_TOP_AXI_PROT_EN_CLR,
+ MT8188_TOP_AXI_PROT_EN_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS0_STEP2,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_VPPSYS0_STEP3,
+ MT8188_TOP_AXI_PROT_EN_SET,
+ MT8188_TOP_AXI_PROT_EN_CLR,
+ MT8188_TOP_AXI_PROT_EN_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS0_STEP4,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_VPPSYS0_STEP5,
+ MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET,
+ MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR,
+ MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_VDOSYS0] = {
+ .sta_mask = BIT(13),
+ .ctl_offs = 0x368,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDOSYS0_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_VDOSYS0_STEP2,
+ MT8188_TOP_AXI_PROT_EN_SET,
+ MT8188_TOP_AXI_PROT_EN_CLR,
+ MT8188_TOP_AXI_PROT_EN_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_VDOSYS0_STEP3,
+ MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET,
+ MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR,
+ MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_VDOSYS1] = {
+ .sta_mask = BIT(14),
+ .ctl_offs = 0x36C,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDOSYS1_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDOSYS1_STEP2,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VDOSYS1_STEP3,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_DP_TX] = {
+ .sta_mask = BIT(16),
+ .ctl_offs = 0x374,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_DP_TX_STEP1,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_EDP_TX] = {
+ .sta_mask = BIT(17),
+ .ctl_offs = 0x378,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_EDP_TX_STEP1,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR,
+ MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_VPPSYS1] = {
+ .sta_mask = BIT(12),
+ .ctl_offs = 0x364,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VPPSYS1_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VPPSYS1_STEP2,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS1_STEP3,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_WPE] = {
+ .sta_mask = BIT(15),
+ .ctl_offs = 0x370,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_WPE_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_WPE_STEP2,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_VDEC0] = {
+ .sta_mask = BIT(19),
+ .ctl_offs = 0x380,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDEC0_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VDEC0_STEP2,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_VDEC1] = {
+ .sta_mask = BIT(20),
+ .ctl_offs = 0x384,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDEC1_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDEC1_STEP2,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_VENC] = {
+ .sta_mask = BIT(22),
+ .ctl_offs = 0x38C,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VENC_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VENC_STEP2,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VENC_STEP3,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_IMG_VCORE] = {
+ .sta_mask = BIT(28),
+ .ctl_offs = 0x3A4,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_IMG_VCORE_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_IMG_VCORE_STEP2,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_IMG_VCORE_STEP3,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_IMG_MAIN] = {
+ .sta_mask = BIT(29),
+ .ctl_offs = 0x3A8,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_IMG_MAIN_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_IMG_MAIN_STEP2,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_DIP] = {
+ .sta_mask = BIT(30),
+ .ctl_offs = 0x3AC,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ },
+ [MT8188_POWER_DOMAIN_IPE] = {
+ .sta_mask = BIT(31),
+ .ctl_offs = 0x3B0,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ },
+ [MT8188_POWER_DOMAIN_CAM_VCORE] = {
+ .sta_mask = BIT(27),
+ .ctl_offs = 0x3A0,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_CAM_VCORE_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_CAM_VCORE_STEP2,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_1_CAM_VCORE_STEP3,
+ MT8188_TOP_AXI_PROT_EN_1_SET,
+ MT8188_TOP_AXI_PROT_EN_1_CLR,
+ MT8188_TOP_AXI_PROT_EN_1_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_CAM_VCORE_STEP4,
+ MT8188_TOP_AXI_PROT_EN_MM_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_CAM_VCORE_STEP5,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_CAM_MAIN] = {
+ .sta_mask = BIT(24),
+ .ctl_offs = 0x394,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ .bp_infracfg = {
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_CAM_MAIN_STEP1,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_CAM_MAIN_STEP2,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_CAM_MAIN_STEP3,
+ MT8188_TOP_AXI_PROT_EN_MM_2_SET,
+ MT8188_TOP_AXI_PROT_EN_MM_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_MM_2_STA),
+ BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_CAM_MAIN_STEP4,
+ MT8188_TOP_AXI_PROT_EN_2_SET,
+ MT8188_TOP_AXI_PROT_EN_2_CLR,
+ MT8188_TOP_AXI_PROT_EN_2_STA),
+ },
+ },
+ [MT8188_POWER_DOMAIN_CAM_SUBA] = {
+ .sta_mask = BIT(25),
+ .ctl_offs = 0x398,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ },
+ [MT8188_POWER_DOMAIN_CAM_SUBB] = {
+ .sta_mask = BIT(26),
+ .ctl_offs = 0x39C,
+ .pwr_sta_offs = 0x16C,
+ .pwr_sta2nd_offs = 0x170,
+ .sram_pdn_bits = BIT(8),
+ .sram_pdn_ack_bits = BIT(12),
+ },
+};
+
+MTK_SCP_SOC_DATA(mt8188, mt8188_scp_domain);
+
+static const struct udevice_id mt8188_power_domain_ids[] = {
+ {
+ .compatible = "mediatek,mt8188-power-controller",
+ .data = (ulong)&mt8188_scp_soc_data,
+ },
+ { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(mt8188_power_domain) = {
+ .name = "mt8188_power_domain",
+ .id = UCLASS_POWER_DOMAIN,
+ .ops = &mtk_power_domain_ops,
+ .probe = mtk_power_controller_probe,
+ .of_match = mt8188_power_domain_ids,
+ .priv_auto = sizeof(struct mtk_scpsys),
+};
diff --git a/drivers/power/domain/mtk-power-domain.c b/drivers/power/domain/mtk-power-domain.c
index 24dd540897d..9eef58d2d57 100644
--- a/drivers/power/domain/mtk-power-domain.c
+++ b/drivers/power/domain/mtk-power-domain.c
@@ -6,161 +6,15 @@
#include <clk.h>
#include <dm.h>
-#include <malloc.h>
-#include <power-domain-uclass.h>
#include <regmap.h>
#include <syscon.h>
#include <asm/io.h>
-#include <asm/processor.h>
-#include <linux/bitops.h>
#include <linux/err.h>
#include <linux/iopoll.h>
+#include <dm/device_compat.h>
+#include <dm/devres.h>
-#include <dt-bindings/power/mt7623-power.h>
-#include <dt-bindings/power/mt7629-power.h>
-
-#define SPM_EN (0xb16 << 16 | 0x1)
-#define SPM_VDE_PWR_CON 0x0210
-#define SPM_MFG_PWR_CON 0x0214
-#define SPM_ISP_PWR_CON 0x0238
-#define SPM_DIS_PWR_CON 0x023c
-#define SPM_CONN_PWR_CON 0x0280
-#define SPM_BDP_PWR_CON 0x029c
-#define SPM_ETH_PWR_CON 0x02a0
-#define SPM_HIF_PWR_CON 0x02a4
-#define SPM_IFR_MSC_PWR_CON 0x02a8
-#define SPM_ETHSYS_PWR_CON 0x2e0
-#define SPM_HIF0_PWR_CON 0x2e4
-#define SPM_HIF1_PWR_CON 0x2e8
-#define SPM_PWR_STATUS 0x60c
-#define SPM_PWR_STATUS_2ND 0x610
-
-#define PWR_RST_B_BIT BIT(0)
-#define PWR_ISO_BIT BIT(1)
-#define PWR_ON_BIT BIT(2)
-#define PWR_ON_2ND_BIT BIT(3)
-#define PWR_CLK_DIS_BIT BIT(4)
-
-#define PWR_STATUS_CONN BIT(1)
-#define PWR_STATUS_DISP BIT(3)
-#define PWR_STATUS_MFG BIT(4)
-#define PWR_STATUS_ISP BIT(5)
-#define PWR_STATUS_VDEC BIT(7)
-#define PWR_STATUS_BDP BIT(14)
-#define PWR_STATUS_ETH BIT(15)
-#define PWR_STATUS_HIF BIT(16)
-#define PWR_STATUS_IFR_MSC BIT(17)
-#define PWR_STATUS_ETHSYS BIT(24)
-#define PWR_STATUS_HIF0 BIT(25)
-#define PWR_STATUS_HIF1 BIT(26)
-
-/* Infrasys configuration */
-#define INFRA_TOPDCM_CTRL 0x10
-#define INFRA_TOPAXI_PROT_EN 0x220
-#define INFRA_TOPAXI_PROT_STA1 0x228
-
-#define DCM_TOP_EN BIT(0)
-
-enum scp_domain_type {
- SCPSYS_MT7622,
- SCPSYS_MT7623,
- SCPSYS_MT7629,
-};
-
-struct scp_domain;
-
-struct scp_domain_data {
- struct scp_domain *scpd;
- u32 sta_mask;
- int ctl_offs;
- u32 sram_pdn_bits;
- u32 sram_pdn_ack_bits;
- u32 bus_prot_mask;
-};
-
-struct scp_domain {
- void __iomem *base;
- void __iomem *infracfg;
- enum scp_domain_type type;
- struct scp_domain_data *data;
-};
-
-static struct scp_domain_data scp_domain_mt7623[] = {
- [MT7623_POWER_DOMAIN_CONN] = {
- .sta_mask = PWR_STATUS_CONN,
- .ctl_offs = SPM_CONN_PWR_CON,
- .bus_prot_mask = BIT(8) | BIT(2),
- },
- [MT7623_POWER_DOMAIN_DISP] = {
- .sta_mask = PWR_STATUS_DISP,
- .ctl_offs = SPM_DIS_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- .bus_prot_mask = BIT(2),
- },
- [MT7623_POWER_DOMAIN_MFG] = {
- .sta_mask = PWR_STATUS_MFG,
- .ctl_offs = SPM_MFG_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- .sram_pdn_ack_bits = GENMASK(12, 12),
- },
- [MT7623_POWER_DOMAIN_VDEC] = {
- .sta_mask = PWR_STATUS_VDEC,
- .ctl_offs = SPM_VDE_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- .sram_pdn_ack_bits = GENMASK(12, 12),
- },
- [MT7623_POWER_DOMAIN_ISP] = {
- .sta_mask = PWR_STATUS_ISP,
- .ctl_offs = SPM_ISP_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- .sram_pdn_ack_bits = GENMASK(13, 12),
- },
- [MT7623_POWER_DOMAIN_BDP] = {
- .sta_mask = PWR_STATUS_BDP,
- .ctl_offs = SPM_BDP_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- },
- [MT7623_POWER_DOMAIN_ETH] = {
- .sta_mask = PWR_STATUS_ETH,
- .ctl_offs = SPM_ETH_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- .sram_pdn_ack_bits = GENMASK(15, 12),
- },
- [MT7623_POWER_DOMAIN_HIF] = {
- .sta_mask = PWR_STATUS_HIF,
- .ctl_offs = SPM_HIF_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- .sram_pdn_ack_bits = GENMASK(15, 12),
- },
- [MT7623_POWER_DOMAIN_IFR_MSC] = {
- .sta_mask = PWR_STATUS_IFR_MSC,
- .ctl_offs = SPM_IFR_MSC_PWR_CON,
- },
-};
-
-static struct scp_domain_data scp_domain_mt7629[] = {
- [MT7629_POWER_DOMAIN_ETHSYS] = {
- .sta_mask = PWR_STATUS_ETHSYS,
- .ctl_offs = SPM_ETHSYS_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- .sram_pdn_ack_bits = GENMASK(15, 12),
- .bus_prot_mask = (BIT(3) | BIT(17)),
- },
- [MT7629_POWER_DOMAIN_HIF0] = {
- .sta_mask = PWR_STATUS_HIF0,
- .ctl_offs = SPM_HIF0_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- .sram_pdn_ack_bits = GENMASK(15, 12),
- .bus_prot_mask = GENMASK(25, 24),
- },
- [MT7629_POWER_DOMAIN_HIF1] = {
- .sta_mask = PWR_STATUS_HIF1,
- .ctl_offs = SPM_HIF1_PWR_CON,
- .sram_pdn_bits = GENMASK(11, 8),
- .sram_pdn_ack_bits = GENMASK(15, 12),
- .bus_prot_mask = GENMASK(28, 26),
- },
-};
+#include "mtk-power-domain.h"
/**
* This function enables the bus protection bits for disabled power
@@ -189,13 +43,79 @@ static int mtk_infracfg_clear_bus_protection(void __iomem *infracfg,
!(val & mask), 100);
}
-static int scpsys_domain_is_on(struct scp_domain_data *data)
+static int _scpsys_bus_protect_enable(const struct mtk_scpsys_bus_prot_data *bpd,
+ void __iomem *reg)
+{
+ u32 val = 0, mask = bpd->bus_prot_mask;
+
+ if (!mask)
+ return 0;
+
+ if (bpd->bus_prot_reg_update)
+ clrsetbits_le32(reg + bpd->bus_prot_set, mask, mask);
+ else
+ writel(mask, reg + bpd->bus_prot_set);
+
+ return readl_poll_timeout(reg + bpd->bus_prot_sta, val, (val & mask) == mask, 1000);
+}
+
+static int _scpsys_bus_protect_disable(const struct mtk_scpsys_bus_prot_data *bpd,
+ void __iomem *reg)
+{
+ u32 val = 0, mask = bpd->bus_prot_mask;
+
+ if (!mask)
+ return 0;
+
+ if (bpd->bus_prot_reg_update)
+ clrbits_le32(reg + bpd->bus_prot_clr, mask);
+ else
+ writel(mask, reg + bpd->bus_prot_clr);
+
+ if (bpd->ignore_clr_ack)
+ return 0;
+
+ return readl_poll_timeout(reg + bpd->bus_prot_sta, val, !(val & mask), 1000);
+}
+
+static int scpsys_bus_protect_enable(const struct mtk_scpsys_bus_prot_data *bpd,
+ int bpd_size, void __iomem *reg)
{
- struct scp_domain *scpd = data->scpd;
- u32 sta = readl(scpd->base + SPM_PWR_STATUS) &
- data->sta_mask;
- u32 sta2 = readl(scpd->base + SPM_PWR_STATUS_2ND) &
- data->sta_mask;
+ int ret, i;
+
+ for (i = 0; i < bpd_size; i++) {
+ ret = _scpsys_bus_protect_enable(&bpd[i], reg);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static int scpsys_bus_protect_disable(const struct mtk_scpsys_bus_prot_data *bpd,
+ int bpd_size, void __iomem *reg)
+{
+ int i, ret;
+
+ for (i = bpd_size - 1; i >= 0; i--) {
+ ret = _scpsys_bus_protect_disable(&bpd[i], reg);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static int mtk_scpsys_domain_is_on(struct power_domain *power_domain)
+{
+ struct mtk_scpsys *scpsys = dev_get_priv(power_domain->dev);
+ const struct mtk_scp_domain_data *data = scpsys->domains[power_domain->id].data;
+ u32 spm_pwr_status = data->pwr_sta_offs ?: SPM_PWR_STATUS;
+ u32 spm_pwr_status_2nd = data->pwr_sta2nd_offs ?: SPM_PWR_STATUS_2ND;
+ u32 sta, sta2;
+
+ sta = readl(scpsys->base + spm_pwr_status) & data->sta_mask;
+ sta2 = readl(scpsys->base + spm_pwr_status_2nd) & data->sta_mask;
/*
* A domain is on when both status bits are set. If only one is set
@@ -209,16 +129,40 @@ static int scpsys_domain_is_on(struct scp_domain_data *data)
return -EINVAL;
}
-static int scpsys_power_on(struct power_domain *power_domain)
+static int mtk_scpsys_power_on(struct power_domain *power_domain)
{
- struct scp_domain *scpd = dev_get_priv(power_domain->dev);
- struct scp_domain_data *data = &scpd->data[power_domain->id];
- void __iomem *ctl_addr = scpd->base + data->ctl_offs;
- u32 pdn_ack = data->sram_pdn_ack_bits;
+ struct mtk_scpsys *scpsys = dev_get_priv(power_domain->dev);
+ struct mtk_scp_domain *domain;
+ const struct mtk_scp_domain_data *data;
+ void __iomem *ctl_addr;
+ void __iomem *infracfg;
+ u32 pdn_ack;
u32 val;
int ret, tmp;
- writel(SPM_EN, scpd->base);
+ if (power_domain->id >= scpsys->soc_data->num_domains)
+ return -EINVAL;
+
+ domain = &scpsys->domains[power_domain->id];
+ data = domain->data;
+ if (!data)
+ return -EINVAL;
+
+ ctl_addr = scpsys->base + data->ctl_offs;
+ infracfg = domain->infracfg ? domain->infracfg : scpsys->infracfg;
+ pdn_ack = data->sram_pdn_ack_bits;
+
+ if (domain->has_pd) {
+ ret = power_domain_on(&domain->parent_pd);
+ if (ret)
+ return ret;
+ }
+
+ ret = clk_enable_bulk(&domain->clks);
+ if (ret)
+ return ret;
+
+ writel(SPM_EN, scpsys->base);
val = readl(ctl_addr);
val |= PWR_ON_BIT;
@@ -227,7 +171,7 @@ static int scpsys_power_on(struct power_domain *power_domain)
val |= PWR_ON_2ND_BIT;
writel(val, ctl_addr);
- ret = readx_poll_timeout(scpsys_domain_is_on, data, tmp, tmp > 0,
+ ret = readx_poll_timeout(mtk_scpsys_domain_is_on, power_domain, tmp, tmp > 0,
100);
if (ret < 0)
return ret;
@@ -241,6 +185,10 @@ static int scpsys_power_on(struct power_domain *power_domain)
val |= PWR_RST_B_BIT;
writel(val, ctl_addr);
+ ret = clk_enable_bulk(&domain->subsys_clks);
+ if (ret)
+ return ret;
+
val &= ~data->sram_pdn_bits;
writel(val, ctl_addr);
@@ -249,31 +197,52 @@ static int scpsys_power_on(struct power_domain *power_domain)
return ret;
if (data->bus_prot_mask) {
- ret = mtk_infracfg_clear_bus_protection(scpd->infracfg,
+ ret = mtk_infracfg_clear_bus_protection(infracfg,
data->bus_prot_mask);
if (ret)
return ret;
}
+ ret = scpsys_bus_protect_disable(data->bp_infracfg, SPM_MAX_BUS_PROT_DATA, infracfg);
+ if (ret < 0)
+ return ret;
return 0;
}
-static int scpsys_power_off(struct power_domain *power_domain)
+static int mtk_scpsys_power_off(struct power_domain *power_domain)
{
- struct scp_domain *scpd = dev_get_priv(power_domain->dev);
- struct scp_domain_data *data = &scpd->data[power_domain->id];
- void __iomem *ctl_addr = scpd->base + data->ctl_offs;
- u32 pdn_ack = data->sram_pdn_ack_bits;
+ struct mtk_scpsys *scpsys = dev_get_priv(power_domain->dev);
+ struct mtk_scp_domain *domain;
+ const struct mtk_scp_domain_data *data;
+ void __iomem *ctl_addr;
+ void __iomem *infracfg;
+ u32 pdn_ack;
u32 val;
int ret, tmp;
+ if (power_domain->id >= scpsys->soc_data->num_domains)
+ return -EINVAL;
+
+ domain = &scpsys->domains[power_domain->id];
+ data = domain->data;
+ if (!data)
+ return -EINVAL;
+
+ ctl_addr = scpsys->base + data->ctl_offs;
+ infracfg = domain->infracfg ?: scpsys->infracfg;
+ pdn_ack = data->sram_pdn_ack_bits;
+
if (data->bus_prot_mask) {
- ret = mtk_infracfg_set_bus_protection(scpd->infracfg,
+ ret = mtk_infracfg_set_bus_protection(infracfg,
data->bus_prot_mask);
if (ret)
return ret;
}
+ ret = scpsys_bus_protect_enable(data->bp_infracfg, SPM_MAX_BUS_PROT_DATA, infracfg);
+ if (ret < 0)
+ return ret;
+
val = readl(ctl_addr);
val |= data->sram_pdn_bits;
writel(val, ctl_addr);
@@ -283,6 +252,10 @@ static int scpsys_power_off(struct power_domain *power_domain)
if (ret < 0)
return ret;
+ ret = clk_disable_bulk(&domain->subsys_clks);
+ if (ret)
+ return ret;
+
val |= PWR_ISO_BIT;
writel(val, ctl_addr);
@@ -298,60 +271,38 @@ static int scpsys_power_off(struct power_domain *power_domain)
val &= ~PWR_ON_2ND_BIT;
writel(val, ctl_addr);
- ret = readx_poll_timeout(scpsys_domain_is_on, data, tmp, !tmp, 100);
+ ret = readx_poll_timeout(mtk_scpsys_domain_is_on, power_domain, tmp, !tmp, 100);
if (ret < 0)
return ret;
- return 0;
-}
-
-static int scpsys_power_request(struct power_domain *power_domain)
-{
- struct scp_domain *scpd = dev_get_priv(power_domain->dev);
- struct scp_domain_data *data;
-
- data = &scpd->data[power_domain->id];
- data->scpd = scpd;
-
- return 0;
-}
-
-static int mtk_power_domain_hook(struct udevice *dev)
-{
- struct scp_domain *scpd = dev_get_priv(dev);
-
- scpd->type = (enum scp_domain_type)dev_get_driver_data(dev);
-
- switch (scpd->type) {
- case SCPSYS_MT7623:
- scpd->data = scp_domain_mt7623;
- break;
- case SCPSYS_MT7622:
- case SCPSYS_MT7629:
- scpd->data = scp_domain_mt7629;
- break;
- default:
- return -EINVAL;
- }
+ ret = clk_disable_bulk(&domain->clks);
+ if (ret)
+ return ret;
return 0;
}
-static int mtk_power_domain_probe(struct udevice *dev)
+int mtk_scpsys_probe(struct udevice *dev)
{
struct ofnode_phandle_args args;
- struct scp_domain *scpd = dev_get_priv(dev);
+ struct mtk_scpsys *scpsys = dev_get_priv(dev);
struct regmap *regmap;
struct clk_bulk bulk;
- int err;
+ int err, i;
- scpd->base = dev_read_addr_ptr(dev);
- if (!scpd->base)
+ scpsys->base = dev_read_addr_ptr(dev);
+ if (!scpsys->base)
return -ENOENT;
- err = mtk_power_domain_hook(dev);
- if (err)
- return err;
+ scpsys->soc_data = (const struct mtk_scp_soc_data *)dev_get_driver_data(dev);
+
+ scpsys->domains = devm_kcalloc(dev, scpsys->soc_data->num_domains,
+ sizeof(*scpsys->domains), GFP_KERNEL);
+ if (!scpsys->domains)
+ return -ENOMEM;
+
+ for (i = 0; i < scpsys->soc_data->num_domains; i++)
+ scpsys->domains[i].data = &scpsys->soc_data->data[i];
/* get corresponding syscon phandle */
err = dev_read_phandle_with_args(dev, "infracfg", NULL, 0, 0, &args);
@@ -362,12 +313,12 @@ static int mtk_power_domain_probe(struct udevice *dev)
if (IS_ERR(regmap))
return PTR_ERR(regmap);
- scpd->infracfg = regmap_get_range(regmap, 0);
- if (!scpd->infracfg)
+ scpsys->infracfg = regmap_get_range(regmap, 0);
+ if (!scpsys->infracfg)
return -ENOENT;
/* enable Infra DCM */
- setbits_le32(scpd->infracfg + INFRA_TOPDCM_CTRL, DCM_TOP_EN);
+ setbits_le32(scpsys->infracfg + INFRA_TOPDCM_CTRL, DCM_TOP_EN);
err = clk_get_bulk(dev, &bulk);
if (err)
@@ -376,33 +327,180 @@ static int mtk_power_domain_probe(struct udevice *dev)
return clk_enable_bulk(&bulk);
}
-static const struct udevice_id mtk_power_domain_ids[] = {
- {
- .compatible = "mediatek,mt7622-scpsys",
- .data = SCPSYS_MT7622,
- },
- {
- .compatible = "mediatek,mt7623-scpsys",
- .data = SCPSYS_MT7623,
- },
- {
- .compatible = "mediatek,mt7629-scpsys",
- .data = SCPSYS_MT7629,
- },
- { /* sentinel */ }
-};
+static int mtk_scpsys_add_one_domain(struct udevice *dev, ofnode node, int parent_id)
+{
+ struct mtk_scpsys *scpsys = dev_get_priv(dev);
+ struct ofnode_phandle_args args;
+ struct mtk_scp_domain *domain;
+ struct regmap *regmap;
+ const char *clk_name;
+ int i, ret, num_clks;
+ u32 id;
-static const struct power_domain_ops mtk_power_domain_ops = {
- .off = scpsys_power_off,
- .on = scpsys_power_on,
- .request = scpsys_power_request,
-};
+ ret = ofnode_read_u32(node, "reg", &id);
+ if (ret) {
+ dev_err(dev, "%s: failed to retrieve domain id from reg: %d\n",
+ ofnode_get_name(node), ret);
+ return ret;
+ }
+
+ if (id >= scpsys->soc_data->num_domains) {
+ dev_err(dev, "%s: invalid domain id %d\n", ofnode_get_name(node), id);
+ return -EINVAL;
+ }
+
+ domain = &scpsys->domains[id];
+ domain->data = &scpsys->soc_data->data[id];
+
+ if (parent_id >= 0) {
+ domain->has_pd = true;
+ domain->parent_pd.dev = dev;
+ domain->parent_pd.id = parent_id;
+ }
+
+ if (ofnode_read_bool(node, "mediatek,infracfg")) {
+ ret = ofnode_parse_phandle_with_args(node, "mediatek,infracfg", NULL, 0, 0, &args);
+ if (ret)
+ return ret;
+
+ regmap = syscon_node_to_regmap(args.node);
+ if (IS_ERR(regmap))
+ return PTR_ERR(regmap);
+
+ domain->infracfg = regmap_get_range(regmap, 0);
+
+ /* enable Infra DCM */
+ if (domain->infracfg)
+ setbits_le32(domain->infracfg + INFRA_TOPDCM_CTRL,
+ DCM_TOP_EN);
+ }
+
+ num_clks = ofnode_read_string_count(node, "clock-names");
+ for (i = 0; i < num_clks; i++) {
+ ret = ofnode_read_string_index(node, "clock-names", i, &clk_name);
+ if (ret) {
+ dev_err(dev, "%s: failed to retrieve clock-names at index %i: %d\n",
+ ofnode_get_name(node), i, ret);
+ return ret;
+ }
+
+ if (strchr(clk_name, '-'))
+ domain->subsys_clks.count++;
+ else
+ domain->clks.count++;
+ }
+
+ if (domain->clks.count) {
+ domain->clks.clks = devm_kcalloc(dev, domain->clks.count,
+ sizeof(struct clk), GFP_KERNEL);
+ if (!domain->clks.clks)
+ return -ENOMEM;
+ }
+
+ if (domain->subsys_clks.count) {
+ domain->subsys_clks.clks = devm_kcalloc(dev,
+ domain->subsys_clks.count,
+ sizeof(struct clk), GFP_KERNEL);
+ if (!domain->subsys_clks.clks)
+ return -ENOMEM;
+ }
+
+ for (i = 0; i < domain->clks.count; i++) {
+ ret = clk_get_by_index_nodev(node, i, &domain->clks.clks[i]);
+ if (ret < 0) {
+ dev_err(dev, "%s: failed to get clk at index %d: %d\n",
+ ofnode_get_name(node), i, ret);
+ goto err_put_clocks;
+ }
+ }
+
+ for (i = 0; i < domain->subsys_clks.count; i++) {
+ ret = clk_get_by_index_nodev(node, i + domain->clks.count,
+ &domain->subsys_clks.clks[i]);
+ if (ret < 0) {
+ dev_err(dev, "%s: failed to get subsys clk at index %d: %d\n",
+ ofnode_get_name(node), i + domain->clks.count, ret);
+ goto err_put_subsys_clocks;
+ }
+ }
+
+ return 0;
+
+err_put_subsys_clocks:
+ clk_release_all(domain->subsys_clks.clks, domain->subsys_clks.count);
+ domain->subsys_clks.count = 0;
+err_put_clocks:
+ clk_release_all(domain->clks.clks, domain->clks.count);
+ domain->clks.count = 0;
+ domain->data = NULL;
+ return ret;
+}
+
+static int mtk_scpsys_add_subdomain(struct udevice *dev, ofnode node)
+{
+ ofnode subnode;
+ int ret;
+ u32 id;
+
+ ret = ofnode_read_u32(node, "reg", &id);
+ if (ret) {
+ dev_err(dev, "%s: failed to get domain id\n", ofnode_get_name(node));
+ return ret;
+ }
+
+ ofnode_for_each_subnode(subnode, node) {
+ ret = mtk_scpsys_add_one_domain(dev, subnode, id);
+ if (ret) {
+ dev_err(dev, "failed to add child domain: %s\n",
+ ofnode_get_name(subnode));
+ continue;
+ }
+
+ ret = mtk_scpsys_add_subdomain(dev, subnode);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+int mtk_power_controller_probe(struct udevice *dev)
+{
+ struct mtk_scpsys *scpsys = dev_get_priv(dev);
+ ofnode subnode;
+ int ret;
+
+ scpsys->base = dev_read_addr_ptr(dev_get_parent(dev));
+ if (!scpsys->base)
+ return -ENOENT;
+
+ scpsys->soc_data = (const struct mtk_scp_soc_data *)dev_get_driver_data(dev);
+
+ scpsys->domains = devm_kcalloc(dev, scpsys->soc_data->num_domains,
+ sizeof(*scpsys->domains), GFP_KERNEL);
+ if (!scpsys->domains)
+ return -ENOMEM;
+
+ dev_for_each_subnode(subnode, dev) {
+ ret = mtk_scpsys_add_one_domain(dev, subnode, -1);
+ if (ret) {
+ dev_err(dev, "failed to add child domain: %s\n",
+ ofnode_get_name(subnode));
+ continue;
+ }
+
+ ret = mtk_scpsys_add_subdomain(dev, subnode);
+ if (ret) {
+ dev_err(dev, "failed to add sub domain: %s\n",
+ ofnode_get_name(subnode));
+ return ret;
+ }
+ }
+
+ return 0;
+}
-U_BOOT_DRIVER(mtk_power_domain) = {
- .name = "mtk_power_domain",
- .id = UCLASS_POWER_DOMAIN,
- .ops = &mtk_power_domain_ops,
- .probe = mtk_power_domain_probe,
- .of_match = mtk_power_domain_ids,
- .priv_auto = sizeof(struct scp_domain),
+const struct power_domain_ops mtk_power_domain_ops = {
+ .off = mtk_scpsys_power_off,
+ .on = mtk_scpsys_power_on,
};
diff --git a/drivers/power/domain/mtk-power-domain.h b/drivers/power/domain/mtk-power-domain.h
new file mode 100644
index 00000000000..5bf0ca850ec
--- /dev/null
+++ b/drivers/power/domain/mtk-power-domain.h
@@ -0,0 +1,131 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2018 MediaTek Inc.
+ * Copyright (C) 2026 BayLibre, SAS
+ * Author: Ryder Lee <[email protected]>
+ * Julien Stephan <[email protected]>
+ */
+
+#ifndef __MTK_POWER_DOMAIN_H
+#define __MTK_POWER_DOMAIN_H
+
+#include <clk.h>
+#include <power-domain-uclass.h>
+#include <linux/bitops.h>
+#include <linux/compiler.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+
+struct udevice;
+
+#define SPM_EN (0xb16 << 16 | 0x1)
+#define SPM_VDE_PWR_CON 0x0210
+#define SPM_MFG_PWR_CON 0x0214
+#define SPM_ISP_PWR_CON 0x0238
+#define SPM_DIS_PWR_CON 0x023c
+#define SPM_CONN_PWR_CON 0x0280
+#define SPM_BDP_PWR_CON 0x029c
+#define SPM_ETH_PWR_CON 0x02a0
+#define SPM_HIF_PWR_CON 0x02a4
+#define SPM_IFR_MSC_PWR_CON 0x02a8
+#define SPM_ETHSYS_PWR_CON 0x2e0
+#define SPM_HIF0_PWR_CON 0x2e4
+#define SPM_HIF1_PWR_CON 0x2e8
+#define SPM_PWR_STATUS 0x60c
+#define SPM_PWR_STATUS_2ND 0x610
+
+#define PWR_RST_B_BIT BIT(0)
+#define PWR_ISO_BIT BIT(1)
+#define PWR_ON_BIT BIT(2)
+#define PWR_ON_2ND_BIT BIT(3)
+#define PWR_CLK_DIS_BIT BIT(4)
+
+#define PWR_STATUS_CONN BIT(1)
+#define PWR_STATUS_DISP BIT(3)
+#define PWR_STATUS_MFG BIT(4)
+#define PWR_STATUS_ISP BIT(5)
+#define PWR_STATUS_VDEC BIT(7)
+#define PWR_STATUS_BDP BIT(14)
+#define PWR_STATUS_ETH BIT(15)
+#define PWR_STATUS_HIF BIT(16)
+#define PWR_STATUS_IFR_MSC BIT(17)
+#define PWR_STATUS_ETHSYS BIT(24)
+#define PWR_STATUS_HIF0 BIT(25)
+#define PWR_STATUS_HIF1 BIT(26)
+
+/* Infrasys configuration */
+#define INFRA_TOPDCM_CTRL 0x10
+#define INFRA_TOPAXI_PROT_EN 0x220
+#define INFRA_TOPAXI_PROT_STA1 0x228
+
+#define DCM_TOP_EN BIT(0)
+
+#define SPM_MAX_BUS_PROT_DATA 6
+
+struct mtk_scp_domain;
+
+struct mtk_scpsys_bus_prot_data {
+ u32 bus_prot_mask;
+ u32 bus_prot_set;
+ u32 bus_prot_clr;
+ u32 bus_prot_sta;
+ bool bus_prot_reg_update;
+ bool ignore_clr_ack;
+};
+
+struct mtk_scp_domain_data {
+ u32 sta_mask;
+ int ctl_offs;
+ u32 sram_pdn_bits;
+ u32 sram_pdn_ack_bits;
+ u32 bus_prot_mask;
+ const struct mtk_scpsys_bus_prot_data bp_infracfg[SPM_MAX_BUS_PROT_DATA];
+ int pwr_sta_offs;
+ int pwr_sta2nd_offs;
+};
+
+struct mtk_scp_soc_data {
+ const struct mtk_scp_domain_data *data;
+ int num_domains;
+};
+
+#define MTK_SCP_SOC_DATA(_name, _domains) \
+static const struct mtk_scp_soc_data _name##_scp_soc_data = { \
+ .data = _domains, \
+ .num_domains = ARRAY_SIZE(_domains), \
+}
+
+struct mtk_scp_domain {
+ const struct mtk_scp_domain_data *data;
+ void __iomem *infracfg;
+ struct clk_bulk clks;
+ struct clk_bulk subsys_clks;
+ bool has_pd;
+ struct power_domain parent_pd;
+};
+
+struct mtk_scpsys {
+ void __iomem *base;
+ void __iomem *infracfg;
+ const struct mtk_scp_soc_data *soc_data;
+ struct mtk_scp_domain *domains;
+};
+
+#define _BUS_PROT(_mask, _set, _clr, _sta, _update, _ignore) { \
+ .bus_prot_mask = (_mask), \
+ .bus_prot_set = (_set), \
+ .bus_prot_clr = (_clr), \
+ .bus_prot_sta = (_sta), \
+ .bus_prot_reg_update = (_update), \
+ .ignore_clr_ack = (_ignore), \
+}
+
+#define BUS_PROT_WR(_mask, _set, _clr, _sta) \
+ _BUS_PROT(_mask, _set, _clr, _sta, false, false)
+
+int mtk_scpsys_probe(struct udevice *dev);
+int mtk_power_controller_probe(struct udevice *dev);
+
+extern const struct power_domain_ops mtk_power_domain_ops;
+
+#endif /* __MTK_POWER_DOMAIN_H */