[PATCH v2 08/14] power: domain: mediatek: split into per-SoC drivers

Julien Stephan jstephan at baylibre.com
Thu Jul 9 14:58:14 CEST 2026


In order to prepare addition of future SoC, split the current driver
into common shared code and SoC specific drivers:

  - mtk-power-domain.c now only holds the common register access and
    power on/off/request/probe logic plus the shared power_domain_ops.
  - mtk-power-domain.h exposes the register definitions, the mtk_scp_domain
    data structures and the core helpers to the per-SoC drivers.
  - mt7623-power-domain.c and mt7629-power-domain.c each hold their own
    domain table and U_BOOT_DRIVER registration. The mt7629 driver also
    matches the mt7622 compatible, preserving the previous behaviour.

Update the mt7622, mt7623 and mt7629 defconfigs to select the matching
per-SoC driver.

No functional change intended.

Signed-off-by: Julien Stephan <jstephan at baylibre.com>
---
 MAINTAINERS                                |   1 +
 configs/mt7622_rfb_defconfig               |   2 +-
 configs/mt7623a_unielec_u7623_02_defconfig |   2 +-
 configs/mt7623n_bpir2_defconfig            |   2 +-
 configs/mt7629_rfb_defconfig               |   2 +-
 drivers/power/domain/Kconfig               |  23 +++-
 drivers/power/domain/Makefile              |   2 +
 drivers/power/domain/mt2701-power-domain.c |  87 +++++++++++++++
 drivers/power/domain/mt7622-power-domain.c |  54 +++++++++
 drivers/power/domain/mtk-power-domain.c    | 171 +----------------------------
 drivers/power/domain/mtk-power-domain.h    |  81 ++++++++++++++
 11 files changed, 252 insertions(+), 175 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 8867921426c..40c3e3bf6b7 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -418,6 +418,7 @@ R:	GSS_MTK_Uboot_upstream <GSS_MTK_Uboot_upstream at mediatek.com>
 T:	git https://source.denx.de/u-boot/custodians/u-boot-mediatek.git
 S:	Maintained
 F:	arch/arm/dts/mt*
+F:	drivers/power/domain/mt*
 F:	drivers/power/regulator/mt*.c
 F:	drivers/usb/mtu3/
 F:	include/power/mt*.h
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/drivers/power/domain/Kconfig b/drivers/power/domain/Kconfig
index a96c3fb979c..0cadd9b93a9 100644
--- a/drivers/power/domain/Kconfig
+++ b/drivers/power/domain/Kconfig
@@ -83,12 +83,29 @@ config MESON_SECURE_POWER_DOMAIN
 	  Enable support for manipulating Amlogic Meson Secure power domains.
 	  Support for Amlogic A1 series.
 
-config MTK_POWER_DOMAIN
-	bool "Enable the MediaTek power domain driver"
+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.
+	  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 MTK_POWER_DOMAIN
+	bool
+	depends on POWER_DOMAIN && ARCH_MEDIATEK
 
 config QCOM_RPMH_POWER_DOMAIN
 	bool "Enable the QCOM RPMH Power domain driver"
diff --git a/drivers/power/domain/Makefile b/drivers/power/domain/Makefile
index f3cce2b104e..66772b5d346 100644
--- a/drivers/power/domain/Makefile
+++ b/drivers/power/domain/Makefile
@@ -14,6 +14,8 @@ obj-$(CONFIG_IMX8MP_MEDIAMIX_BLKCTRL) += imx8mp-mediamix.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_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
diff --git a/drivers/power/domain/mt2701-power-domain.c b/drivers/power/domain/mt2701-power-domain.c
new file mode 100644
index 00000000000..5626235360e
--- /dev/null
+++ b/drivers/power/domain/mt2701-power-domain.c
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 MediaTek Inc.
+ * Copyright (C) 2026 BayLibre, SAS
+ * Author: Ryder Lee <ryder.lee at mediatek.com>
+ *         Julien Stephan <jstephan at baylibre.com>
+ */
+
+#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,
+	},
+};
+
+static const struct udevice_id mt2701_power_domain_ids[] = {
+	{
+		.compatible = "mediatek,mt2701-scpsys",
+		.data = (ulong)&mt2701_scp_domain,
+	},
+	{
+		.compatible = "mediatek,mt7623-scpsys",
+		.data = (ulong)&mt2701_scp_domain,
+	},
+	{ /* sentinel */ }
+};
+
+U_BOOT_DRIVER(mt2701_power_domain) = {
+	.name = "mt2701_power_domain",
+	.id = UCLASS_POWER_DOMAIN,
+	.ops = &mtk_power_domain_ops,
+	.probe = mtk_power_domain_probe,
+	.of_match = mt2701_power_domain_ids,
+	.priv_auto = sizeof(struct mtk_scp_domain),
+};
diff --git a/drivers/power/domain/mt7622-power-domain.c b/drivers/power/domain/mt7622-power-domain.c
new file mode 100644
index 00000000000..487ae477bb0
--- /dev/null
+++ b/drivers/power/domain/mt7622-power-domain.c
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 MediaTek Inc.
+ * Copyright (C) 2026 BayLibre, SAS
+ * Author: Ryder Lee <ryder.lee at mediatek.com>
+ *         Julien Stephan <jstephan at baylibre.com>
+ */
+
+#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),
+	},
+};
+
+static const struct udevice_id mt7622_power_domain_ids[] = {
+	{
+		.compatible = "mediatek,mt7622-scpsys",
+		.data = (ulong)&mt7622_scp_domain,
+	},
+	{ /* sentinel */ }
+};
+
+U_BOOT_DRIVER(mt7622_power_domain) = {
+	.name = "mt7622_power_domain",
+	.id = UCLASS_POWER_DOMAIN,
+	.ops = &mtk_power_domain_ops,
+	.probe = mtk_power_domain_probe,
+	.of_match = mt7622_power_domain_ids,
+	.priv_auto = sizeof(struct mtk_scp_domain),
+};
diff --git a/drivers/power/domain/mtk-power-domain.c b/drivers/power/domain/mtk-power-domain.c
index 18a45a131b8..a8045c1f91e 100644
--- a/drivers/power/domain/mtk-power-domain.c
+++ b/drivers/power/domain/mtk-power-domain.c
@@ -6,153 +6,13 @@
 
 #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 <dt-bindings/power/mt2701-power.h>
-#include <dt-bindings/power/mt7622-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)
-
-struct mtk_scp_domain;
-
-struct mtk_scp_domain_data {
-	u32 sta_mask;
-	int ctl_offs;
-	u32 sram_pdn_bits;
-	u32 sram_pdn_ack_bits;
-	u32 bus_prot_mask;
-};
-
-struct mtk_scp_domain {
-	void __iomem *base;
-	void __iomem *infracfg;
-	const struct mtk_scp_domain_data *data;
-};
-
-static const struct mtk_scp_domain_data scp_domain_mt2701[] = {
-	[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,
-	},
-};
-
-static const struct mtk_scp_domain_data scp_domain_mt7622[] = {
-	[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),
-	},
-};
+#include "mtk-power-domain.h"
 
 /**
  * This function enables the bus protection bits for disabled power
@@ -298,7 +158,7 @@ static int mtk_scpsys_power_off(struct power_domain *power_domain)
 	return 0;
 }
 
-static int mtk_power_domain_probe(struct udevice *dev)
+int mtk_power_domain_probe(struct udevice *dev)
 {
 	struct ofnode_phandle_args args;
 	struct mtk_scp_domain *scpd = dev_get_priv(dev);
@@ -335,32 +195,7 @@ 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,mt2701-scpsys",
-		.data = (ulong)&scp_domain_mt2701,
-	},
-	{
-		.compatible = "mediatek,mt7622-scpsys",
-		.data = (ulong)&scp_domain_mt7622,
-	},
-	{
-		.compatible = "mediatek,mt7623-scpsys",
-		.data = (ulong)&scp_domain_mt2701,
-	},
-	{ /* sentinel */ }
-};
-
-static const struct power_domain_ops mtk_power_domain_ops = {
+const struct power_domain_ops mtk_power_domain_ops = {
 	.off = mtk_scpsys_power_off,
 	.on = mtk_scpsys_power_on,
 };
-
-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 mtk_scp_domain),
-};
diff --git a/drivers/power/domain/mtk-power-domain.h b/drivers/power/domain/mtk-power-domain.h
new file mode 100644
index 00000000000..0c2c06a045f
--- /dev/null
+++ b/drivers/power/domain/mtk-power-domain.h
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2018 MediaTek Inc.
+ * Copyright (C) 2026 BayLibre, SAS
+ * Author: Ryder Lee <ryder.lee at mediatek.com>
+ *         Julien Stephan <jstephan at baylibre.com>
+ */
+
+#ifndef __MTK_POWER_DOMAIN_H
+#define __MTK_POWER_DOMAIN_H
+
+#include <power-domain-uclass.h>
+#include <linux/bitops.h>
+#include <linux/compiler.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)
+
+struct mtk_scp_domain;
+
+struct mtk_scp_domain_data {
+	u32 sta_mask;
+	int ctl_offs;
+	u32 sram_pdn_bits;
+	u32 sram_pdn_ack_bits;
+	u32 bus_prot_mask;
+};
+
+struct mtk_scp_domain {
+	void __iomem *base;
+	void __iomem *infracfg;
+	const struct mtk_scp_domain_data *data;
+};
+
+int mtk_power_domain_probe(struct udevice *dev);
+
+extern const struct power_domain_ops mtk_power_domain_ops;
+
+#endif /* __MTK_POWER_DOMAIN_H */

-- 
2.54.0



More information about the U-Boot mailing list