* [PATCH 0/6] Add support for MT8189 clock/power controller
@ 2025-08-18 11:57 irving.ch.lin
2025-08-18 11:57 ` [PATCH 1/6] dt-bindings: clock: mediatek: Add new MT8189 clock irving.ch.lin
` (4 more replies)
0 siblings, 5 replies; 14+ messages in thread
From: irving.ch.lin @ 2025-08-18 11:57 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu, irving-ch.lin
These patches add support for the clock and power controllers
of MediaTek's new SoC, MT8189. With these changes,
other modules can easily manage clock and power resources
using standard Linux APIs, such as the Common Clock Framework (CCF)
and pm_runtime on MT8189 platform.
Irving-ch Lin (6):
dt-bindings: clock: mediatek: Add new MT8189 clock
dt-bindings: power: mediatek: Add new MT8189 power
dt-bindings: clock: mediatek: Add MT8189 clock definitions
dt-bindings: power: mediatek: Add MT8189 power domain definitions
clk: mediatek: Add clock drivers for MT8189 SoC
pmdomain: mediatek: Add power domain driver for MT8189 SoC
.../bindings/clock/mediatek,mt8189-clock.yaml | 89 ++
.../clock/mediatek,mt8189-sys-clock.yaml | 58 +
.../mediatek,mt8189-power-controller.yaml | 94 ++
drivers/clk/mediatek/Kconfig | 146 +++
drivers/clk/mediatek/Makefile | 14 +
drivers/clk/mediatek/clk-mt8189-apmixedsys.c | 135 +++
drivers/clk/mediatek/clk-mt8189-bus.c | 289 +++++
drivers/clk/mediatek/clk-mt8189-cam.c | 131 ++
drivers/clk/mediatek/clk-mt8189-dbgao.c | 115 ++
drivers/clk/mediatek/clk-mt8189-dvfsrc.c | 61 +
drivers/clk/mediatek/clk-mt8189-iic.c | 149 +++
drivers/clk/mediatek/clk-mt8189-img.c | 122 ++
drivers/clk/mediatek/clk-mt8189-mdpsys.c | 100 ++
drivers/clk/mediatek/clk-mt8189-mfg.c | 56 +
drivers/clk/mediatek/clk-mt8189-mmsys.c | 233 ++++
drivers/clk/mediatek/clk-mt8189-scp.c | 92 ++
drivers/clk/mediatek/clk-mt8189-topckgen.c | 1059 +++++++++++++++++
drivers/clk/mediatek/clk-mt8189-ufs.c | 106 ++
drivers/clk/mediatek/clk-mt8189-vcodec.c | 119 ++
drivers/clk/mediatek/clk-mt8189-vlpcfg.c | 145 +++
drivers/clk/mediatek/clk-mt8189-vlpckgen.c | 280 +++++
drivers/clk/mediatek/clk-mux.c | 4 +
drivers/pmdomain/mediatek/mt8189-scpsys.h | 75 ++
drivers/pmdomain/mediatek/mtk-scpsys.c | 957 ++++++++++++++-
include/dt-bindings/clock/mt8189-clk.h | 612 ++++++++++
include/dt-bindings/power/mt8189-power.h | 38 +
26 files changed, 5237 insertions(+), 42 deletions(-)
create mode 100644 Documentation/devicetree/bindings/clock/mediatek,mt8189-clock.yaml
create mode 100644 Documentation/devicetree/bindings/clock/mediatek,mt8189-sys-clock.yaml
create mode 100644 Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml
create mode 100644 drivers/clk/mediatek/clk-mt8189-apmixedsys.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-bus.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-cam.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-dbgao.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-dvfsrc.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-iic.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-img.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-mdpsys.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-mfg.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-mmsys.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-scp.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-topckgen.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-ufs.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-vcodec.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-vlpcfg.c
create mode 100644 drivers/clk/mediatek/clk-mt8189-vlpckgen.c
create mode 100644 drivers/pmdomain/mediatek/mt8189-scpsys.h
create mode 100644 include/dt-bindings/clock/mt8189-clk.h
create mode 100644 include/dt-bindings/power/mt8189-power.h
--
2.45.2
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/6] dt-bindings: clock: mediatek: Add new MT8189 clock
2025-08-18 11:57 [PATCH 0/6] Add support for MT8189 clock/power controller irving.ch.lin
@ 2025-08-18 11:57 ` irving.ch.lin
2025-08-18 14:36 ` Rob Herring (Arm)
2025-08-18 14:42 ` Krzysztof Kozlowski
2025-08-18 11:57 ` [PATCH 2/6] dt-bindings: power: mediatek: Add new MT8189 power irving.ch.lin
` (3 subsequent siblings)
4 siblings, 2 replies; 14+ messages in thread
From: irving.ch.lin @ 2025-08-18 11:57 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu, irving-ch.lin
From: Irving-ch Lin <irving-ch.lin@mediatek.com>
Add the new binding documentation for system clock
and functional clock on MediaTek MT8189.
Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
---
.../bindings/clock/mediatek,mt8189-clock.yaml | 89 +++++++++++++++++++
.../clock/mediatek,mt8189-sys-clock.yaml | 58 ++++++++++++
2 files changed, 147 insertions(+)
create mode 100644 Documentation/devicetree/bindings/clock/mediatek,mt8189-clock.yaml
create mode 100644 Documentation/devicetree/bindings/clock/mediatek,mt8189-sys-clock.yaml
diff --git a/Documentation/devicetree/bindings/clock/mediatek,mt8189-clock.yaml b/Documentation/devicetree/bindings/clock/mediatek,mt8189-clock.yaml
new file mode 100644
index 000000000000..d0d887861a49
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/mediatek,mt8189-clock.yaml
@@ -0,0 +1,89 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/mediatek,mt8189-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek Functional Clock Controller for MT8189
+
+maintainers:
+ - Qiqi Wang <qiqi.wang@mediatek.com>
+
+description: |
+ The clock architecture in MediaTek like below
+ PLLs -->
+ dividers -->
+ muxes -->
+ clock gate
+
+ The devices provide clock gate control in different IP blocks.
+
+properties:
+ compatible:
+ enum:
+ - mediatek,mt8189-camsys-main
+ - mediatek,mt8189-camsys-rawa
+ - mediatek,mt8189-camsys-rawb
+ - mediatek,mt8189-dbg-ao
+ - mediatek,mt8189-dem
+ - mediatek,mt8189-dispsys
+ - mediatek,mt8189-dvfsrc-top
+ - mediatek,mt8189-gce-d
+ - mediatek,mt8189-gce-m
+ - mediatek,mt8189-iic-wrap-e
+ - mediatek,mt8189-iic-wrap-en
+ - mediatek,mt8189-iic-wrap-s
+ - mediatek,mt8189-iic-wrap-ws
+ - mediatek,mt8189-imgsys1
+ - mediatek,mt8189-imgsys2
+ - mediatek,mt8189-infra-ao
+ - mediatek,mt8189-ipesys
+ - mediatek,mt8189-mdpsys
+ - mediatek,mt8189-mfgcfg
+ - mediatek,mt8189-mm-infra
+ - mediatek,mt8189-peri-ao
+ - mediatek,mt8189-scp-clk
+ - mediatek,mt8189-scp-i2c-clk
+ - mediatek,mt8189-ufscfg-ao
+ - mediatek,mt8189-ufscfg-pdn
+ - mediatek,mt8189-vdec-core
+ - mediatek,mt8189-venc
+
+ reg:
+ maxItems: 1
+
+ '#clock-cells':
+ const: 1
+
+ '#reset-cells':
+ const: 1
+
+required:
+ - compatible
+ - reg
+ - '#clock-cells'
+
+allOf:
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - mediatek,mt8189-peri-ao
+ - mediatek,mt8189-ufscfg-ao
+ - mediatek,mt8189-ufscfg-pdn
+
+ then:
+ required:
+ - '#reset-cells'
+
+additionalProperties: false
+
+examples:
+ - |
+ imp_iic_wrap_ws_clk@11b21000 {
+ compatible = "mediatek,mt8189-iic-wrap-ws";
+ reg = <0 0x11b21000 0 0x1000>;
+ #clock-cells = <1>;
+ };
+
diff --git a/Documentation/devicetree/bindings/clock/mediatek,mt8189-sys-clock.yaml b/Documentation/devicetree/bindings/clock/mediatek,mt8189-sys-clock.yaml
new file mode 100644
index 000000000000..0d27ff807e79
--- /dev/null
+++ b/Documentation/devicetree/bindings/clock/mediatek,mt8189-sys-clock.yaml
@@ -0,0 +1,58 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/mediatek,mt8189-sys-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek System Clock Controller for MT8189
+
+maintainers:
+ - Qiqi Wang <qiqi.wang@mediatek.com>
+
+description: |
+ The clock architecture in MediaTek like below
+ PLLs -->
+ dividers -->
+ muxes -->
+ clock gate
+
+ The apmixedsys provides most of PLLs which generated from SoC 26m.
+ The topckgen provides dividers and muxes which provide the clock source to other IP blocks.
+ The infracfg_ao provides clock gate in peripheral and infrastructure IP blocks.
+ The mcusys provides mux control to select the clock source in AP MCU.
+ The device nodes also provide the system control capacity for configuration.
+
+properties:
+ compatible:
+ items:
+ - enum:
+ - mediatek,mt8189-apmixedsys
+ - mediatek,mt8189-topckgen
+ - mediatek,mt8189-vlp-ckgen
+ - mediatek,mt8189-vlp-ao-ckgen
+ - mediatek,mt8189-vlpcfg-reg-bus
+ - const: syscon
+
+ reg:
+ maxItems: 1
+
+ '#clock-cells':
+ const: 1
+
+ '#reset-cells':
+ const: 1
+
+required:
+ - compatible
+ - reg
+ - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+ - |
+ topckgen_clk@10000000 {
+ compatible = "mediatek,mt8189-topckgen", "syscon";
+ reg = <0 0x10000000 0 0x1000>;
+ #clock-cells = <1>;
+ };
--
2.45.2
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/6] dt-bindings: power: mediatek: Add new MT8189 power
2025-08-18 11:57 [PATCH 0/6] Add support for MT8189 clock/power controller irving.ch.lin
2025-08-18 11:57 ` [PATCH 1/6] dt-bindings: clock: mediatek: Add new MT8189 clock irving.ch.lin
@ 2025-08-18 11:57 ` irving.ch.lin
2025-08-18 14:37 ` Rob Herring (Arm)
2025-08-18 14:45 ` Krzysztof Kozlowski
2025-08-18 11:57 ` [PATCH 3/6] dt-bindings: clock: mediatek: Add MT8189 clock definitions irving.ch.lin
` (2 subsequent siblings)
4 siblings, 2 replies; 14+ messages in thread
From: irving.ch.lin @ 2025-08-18 11:57 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu, irving-ch.lin
From: Irving-ch Lin <irving-ch.lin@mediatek.com>
Add the new binding documentation for power controller
on MediaTek MT8189.
Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
---
.../mediatek,mt8189-power-controller.yaml | 94 +++++++++++++++++++
1 file changed, 94 insertions(+)
create mode 100644 Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml
diff --git a/Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml b/Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml
new file mode 100644
index 000000000000..1bf8f94858c8
--- /dev/null
+++ b/Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml
@@ -0,0 +1,94 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/power/mediatek,mt8189-power-controller.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek Power Domains Controller for MT8189
+
+maintainers:
+ - Qiqi Wang <qiqi.wang@mediatek.com>
+
+description: |
+ MediaTek processors include support for multiple power domains which can be
+ powered up/down by software based on different application scenes to save power.
+
+ IP cores belonging to a power domain should contain a 'power-domains'
+ property that is a phandle for SCPSYS node representing the domain.
+
+properties:
+ $nodename:
+ pattern: '^power-controller(@[0-9a-f]+)?$'
+
+ compatible:
+ enum:
+ - mediatek,mt8189-scpsys
+
+ '#power-domain-cells':
+ const: 1
+
+ reg:
+ description: physical base address and size of the power-controller's register area.
+
+ infra-infracfg-ao-reg-bus:
+ $ref: /schemas/types.yaml#/definitions/phandle
+ description: phandle to the device containing the infracfg register range.
+
+ emicfg-ao-mem:
+ $ref: /schemas/types.yaml#/definitions/phandle
+ description: phandle to the device containing the emicfg register range.
+
+ vlpcfg-reg-bus:
+ $ref: /schemas/types.yaml#/definitions/phandle
+ description: phandle to the device containing the vlpcfg (very low power config) register range.
+
+ clocks:
+ description: |
+ A number of phandles to clocks that need to be enabled during domain
+ power-up sequencing.
+
+ clock-names:
+ description: |
+ List of names of clocks, in order to match the power-up sequencing
+ for each power domain we need to group the clocks by name. BASIC
+ clocks need to be enabled before enabling the corresponding power
+ domain, and should not have a '-' in their name (i.e mm, mfg, venc).
+ SUSBYS clocks need to be enabled before releasing the bus protection,
+ and should contain a '-' in their name (i.e mm-0, isp-0, cam-0).
+
+ In order to follow properly the power-up sequencing, the clocks must
+ be specified by order, adding first the BASIC clocks followed by the
+ SUSBSYS clocks.
+
+ domain-supply:
+ description: domain regulator supply.
+
+required:
+ - compatible
+ - reg
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/clock/mt8189-clk.h>
+ #include <dt-bindings/power/mt8189-power.h>
+
+ soc {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ scpsys: power-controller@1c001000 {
+ compatible = "mediatek,mt8189-scpsys";
+ reg = <0 0x1c001000 0 0x1000>;
+ #power-domain-cells = <1>;
+ infra-infracfg-ao-reg-bus = <&infracfg_ao_clk>;
+ emicfg-ao-mem = <&emicfg_ao_mem_clk>;
+ vlpcfg-reg-bus = <&vlpcfg_reg_bus_clk>;
+ clocks = /* MFG */
+ <&topckgen_clk CLK_TOP_MFG_REF_SEL>,
+ <&apmixedsys_clk CLK_APMIXED_MFGPLL>;
+ clock-names = "mfg", "mfg_top";
+ mfg0-supply = <&mt6359_vproc1_buck_reg>;
+ mfg1-supply = <&mt6359_vsram_proc1_ldo_reg>;
+ };
+ };
--
2.45.2
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/6] dt-bindings: clock: mediatek: Add MT8189 clock definitions
2025-08-18 11:57 [PATCH 0/6] Add support for MT8189 clock/power controller irving.ch.lin
2025-08-18 11:57 ` [PATCH 1/6] dt-bindings: clock: mediatek: Add new MT8189 clock irving.ch.lin
2025-08-18 11:57 ` [PATCH 2/6] dt-bindings: power: mediatek: Add new MT8189 power irving.ch.lin
@ 2025-08-18 11:57 ` irving.ch.lin
2025-08-18 14:46 ` Krzysztof Kozlowski
2025-08-18 14:47 ` Krzysztof Kozlowski
2025-08-18 11:57 ` [PATCH 4/6] dt-bindings: power: mediatek: Add MT8189 power domain definitions irving.ch.lin
2025-08-18 11:57 ` [PATCH 6/6] pmdomain: mediatek: Add power domain driver for MT8189 SoC irving.ch.lin
4 siblings, 2 replies; 14+ messages in thread
From: irving.ch.lin @ 2025-08-18 11:57 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu, irving-ch.lin
From: Irving-ch Lin <irving-ch.lin@mediatek.com>
Add device tree bindings for the clock of MediaTek MT8189 SoC.
These definitions will be used to describe the clock topology in
device tree sources.
Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
---
include/dt-bindings/clock/mt8189-clk.h | 612 +++++++++++++++++++++++++
1 file changed, 612 insertions(+)
create mode 100644 include/dt-bindings/clock/mt8189-clk.h
diff --git a/include/dt-bindings/clock/mt8189-clk.h b/include/dt-bindings/clock/mt8189-clk.h
new file mode 100644
index 000000000000..3be35fa0e5dd
--- /dev/null
+++ b/include/dt-bindings/clock/mt8189-clk.h
@@ -0,0 +1,612 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2025 MediaTek Inc.
+ * Author: Qiqi Wang <qiqi.wang@mediatek.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_MT8189_H
+#define _DT_BINDINGS_CLK_MT8189_H
+
+/* TOPCKGEN */
+#define CLK_TOP_AXI_SEL 0
+#define CLK_TOP_AXI_PERI_SEL 1
+#define CLK_TOP_AXI_U_SEL 2
+#define CLK_TOP_BUS_AXIMEM_SEL 3
+#define CLK_TOP_DISP0_SEL 4
+#define CLK_TOP_MMINFRA_SEL 5
+#define CLK_TOP_UART_SEL 6
+#define CLK_TOP_SPI0_SEL 7
+#define CLK_TOP_SPI1_SEL 8
+#define CLK_TOP_SPI2_SEL 9
+#define CLK_TOP_SPI3_SEL 10
+#define CLK_TOP_SPI4_SEL 11
+#define CLK_TOP_SPI5_SEL 12
+#define CLK_TOP_MSDC_MACRO_0P_SEL 13
+#define CLK_TOP_MSDC50_0_HCLK_SEL 14
+#define CLK_TOP_MSDC50_0_SEL 15
+#define CLK_TOP_AES_MSDCFDE_SEL 16
+#define CLK_TOP_MSDC_MACRO_1P_SEL 17
+#define CLK_TOP_MSDC30_1_SEL 18
+#define CLK_TOP_MSDC30_1_HCLK_SEL 19
+#define CLK_TOP_MSDC_MACRO_2P_SEL 20
+#define CLK_TOP_MSDC30_2_SEL 21
+#define CLK_TOP_MSDC30_2_HCLK_SEL 22
+#define CLK_TOP_AUD_INTBUS_SEL 23
+#define CLK_TOP_ATB_SEL 24
+#define CLK_TOP_DISP_PWM_SEL 25
+#define CLK_TOP_USB_TOP_P0_SEL 26
+#define CLK_TOP_USB_XHCI_P0_SEL 27
+#define CLK_TOP_USB_TOP_P1_SEL 28
+#define CLK_TOP_USB_XHCI_P1_SEL 29
+#define CLK_TOP_USB_TOP_P2_SEL 30
+#define CLK_TOP_USB_XHCI_P2_SEL 31
+#define CLK_TOP_USB_TOP_P3_SEL 32
+#define CLK_TOP_USB_XHCI_P3_SEL 33
+#define CLK_TOP_USB_TOP_P4_SEL 34
+#define CLK_TOP_USB_XHCI_P4_SEL 35
+#define CLK_TOP_I2C_SEL 36
+#define CLK_TOP_SENINF_SEL 37
+#define CLK_TOP_SENINF1_SEL 38
+#define CLK_TOP_AUD_ENGEN1_SEL 39
+#define CLK_TOP_AUD_ENGEN2_SEL 40
+#define CLK_TOP_AES_UFSFDE_SEL 41
+#define CLK_TOP_U_SEL 42
+#define CLK_TOP_U_MBIST_SEL 43
+#define CLK_TOP_AUD_1_SEL 44
+#define CLK_TOP_AUD_2_SEL 45
+#define CLK_TOP_VENC_SEL 46
+#define CLK_TOP_VDEC_SEL 47
+#define CLK_TOP_PWM_SEL 48
+#define CLK_TOP_AUDIO_H_SEL 49
+#define CLK_TOP_MCUPM_SEL 50
+#define CLK_TOP_MEM_SUB_SEL 51
+#define CLK_TOP_MEM_SUB_PERI_SEL 52
+#define CLK_TOP_MEM_SUB_U_SEL 53
+#define CLK_TOP_EMI_N_SEL 54
+#define CLK_TOP_DSI_OCC_SEL 55
+#define CLK_TOP_AP2CONN_HOST_SEL 56
+#define CLK_TOP_IMG1_SEL 57
+#define CLK_TOP_IPE_SEL 58
+#define CLK_TOP_CAM_SEL 59
+#define CLK_TOP_CAMTM_SEL 60
+#define CLK_TOP_DSP_SEL 61
+#define CLK_TOP_SR_PKA_SEL 62
+#define CLK_TOP_DXCC_SEL 63
+#define CLK_TOP_MFG_REF_SEL 64
+#define CLK_TOP_MDP0_SEL 65
+#define CLK_TOP_DP_SEL 66
+#define CLK_TOP_EDP_SEL 67
+#define CLK_TOP_EDP_FAVT_SEL 68
+#define CLK_TOP_ETH_250M_SEL 69
+#define CLK_TOP_ETH_62P4M_PTP_SEL 70
+#define CLK_TOP_ETH_50M_RMII_SEL 71
+#define CLK_TOP_SFLASH_SEL 72
+#define CLK_TOP_GCPU_SEL 73
+#define CLK_TOP_MAC_TL_SEL 74
+#define CLK_TOP_VDSTX_DG_CTS_SEL 75
+#define CLK_TOP_PLL_DPIX_SEL 76
+#define CLK_TOP_ECC_SEL 77
+#define CLK_TOP_APLL_I2SIN0_MCK_SEL 78
+#define CLK_TOP_APLL_I2SIN1_MCK_SEL 79
+#define CLK_TOP_APLL_I2SIN2_MCK_SEL 80
+#define CLK_TOP_APLL_I2SIN3_MCK_SEL 81
+#define CLK_TOP_APLL_I2SIN4_MCK_SEL 82
+#define CLK_TOP_APLL_I2SIN6_MCK_SEL 83
+#define CLK_TOP_APLL_I2SOUT0_MCK_SEL 84
+#define CLK_TOP_APLL_I2SOUT1_MCK_SEL 85
+#define CLK_TOP_APLL_I2SOUT2_MCK_SEL 86
+#define CLK_TOP_APLL_I2SOUT3_MCK_SEL 87
+#define CLK_TOP_APLL_I2SOUT4_MCK_SEL 88
+#define CLK_TOP_APLL_I2SOUT6_MCK_SEL 89
+#define CLK_TOP_APLL_FMI2S_MCK_SEL 90
+#define CLK_TOP_APLL_TDMOUT_MCK_SEL 91
+#define CLK_TOP_MFG_SEL_MFGPLL 92
+#define CLK_TOP_APLL12_CK_DIV_I2SIN0 93
+#define CLK_TOP_APLL12_CK_DIV_I2SIN1 94
+#define CLK_TOP_APLL12_CK_DIV_I2SOUT0 95
+#define CLK_TOP_APLL12_CK_DIV_I2SOUT1 96
+#define CLK_TOP_APLL12_CK_DIV_FMI2S 97
+#define CLK_TOP_APLL12_CK_DIV_TDMOUT_M 98
+#define CLK_TOP_APLL12_CK_DIV_TDMOUT_B 99
+#define CLK_TOP_MAINPLL_D3 100
+#define CLK_TOP_MAINPLL_D4 101
+#define CLK_TOP_MAINPLL_D4_D2 102
+#define CLK_TOP_MAINPLL_D4_D4 103
+#define CLK_TOP_MAINPLL_D4_D8 104
+#define CLK_TOP_MAINPLL_D5 105
+#define CLK_TOP_MAINPLL_D5_D2 106
+#define CLK_TOP_MAINPLL_D5_D4 107
+#define CLK_TOP_MAINPLL_D5_D8 108
+#define CLK_TOP_MAINPLL_D6 109
+#define CLK_TOP_MAINPLL_D6_D2 110
+#define CLK_TOP_MAINPLL_D6_D4 111
+#define CLK_TOP_MAINPLL_D6_D8 112
+#define CLK_TOP_MAINPLL_D7 113
+#define CLK_TOP_MAINPLL_D7_D2 114
+#define CLK_TOP_MAINPLL_D7_D4 115
+#define CLK_TOP_MAINPLL_D7_D8 116
+#define CLK_TOP_MAINPLL_D9 117
+#define CLK_TOP_UNIVPLL_D2 118
+#define CLK_TOP_UNIVPLL_D3 119
+#define CLK_TOP_UNIVPLL_D4 120
+#define CLK_TOP_UNIVPLL_D4_D2 121
+#define CLK_TOP_UNIVPLL_D4_D4 122
+#define CLK_TOP_UNIVPLL_D4_D8 123
+#define CLK_TOP_UNIVPLL_D5 124
+#define CLK_TOP_UNIVPLL_D5_D2 125
+#define CLK_TOP_UNIVPLL_D5_D4 126
+#define CLK_TOP_UNIVPLL_D6 127
+#define CLK_TOP_UNIVPLL_D6_D2 128
+#define CLK_TOP_UNIVPLL_D6_D4 129
+#define CLK_TOP_UNIVPLL_D6_D8 130
+#define CLK_TOP_UNIVPLL_D6_D16 131
+#define CLK_TOP_UNIVPLL_D7 132
+#define CLK_TOP_UNIVPLL_D7_D2 133
+#define CLK_TOP_UNIVPLL_D7_D3 134
+#define CLK_TOP_LVDSTX_DG_CTS 135
+#define CLK_TOP_UNIVPLL_192M 136
+#define CLK_TOP_UNIVPLL_192M_D2 137
+#define CLK_TOP_UNIVPLL_192M_D4 138
+#define CLK_TOP_UNIVPLL_192M_D8 139
+#define CLK_TOP_UNIVPLL_192M_D10 140
+#define CLK_TOP_UNIVPLL_192M_D16 141
+#define CLK_TOP_UNIVPLL_192M_D32 142
+#define CLK_TOP_APLL1_D2 143
+#define CLK_TOP_APLL1_D4 144
+#define CLK_TOP_APLL1_D8 145
+#define CLK_TOP_APLL1_D3 146
+#define CLK_TOP_APLL2_D2 147
+#define CLK_TOP_APLL2_D4 148
+#define CLK_TOP_APLL2_D8 149
+#define CLK_TOP_APLL2_D3 150
+#define CLK_TOP_MMPLL_D4 151
+#define CLK_TOP_MMPLL_D4_D2 152
+#define CLK_TOP_MMPLL_D4_D4 153
+#define CLK_TOP_VPLL_DPIX 154
+#define CLK_TOP_MMPLL_D5 155
+#define CLK_TOP_MMPLL_D5_D2 156
+#define CLK_TOP_MMPLL_D5_D4 157
+#define CLK_TOP_MMPLL_D6 158
+#define CLK_TOP_MMPLL_D6_D2 159
+#define CLK_TOP_MMPLL_D7 160
+#define CLK_TOP_MMPLL_D9 161
+#define CLK_TOP_TVDPLL1_D2 162
+#define CLK_TOP_TVDPLL1_D4 163
+#define CLK_TOP_TVDPLL1_D8 164
+#define CLK_TOP_TVDPLL1_D16 165
+#define CLK_TOP_TVDPLL2_D2 166
+#define CLK_TOP_TVDPLL2_D4 167
+#define CLK_TOP_TVDPLL2_D8 168
+#define CLK_TOP_TVDPLL2_D16 169
+#define CLK_TOP_ETHPLL_D2 170
+#define CLK_TOP_ETHPLL_D8 171
+#define CLK_TOP_ETHPLL_D10 172
+#define CLK_TOP_MSDCPLL_D2 173
+#define CLK_TOP_VOWPLL 174
+#define CLK_TOP_UFSPLL_D2 175
+#define CLK_TOP_F26M_CK_D2 176
+#define CLK_TOP_OSC_D2 177
+#define CLK_TOP_OSC_D4 178
+#define CLK_TOP_OSC_D8 179
+#define CLK_TOP_OSC_D16 180
+#define CLK_TOP_OSC_D3 181
+#define CLK_TOP_OSC_D7 182
+#define CLK_TOP_OSC_D10 183
+#define CLK_TOP_OSC_D20 184
+#define CLK_TOP_FMCNT_P0_EN 185
+#define CLK_TOP_FMCNT_P1_EN 186
+#define CLK_TOP_FMCNT_P2_EN 187
+#define CLK_TOP_FMCNT_P3_EN 188
+#define CLK_TOP_FMCNT_P4_EN 189
+#define CLK_TOP_USB_F26M_CK_EN 190
+#define CLK_TOP_SSPXTP_F26M_CK_EN 191
+#define CLK_TOP_USB2_PHY_RF_P0_EN 192
+#define CLK_TOP_USB2_PHY_RF_P1_EN 193
+#define CLK_TOP_USB2_PHY_RF_P2_EN 194
+#define CLK_TOP_USB2_PHY_RF_P3_EN 195
+#define CLK_TOP_USB2_PHY_RF_P4_EN 196
+#define CLK_TOP_USB2_26M_CK_P0_EN 197
+#define CLK_TOP_USB2_26M_CK_P1_EN 198
+#define CLK_TOP_USB2_26M_CK_P2_EN 199
+#define CLK_TOP_USB2_26M_CK_P3_EN 200
+#define CLK_TOP_USB2_26M_CK_P4_EN 201
+#define CLK_TOP_F26M_CK_EN 202
+#define CLK_TOP_AP2CON_EN 203
+#define CLK_TOP_EINT_N_EN 204
+#define CLK_TOP_TOPCKGEN_FMIPI_CSI_UP26M_CK_EN 205
+#define CLK_TOP_DRAMULP_CK_EN 206
+#define CLK_TOP_EINT_E_EN 207
+#define CLK_TOP_EINT_W_EN 208
+#define CLK_TOP_EINT_S_EN 209
+#define CLK_TOP_NR_CLK 210
+
+/* INFRACFG_AO */
+#define CLK_IFRAO_CQ_DMA_FPC 0
+#define CLK_IFRAO_DEBUGSYS 1
+#define CLK_IFRAO_DBG_TRACE 2
+#define CLK_IFRAO_CQ_DMA 3
+#define CLK_IFRAO_NR_CLK 4
+
+/* APMIXEDSYS */
+#define CLK_APMIXED_ARMPLL_LL 0
+#define CLK_APMIXED_ARMPLL_BL 1
+#define CLK_APMIXED_CCIPLL 2
+#define CLK_APMIXED_MAINPLL 3
+#define CLK_APMIXED_UNIVPLL 4
+#define CLK_APMIXED_MMPLL 5
+#define CLK_APMIXED_MFGPLL 6
+#define CLK_APMIXED_APLL1 7
+#define CLK_APMIXED_APLL2 8
+#define CLK_APMIXED_EMIPLL 9
+#define CLK_APMIXED_APUPLL2 10
+#define CLK_APMIXED_APUPLL 11
+#define CLK_APMIXED_TVDPLL1 12
+#define CLK_APMIXED_TVDPLL2 13
+#define CLK_APMIXED_ETHPLL 14
+#define CLK_APMIXED_MSDCPLL 15
+#define CLK_APMIXED_UFSPLL 16
+#define CLK_APMIXED_NR_CLK 17
+
+/* PERICFG_AO */
+#define CLK_PERAO_UART0 0
+#define CLK_PERAO_UART1 1
+#define CLK_PERAO_UART2 2
+#define CLK_PERAO_UART3 3
+#define CLK_PERAO_PWM_H 4
+#define CLK_PERAO_PWM_B 5
+#define CLK_PERAO_PWM_FB1 6
+#define CLK_PERAO_PWM_FB2 7
+#define CLK_PERAO_PWM_FB3 8
+#define CLK_PERAO_PWM_FB4 9
+#define CLK_PERAO_DISP_PWM0 10
+#define CLK_PERAO_DISP_PWM1 11
+#define CLK_PERAO_SPI0_B 12
+#define CLK_PERAO_SPI1_B 13
+#define CLK_PERAO_SPI2_B 14
+#define CLK_PERAO_SPI3_B 15
+#define CLK_PERAO_SPI4_B 16
+#define CLK_PERAO_SPI5_B 17
+#define CLK_PERAO_SPI0_H 18
+#define CLK_PERAO_SPI1_H 19
+#define CLK_PERAO_SPI2_H 20
+#define CLK_PERAO_SPI3_H 21
+#define CLK_PERAO_SPI4_H 22
+#define CLK_PERAO_SPI5_H 23
+#define CLK_PERAO_AXI 24
+#define CLK_PERAO_AHB_APB 25
+#define CLK_PERAO_TL 26
+#define CLK_PERAO_REF 27
+#define CLK_PERAO_I2C 28
+#define CLK_PERAO_DMA_B 29
+#define CLK_PERAO_SSUSB0_REF 30
+#define CLK_PERAO_SSUSB0_FRMCNT 31
+#define CLK_PERAO_SSUSB0_SYS 32
+#define CLK_PERAO_SSUSB0_XHCI 33
+#define CLK_PERAO_SSUSB0_F 34
+#define CLK_PERAO_SSUSB0_H 35
+#define CLK_PERAO_SSUSB1_REF 36
+#define CLK_PERAO_SSUSB1_FRMCNT 37
+#define CLK_PERAO_SSUSB1_SYS 38
+#define CLK_PERAO_SSUSB1_XHCI 39
+#define CLK_PERAO_SSUSB1_F 40
+#define CLK_PERAO_SSUSB1_H 41
+#define CLK_PERAO_SSUSB2_REF 42
+#define CLK_PERAO_SSUSB2_FRMCNT 43
+#define CLK_PERAO_SSUSB2_SYS 44
+#define CLK_PERAO_SSUSB2_XHCI 45
+#define CLK_PERAO_SSUSB2_F 46
+#define CLK_PERAO_SSUSB2_H 47
+#define CLK_PERAO_SSUSB3_REF 48
+#define CLK_PERAO_SSUSB3_FRMCNT 49
+#define CLK_PERAO_SSUSB3_SYS 50
+#define CLK_PERAO_SSUSB3_XHCI 51
+#define CLK_PERAO_SSUSB3_F 52
+#define CLK_PERAO_SSUSB3_H 53
+#define CLK_PERAO_SSUSB4_REF 54
+#define CLK_PERAO_SSUSB4_FRMCNT 55
+#define CLK_PERAO_SSUSB4_SYS 56
+#define CLK_PERAO_SSUSB4_XHCI 57
+#define CLK_PERAO_SSUSB4_F 58
+#define CLK_PERAO_SSUSB4_H 59
+#define CLK_PERAO_MSDC0 60
+#define CLK_PERAO_MSDC0_H 61
+#define CLK_PERAO_MSDC0_FAES 62
+#define CLK_PERAO_MSDC0_MST_F 63
+#define CLK_PERAO_MSDC0_SLV_H 64
+#define CLK_PERAO_MSDC1 65
+#define CLK_PERAO_MSDC1_H 66
+#define CLK_PERAO_MSDC1_MST_F 67
+#define CLK_PERAO_MSDC1_SLV_H 68
+#define CLK_PERAO_MSDC2 69
+#define CLK_PERAO_MSDC2_H 70
+#define CLK_PERAO_MSDC2_MST_F 71
+#define CLK_PERAO_MSDC2_SLV_H 72
+#define CLK_PERAO_SFLASH 73
+#define CLK_PERAO_SFLASH_F 74
+#define CLK_PERAO_SFLASH_H 75
+#define CLK_PERAO_SFLASH_P 76
+#define CLK_PERAO_AUDIO0 77
+#define CLK_PERAO_AUDIO1 78
+#define CLK_PERAO_AUDIO2 79
+#define CLK_PERAO_AUXADC_26M 80
+#define CLK_PERAO_NR_CLK 81
+
+/* UFSCFG_AO_REG */
+#define CLK_UFSCFG_AO_REG_UNIPRO_TX_SYM 0
+#define CLK_UFSCFG_AO_REG_UNIPRO_RX_SYM0 1
+#define CLK_UFSCFG_AO_REG_UNIPRO_RX_SYM1 2
+#define CLK_UFSCFG_AO_REG_UNIPRO_SYS 3
+#define CLK_UFSCFG_AO_REG_U_SAP_CFG 4
+#define CLK_UFSCFG_AO_REG_U_PHY_TOP_AHB_S_BUS 5
+#define CLK_UFSCFG_AO_REG_NR_CLK 6
+
+/* UFSCFG_PDN_REG */
+#define CLK_UFSCFG_REG_UFSHCI_UFS 0
+#define CLK_UFSCFG_REG_UFSHCI_AES 1
+#define CLK_UFSCFG_REG_UFSHCI_U_AHB 2
+#define CLK_UFSCFG_REG_UFSHCI_U_AXI 3
+#define CLK_UFSCFG_PDN_REG_NR_CLK 4
+
+/* IMP_IIC_WRAP_WS */
+#define CLK_IMPWS_I2C2 0
+#define CLK_IMPWS_NR_CLK 1
+
+/* IMP_IIC_WRAP_E */
+#define CLK_IMPE_I2C0 0
+#define CLK_IMPE_I2C1 1
+#define CLK_IMPE_NR_CLK 2
+
+/* IMP_IIC_WRAP_S */
+#define CLK_IMPS_I2C3 0
+#define CLK_IMPS_I2C4 1
+#define CLK_IMPS_I2C5 2
+#define CLK_IMPS_I2C6 3
+#define CLK_IMPS_NR_CLK 4
+
+/* IMP_IIC_WRAP_EN */
+#define CLK_IMPEN_I2C7 0
+#define CLK_IMPEN_I2C8 1
+#define CLK_IMPEN_NR_CLK 2
+
+/* MFG */
+#define CLK_MFG_BG3D 0
+#define CLK_MFG_NR_CLK 1
+
+/* DISPSYS_CONFIG */
+#define CLK_MM_DISP_OVL0_4L 0
+#define CLK_MM_DISP_OVL1_4L 1
+#define CLK_MM_VPP_RSZ0 2
+#define CLK_MM_VPP_RSZ1 3
+#define CLK_MM_DISP_RDMA0 4
+#define CLK_MM_DISP_RDMA1 5
+#define CLK_MM_DISP_COLOR0 6
+#define CLK_MM_DISP_COLOR1 7
+#define CLK_MM_DISP_CCORR0 8
+#define CLK_MM_DISP_CCORR1 9
+#define CLK_MM_DISP_CCORR2 10
+#define CLK_MM_DISP_CCORR3 11
+#define CLK_MM_DISP_AAL0 12
+#define CLK_MM_DISP_AAL1 13
+#define CLK_MM_DISP_GAMMA0 14
+#define CLK_MM_DISP_GAMMA1 15
+#define CLK_MM_DISP_DITHER0 16
+#define CLK_MM_DISP_DITHER1 17
+#define CLK_MM_DISP_DSC_WRAP0 18
+#define CLK_MM_VPP_MERGE0 19
+#define CLK_MMSYS_0_DISP_DVO 20
+#define CLK_MMSYS_0_DISP_DSI0 21
+#define CLK_MM_DP_INTF0 22
+#define CLK_MM_DPI0 23
+#define CLK_MM_DISP_WDMA0 24
+#define CLK_MM_DISP_WDMA1 25
+#define CLK_MM_DISP_FAKE_ENG0 26
+#define CLK_MM_DISP_FAKE_ENG1 27
+#define CLK_MM_SMI_LARB 28
+#define CLK_MM_DISP_MUTEX0 29
+#define CLK_MM_DIPSYS_CONFIG 30
+#define CLK_MM_DUMMY 31
+#define CLK_MMSYS_1_DISP_DSI0 32
+#define CLK_MMSYS_1_LVDS_ENCODER 33
+#define CLK_MMSYS_1_DPI0 34
+#define CLK_MMSYS_1_DISP_DVO 35
+#define CLK_MM_DP_INTF 36
+#define CLK_MMSYS_1_LVDS_ENCODER_CTS 37
+#define CLK_MMSYS_1_DISP_DVO_AVT 38
+#define CLK_MM_NR_CLK 39
+
+/* IMGSYS1 */
+#define CLK_IMGSYS1_LARB9 0
+#define CLK_IMGSYS1_LARB11 1
+#define CLK_IMGSYS1_DIP 2
+#define CLK_IMGSYS1_GALS 3
+#define CLK_IMGSYS1_NR_CLK 4
+
+/* IMGSYS2 */
+#define CLK_IMGSYS2_LARB9 0
+#define CLK_IMGSYS2_LARB11 1
+#define CLK_IMGSYS2_MFB 2
+#define CLK_IMGSYS2_WPE 3
+#define CLK_IMGSYS2_MSS 4
+#define CLK_IMGSYS2_GALS 5
+#define CLK_IMGSYS2_NR_CLK 6
+
+/* VDEC_CORE */
+#define CLK_VDEC_CORE_LARB_CKEN 0
+#define CLK_VDEC_CORE_VDEC_CKEN 1
+#define CLK_VDEC_CORE_VDEC_ACTIVE 2
+#define CLK_VDEC_CORE_NR_CLK 3
+
+/* VENC_GCON */
+#define CLK_VEN1_CKE0_LARB 0
+#define CLK_VEN1_CKE1_VENC 1
+#define CLK_VEN1_CKE2_JPGENC 2
+#define CLK_VEN1_CKE3_JPGDEC 3
+#define CLK_VEN1_CKE4_JPGDEC_C1 4
+#define CLK_VEN1_CKE5_GALS 5
+#define CLK_VEN1_CKE6_GALS_SRAM 6
+#define CLK_VEN1_NR_CLK 7
+
+/* VLPCFG_REG */
+#define CLK_VLPCFG_REG_SCP 0
+#define CLK_VLPCFG_REG_RG_R_APXGPT_26M 1
+#define CLK_VLPCFG_REG_DPMSRCK_TEST 2
+#define CLK_VLPCFG_REG_RG_DPMSRRTC_TEST 3
+#define CLK_VLPCFG_REG_DPMSRULP_TEST 4
+#define CLK_VLPCFG_REG_SPMI_P_MST 5
+#define CLK_VLPCFG_REG_SPMI_P_MST_32K 6
+#define CLK_VLPCFG_REG_PMIF_SPMI_P_SYS 7
+#define CLK_VLPCFG_REG_PMIF_SPMI_P_TMR 8
+#define CLK_VLPCFG_REG_PMIF_SPMI_M_SYS 9
+#define CLK_VLPCFG_REG_PMIF_SPMI_M_TMR 10
+#define CLK_VLPCFG_REG_DVFSRC 11
+#define CLK_VLPCFG_REG_PWM_VLP 12
+#define CLK_VLPCFG_REG_SRCK 13
+#define CLK_VLPCFG_REG_SSPM_F26M 14
+#define CLK_VLPCFG_REG_SSPM_F32K 15
+#define CLK_VLPCFG_REG_SSPM_ULPOSC 16
+#define CLK_VLPCFG_REG_VLP_32K_COM 17
+#define CLK_VLPCFG_REG_VLP_26M_COM 18
+#define CLK_VLPCFG_REG_NR_CLK 19
+
+/* VLP_CKSYS */
+#define CLK_VLP_CK_SCP_SEL 0
+#define CLK_VLP_CK_PWRAP_ULPOSC_SEL 1
+#define CLK_VLP_CK_SPMI_P_MST_SEL 2
+#define CLK_VLP_CK_DVFSRC_SEL 3
+#define CLK_VLP_CK_PWM_VLP_SEL 4
+#define CLK_VLP_CK_AXI_VLP_SEL 5
+#define CLK_VLP_CK_SYSTIMER_26M_SEL 6
+#define CLK_VLP_CK_SSPM_SEL 7
+#define CLK_VLP_CK_SSPM_F26M_SEL 8
+#define CLK_VLP_CK_SRCK_SEL 9
+#define CLK_VLP_CK_SCP_SPI_SEL 10
+#define CLK_VLP_CK_SCP_IIC_SEL 11
+#define CLK_VLP_CK_SCP_SPI_HIGH_SPD_SEL 12
+#define CLK_VLP_CK_SCP_IIC_HIGH_SPD_SEL 13
+#define CLK_VLP_CK_SSPM_ULPOSC_SEL 14
+#define CLK_VLP_CK_APXGPT_26M_SEL 15
+#define CLK_VLP_CK_VADSP_SEL 16
+#define CLK_VLP_CK_VADSP_VOWPLL_SEL 17
+#define CLK_VLP_CK_VADSP_UARTHUB_BCLK_SEL 18
+#define CLK_VLP_CK_CAMTG0_SEL 19
+#define CLK_VLP_CK_CAMTG1_SEL 20
+#define CLK_VLP_CK_CAMTG2_SEL 21
+#define CLK_VLP_CK_AUD_ADC_SEL 22
+#define CLK_VLP_CK_KP_IRQ_GEN_SEL 23
+#define CLK_VLP_CK_VADSYS_VLP_26M_EN 24
+#define CLK_VLP_CK_SEJ_13M_EN 25
+#define CLK_VLP_CK_SEJ_26M_EN 26
+#define CLK_VLP_CK_FMIPI_CSI_UP26M_CK_EN 27
+#define CLK_VLP_CK_NR_CLK 28
+
+/* SCP_IIC */
+#define CLK_SCP_IIC_I2C0_W1S 0
+#define CLK_SCP_IIC_I2C1_W1S 1
+#define CLK_SCP_IIC_NR_CLK 2
+
+/* SCP */
+#define CLK_SCP_SET_SPI0 0
+#define CLK_SCP_SET_SPI1 1
+#define CLK_SCP_NR_CLK 2
+
+/* CAMSYS_MAIN */
+#define CLK_CAM_M_LARB13 0
+#define CLK_CAM_M_LARB14 1
+#define CLK_CAM_M_CAMSYS_MAIN_CAM 2
+#define CLK_CAM_M_CAMSYS_MAIN_CAMTG 3
+#define CLK_CAM_M_SENINF 4
+#define CLK_CAM_M_CAMSV1 5
+#define CLK_CAM_M_CAMSV2 6
+#define CLK_CAM_M_CAMSV3 7
+#define CLK_CAM_M_FAKE_ENG 8
+#define CLK_CAM_M_CAM2MM_GALS 9
+#define CLK_CAM_M_CAMSV4 10
+#define CLK_CAM_M_PDA 11
+#define CLK_CAM_M_NR_CLK 12
+
+/* CAMSYS_RAWA */
+#define CLK_CAM_RA_CAMSYS_RAWA_LARBX 0
+#define CLK_CAM_RA_CAMSYS_RAWA_CAM 1
+#define CLK_CAM_RA_CAMSYS_RAWA_CAMTG 2
+#define CLK_CAM_RA_NR_CLK 3
+
+/* CAMSYS_RAWB */
+#define CLK_CAM_RB_CAMSYS_RAWB_LARBX 0
+#define CLK_CAM_RB_CAMSYS_RAWB_CAM 1
+#define CLK_CAM_RB_CAMSYS_RAWB_CAMTG 2
+#define CLK_CAM_RB_NR_CLK 3
+
+/* IPESYS */
+#define CLK_IPE_LARB19 0
+#define CLK_IPE_LARB20 1
+#define CLK_IPE_SMI_SUBCOM 2
+#define CLK_IPE_FD 3
+#define CLK_IPE_FE 4
+#define CLK_IPE_RSC 5
+#define CLK_IPESYS_GALS 6
+#define CLK_IPE_NR_CLK 7
+
+/* VLPCFG_AO_REG */
+#define EN 0
+#define CLK_VLPCFG_AO_REG_NR_CLK 1
+
+/* DVFSRC_TOP */
+#define CLK_DVFSRC_TOP_DVFSRC_EN 0
+#define CLK_DVFSRC_TOP_NR_CLK 1
+
+/* MMINFRA_CONFIG */
+#define CLK_MMINFRA_GCE_D 0
+#define CLK_MMINFRA_GCE_M 1
+#define CLK_MMINFRA_SMI 2
+#define CLK_MMINFRA_GCE_26M 3
+#define CLK_MMINFRA_CONFIG_NR_CLK 4
+
+/* GCE_D */
+#define CLK_GCE_D_TOP 0
+#define CLK_GCE_D_NR_CLK 1
+
+/* GCE_M */
+#define CLK_GCE_M_TOP 0
+#define CLK_GCE_M_NR_CLK 1
+
+/* MDPSYS_CONFIG */
+#define CLK_MDP_MUTEX0 0
+#define CLK_MDP_APB_BUS 1
+#define CLK_MDP_SMI0 2
+#define CLK_MDP_RDMA0 3
+#define CLK_MDP_RDMA2 4
+#define CLK_MDP_HDR0 5
+#define CLK_MDP_AAL0 6
+#define CLK_MDP_RSZ0 7
+#define CLK_MDP_TDSHP0 8
+#define CLK_MDP_COLOR0 9
+#define CLK_MDP_WROT0 10
+#define CLK_MDP_FAKE_ENG0 11
+#define CLK_MDPSYS_CONFIG 12
+#define CLK_MDP_RDMA1 13
+#define CLK_MDP_RDMA3 14
+#define CLK_MDP_HDR1 15
+#define CLK_MDP_AAL1 16
+#define CLK_MDP_RSZ1 17
+#define CLK_MDP_TDSHP1 18
+#define CLK_MDP_COLOR1 19
+#define CLK_MDP_WROT1 20
+#define CLK_MDP_RSZ2 21
+#define CLK_MDP_WROT2 22
+#define CLK_MDP_RSZ3 23
+#define CLK_MDP_WROT3 24
+#define CLK_MDP_BIRSZ0 25
+#define CLK_MDP_BIRSZ1 26
+#define CLK_MDP_NR_CLK 27
+
+/* DBGAO */
+#define CLK_DBGAO_ATB_EN 0
+#define CLK_DBGAO_NR_CLK 1
+
+/* DEM */
+#define CLK_DEM_ATB_EN 0
+#define CLK_DEM_BUSCLK_EN 1
+#define CLK_DEM_SYSCLK_EN 2
+#define CLK_DEM_NR_CLK 3
+
+#endif /* _DT_BINDINGS_CLK_MT8189_H */
--
2.45.2
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/6] dt-bindings: power: mediatek: Add MT8189 power domain definitions
2025-08-18 11:57 [PATCH 0/6] Add support for MT8189 clock/power controller irving.ch.lin
` (2 preceding siblings ...)
2025-08-18 11:57 ` [PATCH 3/6] dt-bindings: clock: mediatek: Add MT8189 clock definitions irving.ch.lin
@ 2025-08-18 11:57 ` irving.ch.lin
2025-08-18 14:46 ` Krzysztof Kozlowski
2025-08-18 11:57 ` [PATCH 6/6] pmdomain: mediatek: Add power domain driver for MT8189 SoC irving.ch.lin
4 siblings, 1 reply; 14+ messages in thread
From: irving.ch.lin @ 2025-08-18 11:57 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu, irving-ch.lin
From: Irving-ch Lin <irving-ch.lin@mediatek.com>
Add device tree bindings for the power domains of MediaTek MT8189 SoC.
These definitions will be used to describe the power domain topology in
device tree sources.
Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
---
include/dt-bindings/power/mt8189-power.h | 38 ++++++++++++++++++++++++
1 file changed, 38 insertions(+)
create mode 100644 include/dt-bindings/power/mt8189-power.h
diff --git a/include/dt-bindings/power/mt8189-power.h b/include/dt-bindings/power/mt8189-power.h
new file mode 100644
index 000000000000..70a8c2113457
--- /dev/null
+++ b/include/dt-bindings/power/mt8189-power.h
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2025 MediaTek Inc.
+ * Author: Qiqi Wang <qiqi.wang@mediatek.com>
+ */
+
+#ifndef _DT_BINDINGS_POWER_MT8189_POWER_H
+#define _DT_BINDINGS_POWER_MT8189_POWER_H
+
+/* SPM */
+#define MT8189_POWER_DOMAIN_CONN 0
+#define MT8189_POWER_DOMAIN_AUDIO 1
+#define MT8189_POWER_DOMAIN_ADSP_TOP_DORMANT 2
+#define MT8189_POWER_DOMAIN_ADSP_INFRA 3
+#define MT8189_POWER_DOMAIN_ADSP_AO 4
+#define MT8189_POWER_DOMAIN_MM_INFRA 5
+#define MT8189_POWER_DOMAIN_ISP_IMG1 6
+#define MT8189_POWER_DOMAIN_ISP_IMG2 7
+#define MT8189_POWER_DOMAIN_ISP_IPE 8
+#define MT8189_POWER_DOMAIN_VDE0 9
+#define MT8189_POWER_DOMAIN_VEN0 10
+#define MT8189_POWER_DOMAIN_CAM_MAIN 11
+#define MT8189_POWER_DOMAIN_CAM_SUBA 12
+#define MT8189_POWER_DOMAIN_CAM_SUBB 13
+#define MT8189_POWER_DOMAIN_MDP0 14
+#define MT8189_POWER_DOMAIN_DISP 15
+#define MT8189_POWER_DOMAIN_DP_TX 16
+#define MT8189_POWER_DOMAIN_CSI_RX 17
+#define MT8189_POWER_DOMAIN_SSUSB 18
+#define MT8189_POWER_DOMAIN_MFG0 19
+#define MT8189_POWER_DOMAIN_MFG1 20
+#define MT8189_POWER_DOMAIN_MFG2 21
+#define MT8189_POWER_DOMAIN_MFG3 22
+#define MT8189_POWER_DOMAIN_EDP_TX_DORMANT 23
+#define MT8189_POWER_DOMAIN_PCIE 24
+#define MT8189_POWER_DOMAIN_PCIE_PHY 25
+
+#endif /* _DT_BINDINGS_POWER_MT8189_POWER_H */
--
2.45.2
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 6/6] pmdomain: mediatek: Add power domain driver for MT8189 SoC
2025-08-18 11:57 [PATCH 0/6] Add support for MT8189 clock/power controller irving.ch.lin
` (3 preceding siblings ...)
2025-08-18 11:57 ` [PATCH 4/6] dt-bindings: power: mediatek: Add MT8189 power domain definitions irving.ch.lin
@ 2025-08-18 11:57 ` irving.ch.lin
2025-08-18 23:57 ` kernel test robot
4 siblings, 1 reply; 14+ messages in thread
From: irving.ch.lin @ 2025-08-18 11:57 UTC (permalink / raw)
To: Michael Turquette, Stephen Boyd, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu, irving-ch.lin
From: Irving-ch Lin <irving-ch.lin@mediatek.com>
Introduce a new power domain (pmd) driver for the MediaTek mt8189 SoC.
This driver ports and refines the power domain framework, dividing
hardware blocks (CPU, GPU, peripherals, etc.) into independent power
domains for precise and energy-efficient power management.
Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
---
drivers/pmdomain/mediatek/mt8189-scpsys.h | 75 ++
drivers/pmdomain/mediatek/mtk-scpsys.c | 957 +++++++++++++++++++++-
2 files changed, 990 insertions(+), 42 deletions(-)
create mode 100644 drivers/pmdomain/mediatek/mt8189-scpsys.h
diff --git a/drivers/pmdomain/mediatek/mt8189-scpsys.h b/drivers/pmdomain/mediatek/mt8189-scpsys.h
new file mode 100644
index 000000000000..80e17fe3f705
--- /dev/null
+++ b/drivers/pmdomain/mediatek/mt8189-scpsys.h
@@ -0,0 +1,75 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2025 MediaTek Inc.
+ * Author: Qiqi Wang <qiqi.wang@mediatek.com>
+ */
+#ifndef __PMDOMAIN_MEDIATEK_MT8189_SCPSYS_H
+#define __PMDOMAIN_MEDIATEK_MT8189_SCPSYS_H
+
+#define MT8189_SPM_CONN_PWR_CON 0xe04
+#define MT8189_SPM_AUDIO_PWR_CON 0xe18
+#define MT8189_SPM_ADSP_TOP_PWR_CON 0xe1c
+#define MT8189_SPM_ADSP_INFRA_PWR_CON 0xe20
+#define MT8189_SPM_ADSP_AO_PWR_CON 0xe24
+#define MT8189_SPM_ISP_IMG1_PWR_CON 0xe28
+#define MT8189_SPM_ISP_IMG2_PWR_CON 0xe2c
+#define MT8189_SPM_ISP_IPE_PWR_CON 0xe30
+#define MT8189_SPM_VDE0_PWR_CON 0xe38
+#define MT8189_SPM_VEN0_PWR_CON 0xe40
+#define MT8189_SPM_CAM_MAIN_PWR_CON 0xe48
+#define MT8189_SPM_CAM_SUBA_PWR_CON 0xe50
+#define MT8189_SPM_CAM_SUBB_PWR_CON 0xe54
+#define MT8189_SPM_MDP0_PWR_CON 0xe68
+#define MT8189_SPM_DISP_PWR_CON 0xe70
+#define MT8189_SPM_MM_INFRA_PWR_CON 0xe78
+#define MT8189_SPM_DP_TX_PWR_CON 0xe80
+#define MT8189_SPM_CSI_RX_PWR_CON 0xe9c
+#define MT8189_SPM_SSUSB_PWR_CON 0xea8
+#define MT8189_SPM_MFG0_PWR_CON 0xeb4
+#define MT8189_SPM_MFG1_PWR_CON 0xeb8
+#define MT8189_SPM_MFG2_PWR_CON 0xebc
+#define MT8189_SPM_MFG3_PWR_CON 0xec0
+#define MT8189_SPM_EDP_TX_PWR_CON 0xf70
+#define MT8189_SPM_PCIE_PWR_CON 0xf74
+#define MT8189_SPM_PCIE_PHY_PWR_CON 0xf78
+
+#define MT8189_PROT_EN_EMISYS_STA_0_MM_INFRA (GENMASK(21, 20))
+#define MT8189_PROT_EN_INFRASYS_STA_0_CONN (BIT(8))
+#define MT8189_PROT_EN_INFRASYS_STA_1_CONN (BIT(12))
+#define MT8189_PROT_EN_INFRASYS_STA_0_MM_INFRA (BIT(16))
+#define MT8189_PROT_EN_INFRASYS_STA_1_MM_INFRA (BIT(11))
+#define MT8189_PROT_EN_INFRASYS_STA_1_MFG1 (BIT(20))
+#define MT8189_PROT_EN_MCU_STA_0_CONN (BIT(1))
+#define MT8189_PROT_EN_MCU_STA_0_CONN_2ND (BIT(0))
+#define MT8189_PROT_EN_MD_STA_0_MFG1 (BIT(0) | BIT(2))
+#define MT8189_PROT_EN_MD_STA_0_MFG1_2ND (BIT(4))
+#define MT8189_PROT_EN_MFG1 (GENMASK(5, 4))
+#define MT8189_PROT_EN_MM_INFRA_IGN (BIT(1))
+#define MT8189_PROT_EN_MM_INFRA_2_IGN (BIT(0))
+#define MT8189_PROT_EN_MMSYS_STA_0_CAM_MAIN (GENMASK(31, 30))
+#define MT8189_PROT_EN_MMSYS_STA_1_CAM_MAIN (GENMASK(10, 9))
+#define MT8189_PROT_EN_MMSYS_STA_0_DISP (GENMASK(1, 0))
+#define MT8189_PROT_EN_MMSYS_STA_0_ISP_IMG1 (BIT(3))
+#define MT8189_PROT_EN_MMSYS_STA_1_ISP_IMG1 (BIT(7))
+#define MT8189_PROT_EN_MMSYS_STA_0_ISP_IPE (BIT(2))
+#define MT8189_PROT_EN_MMSYS_STA_1_ISP_IPE (BIT(8))
+#define MT8189_PROT_EN_MMSYS_STA_0_MDP0 (BIT(18))
+#define MT8189_PROT_EN_MMSYS_STA_1_MM_INFRA (GENMASK(3, 2))
+#define MT8189_PROT_EN_MMSYS_STA_1_MM_INFRA_2ND (GENMASK(15, 7))
+#define MT8189_PROT_EN_MMSYS_STA_0_VDE0 (BIT(20))
+#define MT8189_PROT_EN_MMSYS_STA_1_VDE0 (BIT(13))
+#define MT8189_PROT_EN_MMSYS_STA_0_VEN0 (BIT(12))
+#define MT8189_PROT_EN_MMSYS_STA_1_VEN0 (BIT(12))
+#define MT8189_PROT_EN_PERISYS_STA_0_AUDIO (BIT(6))
+#define MT8189_PROT_EN_PERISYS_STA_0_SSUSB (BIT(7))
+
+enum {
+ MT8189_BP_INVALID_TYPE = 0,
+ MT8189_BP_IFR_TYPE = 1,
+ MT8189_BP_VLP_TYPE = 2,
+ MT8189_VLPCFG_REG_TYPE = 3,
+ MT8189_EMICFG_AO_MEM_TYPE = 4,
+ MT8189_BUS_TYPE_NUM,
+};
+
+#endif /* __PMDOMAIN_MEDIATEK_MT8189_SCPSYS_H */
diff --git a/drivers/pmdomain/mediatek/mtk-scpsys.c b/drivers/pmdomain/mediatek/mtk-scpsys.c
index 1a80c1537a43..ff0da0a5c615 100644
--- a/drivers/pmdomain/mediatek/mtk-scpsys.c
+++ b/drivers/pmdomain/mediatek/mtk-scpsys.c
@@ -3,6 +3,7 @@
* Copyright (c) 2015 Pengutronix, Sascha Hauer <kernel@pengutronix.de>
*/
#include <linux/clk.h>
+#include <linux/clk-provider.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/iopoll.h>
@@ -10,6 +11,7 @@
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/pm_domain.h>
+#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/soc/mediatek/infracfg.h>
@@ -19,12 +21,36 @@
#include <dt-bindings/power/mt7622-power.h>
#include <dt-bindings/power/mt7623a-power.h>
#include <dt-bindings/power/mt8173-power.h>
+#include <dt-bindings/power/mt8189-power.h>
+
+#include "mt8189-scpsys.h"
#define MTK_POLL_DELAY_US 10
#define MTK_POLL_TIMEOUT USEC_PER_SEC
+#define MTK_POLL_TIMEOUT_300MS (300 * USEC_PER_MSEC)
+#define MTK_POLL_IRQ_TIMEOUT USEC_PER_SEC
+#define MTK_POLL_HWV_PREPARE_CNT 2500
+#define MTK_POLL_HWV_PREPARE_US 2
+#define MTK_ACK_DELAY_US 50
+#define MTK_RTFF_DELAY_US 10
+#define MTK_STABLE_DELAY_US 100
+
+#define MTK_BUS_PROTECTION_RETY_TIMES 10
#define MTK_SCPD_ACTIVE_WAKEUP BIT(0)
#define MTK_SCPD_FWAIT_SRAM BIT(1)
+#define MTK_SCPD_SRAM_ISO BIT(2)
+#define MTK_SCPD_SRAM_SLP BIT(3)
+#define MTK_SCPD_BYPASS_INIT_ON BIT(4)
+#define MTK_SCPD_IS_PWR_CON_ON BIT(5)
+#define MTK_SCPD_HWV_OPS BIT(6)
+#define MTK_SCPD_NON_CPU_RTFF BIT(7)
+#define MTK_SCPD_PEXTP_PHY_RTFF BIT(8)
+#define MTK_SCPD_UFS_RTFF BIT(9)
+#define MTK_SCPD_RTFF_DELAY BIT(10)
+#define MTK_SCPD_IRQ_SAVE BIT(11)
+#define MTK_SCPD_ALWAYS_ON BIT(12)
+#define MTK_SCPD_KEEP_DEFAULT_OFF BIT(13)
#define MTK_SCPD_CAPS(_scpd, _x) ((_scpd)->data->caps & (_x))
#define SPM_VDE_PWR_CON 0x0210
@@ -56,6 +82,15 @@
#define PWR_ON_BIT BIT(2)
#define PWR_ON_2ND_BIT BIT(3)
#define PWR_CLK_DIS_BIT BIT(4)
+#define PWR_SRAM_CLKISO_BIT BIT(5)
+#define PWR_SRAM_ISOINT_B_BIT BIT(6)
+#define PWR_RTFF_SAVE BIT(24)
+#define PWR_RTFF_NRESTORE BIT(25)
+#define PWR_RTFF_CLK_DIS BIT(26)
+#define PWR_RTFF_SAVE_FLAG BIT(27)
+#define PWR_RTFF_UFS_CLK_DIS BIT(28)
+#define PWR_ACK BIT(30)
+#define PWR_ACK_2ND BIT(31)
#define PWR_STATUS_CONN BIT(1)
#define PWR_STATUS_DISP BIT(3)
@@ -78,10 +113,39 @@
#define PWR_STATUS_HIF1 BIT(26) /* MT7622 */
#define PWR_STATUS_WB BIT(27) /* MT7622 */
+#define _BUS_PROT(_type, _set_ofs, _clr_ofs, \
+ _en_ofs, _sta_ofs, _mask, _ack_mask, \
+ _ignore_clr_ack, _ignore_subsys_clk) { \
+ .type = _type, \
+ .set_ofs = _set_ofs, \
+ .clr_ofs = _clr_ofs, \
+ .en_ofs = _en_ofs, \
+ .sta_ofs = _sta_ofs, \
+ .mask = _mask, \
+ .ack_mask = _ack_mask, \
+ .ignore_clr_ack = _ignore_clr_ack, \
+ .ignore_subsys_clk = _ignore_subsys_clk, \
+ }
+
+#define BUS_PROT_IGN(_type, _set_ofs, _clr_ofs, \
+ _en_ofs, _sta_ofs, _mask) \
+ _BUS_PROT(_type, _set_ofs, _clr_ofs, \
+ _en_ofs, _sta_ofs, _mask, _mask, true, false)
+
+#define BUS_PROT_SUBSYS_CLK_IGN(_type, _set_ofs, _clr_ofs, \
+ _en_ofs, _sta_ofs, _mask) \
+ _BUS_PROT(_type, _set_ofs, _clr_ofs, \
+ _en_ofs, _sta_ofs, _mask, _mask, true, true)
+
+#define TEST_BP_ACK(bp, val) ((val & bp->ack_mask) == bp->ack_mask)
+#define scpsys_get_infracfg(pdev) \
+ syscon_regmap_lookup_by_phandle(pdev->dev.of_node, "infracfg")
+
enum clk_id {
CLK_NONE,
CLK_MM,
CLK_MFG,
+ CLK_MFG_TOP,
CLK_VENC,
CLK_VENC_LT,
CLK_ETHIF,
@@ -89,6 +153,9 @@ enum clk_id {
CLK_HIFSEL,
CLK_JPGDEC,
CLK_AUDIO,
+ CLK_DISP_AO_CONFIG,
+ CLK_DISP_DPC,
+ CLK_MDP,
CLK_MAX,
};
@@ -96,6 +163,7 @@ static const char * const clk_names[] = {
NULL,
"mm",
"mfg",
+ "mfg_top",
"venc",
"venc_lt",
"ethif",
@@ -103,10 +171,27 @@ static const char * const clk_names[] = {
"hif_sel",
"jpgdec",
"audio",
+ "disp_ao_config",
+ "disp_dpc",
+ "mdp",
NULL,
};
#define MAX_CLKS 3
+#define MAX_STEPS 4
+#define MAX_SUBSYS_CLKS 20
+
+struct bus_prot {
+ u32 type;
+ u32 set_ofs;
+ u32 clr_ofs;
+ u32 en_ofs;
+ u32 sta_ofs;
+ u32 mask;
+ u32 ack_mask;
+ bool ignore_clr_ack;
+ bool ignore_subsys_clk;
+};
/**
* struct scp_domain_data - scp domain data for power on/off flow
@@ -125,9 +210,13 @@ struct scp_domain_data {
int ctl_offs;
u32 sram_pdn_bits;
u32 sram_pdn_ack_bits;
+ u32 sram_slp_bits;
+ u32 sram_slp_ack_bits;
u32 bus_prot_mask;
enum clk_id clk_id[MAX_CLKS];
- u8 caps;
+ const char *subsys_clk_prefix;
+ struct bus_prot bp_table[MAX_STEPS];
+ u32 caps;
};
struct scp;
@@ -136,8 +225,11 @@ struct scp_domain {
struct generic_pm_domain genpd;
struct scp *scp;
struct clk *clk[MAX_CLKS];
+ struct clk *subsys_clk[MAX_SUBSYS_CLKS];
const struct scp_domain_data *data;
struct regulator *supply;
+ bool rtff_flag;
+ bool boot_status;
};
struct scp_ctrl_reg {
@@ -153,6 +245,8 @@ struct scp {
struct regmap *infracfg;
struct scp_ctrl_reg ctrl_reg;
bool bus_prot_reg_update;
+ struct regmap **bp_regmap;
+ int num_bp;
};
struct scp_subdomain {
@@ -167,6 +261,8 @@ struct scp_soc_data {
int num_subdomains;
const struct scp_ctrl_reg regs;
bool bus_prot_reg_update;
+ const char **bp_list;
+ int num_bp;
};
static int scpsys_domain_is_on(struct scp_domain *scpd)
@@ -191,6 +287,21 @@ static int scpsys_domain_is_on(struct scp_domain *scpd)
return -EINVAL;
}
+static bool scpsys_pwr_ack_is_on(struct scp_domain *scpd)
+{
+ u32 status = readl(scpd->scp->base + scpd->data->ctl_offs) & PWR_ACK;
+
+ return status ? true : false;
+}
+
+static bool scpsys_pwr_ack_2nd_is_on(struct scp_domain *scpd)
+{
+ u32 status = readl(scpd->scp->base + scpd->data->ctl_offs) &
+ PWR_ACK_2ND;
+
+ return status ? true : false;
+}
+
static int scpsys_regulator_enable(struct scp_domain *scpd)
{
if (!scpd->supply)
@@ -233,11 +344,19 @@ static int scpsys_clk_enable(struct clk *clk[], int max_num)
static int scpsys_sram_enable(struct scp_domain *scpd, void __iomem *ctl_addr)
{
u32 val;
- u32 pdn_ack = scpd->data->sram_pdn_ack_bits;
+ u32 ack_mask, ack_sta;
int tmp;
- val = readl(ctl_addr);
- val &= ~scpd->data->sram_pdn_bits;
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_SRAM_SLP)) {
+ ack_mask = scpd->data->sram_slp_ack_bits;
+ ack_sta = ack_mask;
+ val = readl(ctl_addr) | scpd->data->sram_slp_bits;
+ } else {
+ ack_mask = scpd->data->sram_pdn_ack_bits;
+ ack_sta = 0;
+ val = readl(ctl_addr) & ~scpd->data->sram_pdn_bits;
+ }
+
writel(val, ctl_addr);
/* Either wait until SRAM_PDN_ACK all 0 or have a force wait */
@@ -251,35 +370,184 @@ static int scpsys_sram_enable(struct scp_domain *scpd, void __iomem *ctl_addr)
} else {
/* Either wait until SRAM_PDN_ACK all 1 or 0 */
int ret = readl_poll_timeout(ctl_addr, tmp,
- (tmp & pdn_ack) == 0,
+ (tmp & ack_mask) == ack_sta,
MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
if (ret < 0)
return ret;
}
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_SRAM_ISO)) {
+ val = readl(ctl_addr) | PWR_SRAM_ISOINT_B_BIT;
+ writel(val, ctl_addr);
+ udelay(1);
+ val &= ~PWR_SRAM_CLKISO_BIT;
+ writel(val, ctl_addr);
+ }
+
return 0;
}
static int scpsys_sram_disable(struct scp_domain *scpd, void __iomem *ctl_addr)
{
u32 val;
- u32 pdn_ack = scpd->data->sram_pdn_ack_bits;
+ u32 ack_mask, ack_sta;
int tmp;
- val = readl(ctl_addr);
- val |= scpd->data->sram_pdn_bits;
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_SRAM_ISO)) {
+ val = readl(ctl_addr) | PWR_SRAM_CLKISO_BIT;
+ writel(val, ctl_addr);
+ val &= ~PWR_SRAM_ISOINT_B_BIT;
+ writel(val, ctl_addr);
+ udelay(1);
+ }
+
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_SRAM_SLP)) {
+ ack_mask = scpd->data->sram_slp_ack_bits;
+ ack_sta = 0;
+ val = readl(ctl_addr) & ~scpd->data->sram_slp_bits;
+ } else {
+ ack_mask = scpd->data->sram_pdn_ack_bits;
+ ack_sta = ack_mask;
+ val = readl(ctl_addr) | scpd->data->sram_pdn_bits;
+ }
writel(val, ctl_addr);
/* Either wait until SRAM_PDN_ACK all 1 or 0 */
return readl_poll_timeout(ctl_addr, tmp,
- (tmp & pdn_ack) == pdn_ack,
+ (tmp & ack_mask) == ack_sta,
MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
}
-static int scpsys_bus_protect_enable(struct scp_domain *scpd)
+static int set_bus_protection(struct regmap *map, struct bus_prot *bp)
+{
+ u32 val = 0;
+ int retry = 0;
+ int ret = 0;
+
+ while (retry <= MTK_BUS_PROTECTION_RETY_TIMES) {
+ if (bp->set_ofs)
+ regmap_write(map, bp->set_ofs, bp->mask);
+ else
+ regmap_update_bits(map, bp->en_ofs,
+ bp->mask, bp->mask);
+
+ /* check bus protect enable setting */
+ regmap_read(map, bp->en_ofs, &val);
+ if ((val & bp->mask) == bp->mask)
+ break;
+
+ retry++;
+ }
+
+ ret = regmap_read_poll_timeout_atomic(map, bp->sta_ofs, val,
+ TEST_BP_ACK(bp, val),
+ MTK_POLL_DELAY_US,
+ MTK_POLL_TIMEOUT);
+ if (ret < 0) {
+ pr_err("%s val=0x%x, mask=0x%x, (val & mask)=0x%x\n",
+ __func__, val, bp->ack_mask, (val & bp->ack_mask));
+ }
+
+ return ret;
+}
+
+static int clear_bus_protection(struct regmap *map, struct bus_prot *bp)
+{
+ u32 val = 0;
+ int ret = 0;
+
+ if (bp->clr_ofs)
+ regmap_write(map, bp->clr_ofs, bp->mask);
+ else
+ regmap_update_bits(map, bp->en_ofs, bp->mask, 0);
+
+ if (bp->ignore_clr_ack)
+ return 0;
+
+ ret = regmap_read_poll_timeout_atomic(map, bp->sta_ofs, val,
+ !(val & bp->ack_mask),
+ MTK_POLL_DELAY_US,
+ MTK_POLL_TIMEOUT);
+ if (ret < 0) {
+ pr_err("%s val=0x%x, mask=0x%x, (val & mask)=0x%x\n",
+ __func__, val, bp->ack_mask, (val & bp->ack_mask));
+ }
+ return ret;
+}
+
+static int scpsys_bus_protect_table_disable(struct scp_domain *scpd,
+ unsigned int index,
+ bool ignore_subsys_clk)
+{
+ struct scp *scp = scpd->scp;
+ const struct bus_prot *bp_table = scpd->data->bp_table;
+ int ret = 0;
+ int i;
+
+ for (i = index; i >= 0; i--) {
+ struct regmap *map;
+ struct bus_prot bp = bp_table[i];
+
+ if (bp.type == 0 || bp.type >= scp->num_bp)
+ continue;
+
+ if (ignore_subsys_clk != bp.ignore_subsys_clk)
+ continue;
+
+ map = scp->bp_regmap[bp.type];
+ if (!map)
+ continue;
+
+ ret = clear_bus_protection(map, &bp);
+ if (ret)
+ break;
+ }
+
+ return ret;
+}
+
+static int scpsys_bus_protect_table_enable(struct scp_domain *scpd,
+ bool ignore_subsys_clk)
+{
+ struct scp *scp = scpd->scp;
+ const struct bus_prot *bp_table = scpd->data->bp_table;
+ int ret = 0;
+ int i;
+
+ for (i = 0; i < MAX_STEPS; i++) {
+ struct regmap *map;
+ struct bus_prot bp = bp_table[i];
+
+ if (bp.type == 0 || bp.type >= scp->num_bp)
+ continue;
+
+ if (ignore_subsys_clk != bp.ignore_subsys_clk)
+ continue;
+
+ map = scp->bp_regmap[bp.type];
+ if (!map)
+ continue;
+
+ ret = set_bus_protection(map, &bp);
+ if (ret) {
+ scpsys_bus_protect_table_disable(scpd, i,
+ ignore_subsys_clk);
+ return ret;
+ }
+ }
+
+ return ret;
+}
+
+static int scpsys_bus_protect_enable(struct scp_domain *scpd,
+ bool ignore_subsys_clk)
{
struct scp *scp = scpd->scp;
+ if (scp->bp_regmap && scp->num_bp > 0)
+ return scpsys_bus_protect_table_enable(scpd,
+ ignore_subsys_clk);
+
if (!scpd->data->bus_prot_mask)
return 0;
@@ -288,10 +556,15 @@ static int scpsys_bus_protect_enable(struct scp_domain *scpd)
scp->bus_prot_reg_update);
}
-static int scpsys_bus_protect_disable(struct scp_domain *scpd)
+static int scpsys_bus_protect_disable(struct scp_domain *scpd,
+ bool ignore_subsys_clk)
{
struct scp *scp = scpd->scp;
+ if (scp->bp_regmap && scp->num_bp > 0)
+ return scpsys_bus_protect_table_disable(scpd, MAX_STEPS - 1,
+ ignore_subsys_clk);
+
if (!scpd->data->bus_prot_mask)
return 0;
@@ -308,6 +581,10 @@ static int scpsys_power_on(struct generic_pm_domain *genpd)
u32 val;
int ret, tmp;
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_KEEP_DEFAULT_OFF) &&
+ !scpd->boot_status)
+ return 0;
+
ret = scpsys_regulator_enable(scpd);
if (ret < 0)
return ret;
@@ -320,29 +597,114 @@ static int scpsys_power_on(struct generic_pm_domain *genpd)
val = readl(ctl_addr);
val |= PWR_ON_BIT;
writel(val, ctl_addr);
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_IS_PWR_CON_ON)) {
+ ret = readx_poll_timeout_atomic(scpsys_pwr_ack_is_on,
+ scpd, tmp, tmp > 0,
+ MTK_POLL_DELAY_US,
+ MTK_POLL_TIMEOUT);
+ if (ret < 0)
+ goto err_pwr_ack;
+
+ udelay(MTK_ACK_DELAY_US);
+ }
+
val |= PWR_ON_2ND_BIT;
writel(val, ctl_addr);
/* wait until PWR_ACK = 1 */
- ret = readx_poll_timeout(scpsys_domain_is_on, scpd, tmp, tmp > 0,
- MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_IS_PWR_CON_ON))
+ ret = readx_poll_timeout_atomic(scpsys_pwr_ack_2nd_is_on,
+ scpd, tmp, tmp > 0,
+ MTK_POLL_DELAY_US,
+ MTK_POLL_TIMEOUT);
+ else
+ ret = readx_poll_timeout(scpsys_domain_is_on,
+ scpd, tmp, tmp > 0,
+ MTK_POLL_DELAY_US,
+ MTK_POLL_TIMEOUT);
if (ret < 0)
goto err_pwr_ack;
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_PEXTP_PHY_RTFF) && scpd->rtff_flag) {
+ val |= PWR_RTFF_CLK_DIS;
+ writel(val, ctl_addr);
+ }
+
val &= ~PWR_CLK_DIS_BIT;
writel(val, ctl_addr);
val &= ~PWR_ISO_BIT;
writel(val, ctl_addr);
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_RTFF_DELAY) && scpd->rtff_flag)
+ udelay(MTK_RTFF_DELAY_US);
+
val |= PWR_RST_B_BIT;
writel(val, ctl_addr);
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_NON_CPU_RTFF)) {
+ val = readl(ctl_addr);
+ if (val & PWR_RTFF_SAVE_FLAG) {
+ val &= ~PWR_RTFF_SAVE_FLAG;
+ writel(val, ctl_addr);
+
+ val |= PWR_RTFF_CLK_DIS;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_NRESTORE;
+ writel(val, ctl_addr);
+
+ val |= PWR_RTFF_NRESTORE;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_CLK_DIS;
+ writel(val, ctl_addr);
+ }
+ } else if (MTK_SCPD_CAPS(scpd, MTK_SCPD_PEXTP_PHY_RTFF)) {
+ val = readl(ctl_addr);
+ if (val & PWR_RTFF_SAVE_FLAG) {
+ val &= ~PWR_RTFF_SAVE_FLAG;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_NRESTORE;
+ writel(val, ctl_addr);
+
+ val |= PWR_RTFF_NRESTORE;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_CLK_DIS;
+ writel(val, ctl_addr);
+ }
+ } else if (MTK_SCPD_CAPS(scpd, MTK_SCPD_UFS_RTFF)
+ && scpd->rtff_flag) {
+ val |= PWR_RTFF_UFS_CLK_DIS;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_NRESTORE;
+ writel(val, ctl_addr);
+
+ val |= PWR_RTFF_NRESTORE;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_UFS_CLK_DIS;
+ writel(val, ctl_addr);
+
+ scpd->rtff_flag = false;
+ }
+
+ ret = scpsys_bus_protect_disable(scpd, true);
+ if (ret < 0)
+ goto err_pwr_ack;
+
+ ret = scpsys_clk_enable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
+ if (ret < 0)
+ goto err_pwr_ack;
+
ret = scpsys_sram_enable(scpd, ctl_addr);
if (ret < 0)
goto err_pwr_ack;
- ret = scpsys_bus_protect_disable(scpd);
+ ret = scpsys_bus_protect_disable(scpd, false);
if (ret < 0)
goto err_pwr_ack;
@@ -366,7 +728,7 @@ static int scpsys_power_off(struct generic_pm_domain *genpd)
u32 val;
int ret, tmp;
- ret = scpsys_bus_protect_enable(scpd);
+ ret = scpsys_bus_protect_enable(scpd, false);
if (ret < 0)
goto out;
@@ -374,11 +736,53 @@ static int scpsys_power_off(struct generic_pm_domain *genpd)
if (ret < 0)
goto out;
+ scpsys_clk_disable(scpd->subsys_clk, MAX_SUBSYS_CLKS);
+
+ ret = scpsys_bus_protect_enable(scpd, true);
+ if (ret < 0)
+ goto out;
+
/* subsys power off */
val = readl(ctl_addr);
+
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_NON_CPU_RTFF) ||
+ MTK_SCPD_CAPS(scpd, MTK_SCPD_PEXTP_PHY_RTFF)) {
+ val |= PWR_RTFF_CLK_DIS;
+ writel(val, ctl_addr);
+
+ val |= PWR_RTFF_SAVE;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_SAVE;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_CLK_DIS;
+ writel(val, ctl_addr);
+
+ val |= PWR_RTFF_SAVE_FLAG;
+ writel(val, ctl_addr);
+ } else if (MTK_SCPD_CAPS(scpd, MTK_SCPD_UFS_RTFF)) {
+ val |= PWR_RTFF_UFS_CLK_DIS;
+ writel(val, ctl_addr);
+
+ val |= PWR_RTFF_SAVE;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_SAVE;
+ writel(val, ctl_addr);
+
+ val &= ~PWR_RTFF_UFS_CLK_DIS;
+ writel(val, ctl_addr);
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_UFS_RTFF))
+ scpd->rtff_flag = true;
+ }
+
val |= PWR_ISO_BIT;
writel(val, ctl_addr);
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_RTFF_DELAY) && scpd->rtff_flag)
+ udelay(1);
+
val &= ~PWR_RST_B_BIT;
writel(val, ctl_addr);
@@ -388,12 +792,29 @@ static int scpsys_power_off(struct generic_pm_domain *genpd)
val &= ~PWR_ON_BIT;
writel(val, ctl_addr);
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_IS_PWR_CON_ON)) {
+ ret = readx_poll_timeout_atomic(scpsys_pwr_ack_is_on,
+ scpd, tmp, tmp == 0,
+ MTK_POLL_DELAY_US,
+ MTK_POLL_TIMEOUT);
+ if (ret < 0)
+ goto out;
+ }
+
val &= ~PWR_ON_2ND_BIT;
writel(val, ctl_addr);
/* wait until PWR_ACK = 0 */
- ret = readx_poll_timeout(scpsys_domain_is_on, scpd, tmp, tmp == 0,
- MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_IS_PWR_CON_ON))
+ ret = readx_poll_timeout_atomic(scpsys_pwr_ack_2nd_is_on,
+ scpd, tmp, tmp == 0,
+ MTK_POLL_DELAY_US,
+ MTK_POLL_TIMEOUT);
+ else
+ ret = readx_poll_timeout(scpsys_domain_is_on,
+ scpd, tmp, tmp == 0,
+ MTK_POLL_DELAY_US,
+ MTK_POLL_TIMEOUT);
if (ret < 0)
goto out;
@@ -419,54 +840,145 @@ static void init_clks(struct platform_device *pdev, struct clk **clk)
clk[i] = devm_clk_get(&pdev->dev, clk_names[i]);
}
+static int init_subsys_clks(struct platform_device *pdev,
+ const char *prefix, struct clk **clk)
+{
+ struct device_node *node = pdev->dev.of_node;
+ u32 prefix_len, sub_clk_cnt = 0;
+ struct property *prop;
+ const char *clk_name;
+
+ if (!node) {
+ dev_err(&pdev->dev, "Cannot find scpsys node: %ld\n",
+ PTR_ERR(node));
+ return PTR_ERR(node);
+ }
+
+ prefix_len = strlen(prefix);
+
+ of_property_for_each_string(node, "clock-names", prop, clk_name) {
+ if (!strncmp(clk_name, prefix, prefix_len) &&
+ (strlen(clk_name) > prefix_len + 1) &&
+ (clk_name[prefix_len] == '-')) {
+ if (sub_clk_cnt >= MAX_SUBSYS_CLKS) {
+ dev_err(&pdev->dev,
+ "subsys clk out of range %d\n",
+ sub_clk_cnt);
+ return -EINVAL;
+ }
+
+ clk[sub_clk_cnt] = devm_clk_get(&pdev->dev, clk_name);
+
+ if (IS_ERR(clk[sub_clk_cnt])) {
+ dev_err(&pdev->dev,
+ "Subsys clk get fail %ld\n",
+ PTR_ERR(clk[sub_clk_cnt]));
+ return PTR_ERR(clk[sub_clk_cnt]);
+ }
+ sub_clk_cnt++;
+ }
+ }
+
+ return sub_clk_cnt;
+}
+
+static int mtk_pd_get_regmap(struct platform_device *pdev,
+ struct regmap **regmap,
+ const char *name)
+{
+ *regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, name);
+ if (PTR_ERR(*regmap) == -ENODEV) {
+ dev_notice(&pdev->dev, "%s regmap is null(%ld)\n",
+ name, PTR_ERR(*regmap));
+ *regmap = NULL;
+ } else if (IS_ERR(*regmap)) {
+ dev_notice(&pdev->dev, "Cannot find %s controller: %ld\n",
+ name, PTR_ERR(*regmap));
+ return PTR_ERR(*regmap);
+ }
+
+ return 0;
+}
+
+static bool scpsys_get_boot_status(struct scp_domain *scpd)
+{
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_IS_PWR_CON_ON))
+ return scpsys_pwr_ack_is_on(scpd) &&
+ scpsys_pwr_ack_2nd_is_on(scpd);
+ return scpsys_domain_is_on(scpd);
+}
+
static struct scp *init_scp(struct platform_device *pdev,
- const struct scp_domain_data *scp_domain_data, int num,
- const struct scp_ctrl_reg *scp_ctrl_reg,
- bool bus_prot_reg_update)
+ const struct scp_soc_data *soc)
{
struct genpd_onecell_data *pd_data;
+ struct resource *res;
int i, j;
struct scp *scp;
struct clk *clk[CLK_MAX];
+ int ret;
scp = devm_kzalloc(&pdev->dev, sizeof(*scp), GFP_KERNEL);
if (!scp)
return ERR_PTR(-ENOMEM);
- scp->ctrl_reg.pwr_sta_offs = scp_ctrl_reg->pwr_sta_offs;
- scp->ctrl_reg.pwr_sta2nd_offs = scp_ctrl_reg->pwr_sta2nd_offs;
+ scp->ctrl_reg.pwr_sta_offs = soc->regs.pwr_sta_offs;
+ scp->ctrl_reg.pwr_sta2nd_offs = soc->regs.pwr_sta2nd_offs;
- scp->bus_prot_reg_update = bus_prot_reg_update;
+ scp->bus_prot_reg_update = soc->bus_prot_reg_update;
scp->dev = &pdev->dev;
- scp->base = devm_platform_ioremap_resource(pdev, 0);
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ scp->base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(scp->base))
return ERR_CAST(scp->base);
- scp->domains = devm_kcalloc(&pdev->dev,
- num, sizeof(*scp->domains), GFP_KERNEL);
+ scp->domains = devm_kcalloc(&pdev->dev, soc->num_domains,
+ sizeof(*scp->domains), GFP_KERNEL);
if (!scp->domains)
return ERR_PTR(-ENOMEM);
pd_data = &scp->pd_data;
- pd_data->domains = devm_kcalloc(&pdev->dev,
- num, sizeof(*pd_data->domains), GFP_KERNEL);
+ pd_data->domains = devm_kcalloc(&pdev->dev, soc->num_domains,
+ sizeof(*pd_data->domains),
+ GFP_KERNEL);
if (!pd_data->domains)
return ERR_PTR(-ENOMEM);
- scp->infracfg = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
- "infracfg");
- if (IS_ERR(scp->infracfg)) {
- dev_err(&pdev->dev, "Cannot find infracfg controller: %ld\n",
+ if (soc->bp_list && soc->num_bp > 0) {
+ scp->num_bp = soc->num_bp;
+ scp->bp_regmap = devm_kcalloc(&pdev->dev, scp->num_bp,
+ sizeof(*scp->bp_regmap),
+ GFP_KERNEL);
+ if (!scp->bp_regmap)
+ return ERR_PTR(-ENOMEM);
+
+ /*
+ * get bus prot regmap from dts node,
+ * 0 means invalid bus type
+ */
+ for (i = 1; i < scp->num_bp; i++) {
+ ret = mtk_pd_get_regmap(pdev, &scp->bp_regmap[i],
+ soc->bp_list[i]);
+ if (ret)
+ return ERR_PTR(ret);
+ }
+ } else {
+ scp->infracfg = scpsys_get_infracfg(pdev);
+
+ if (IS_ERR(scp->infracfg)) {
+ dev_err(&pdev->dev,
+ "Cannot find infracfg controller: %ld\n",
PTR_ERR(scp->infracfg));
- return ERR_CAST(scp->infracfg);
+ return ERR_CAST(scp->infracfg);
+ }
}
- for (i = 0; i < num; i++) {
+ for (i = 0; i < soc->num_domains; i++) {
struct scp_domain *scpd = &scp->domains[i];
- const struct scp_domain_data *data = &scp_domain_data[i];
+ const struct scp_domain_data *data = &soc->domains[i];
scpd->supply = devm_regulator_get_optional(&pdev->dev, data->name);
if (IS_ERR(scpd->supply)) {
@@ -477,14 +989,14 @@ static struct scp *init_scp(struct platform_device *pdev,
}
}
- pd_data->num_domains = num;
+ pd_data->num_domains = soc->num_domains;
init_clks(pdev, clk);
- for (i = 0; i < num; i++) {
+ for (i = 0; i < soc->num_domains; i++) {
struct scp_domain *scpd = &scp->domains[i];
struct generic_pm_domain *genpd = &scpd->genpd;
- const struct scp_domain_data *data = &scp_domain_data[i];
+ const struct scp_domain_data *data = &soc->domains[i];
pd_data->domains[i] = genpd;
scpd->scp = scp;
@@ -503,11 +1015,26 @@ static struct scp *init_scp(struct platform_device *pdev,
scpd->clk[j] = c;
}
+ if (data->subsys_clk_prefix) {
+ ret = init_subsys_clks(pdev,
+ data->subsys_clk_prefix,
+ scpd->subsys_clk);
+ if (ret < 0) {
+ dev_notice(&pdev->dev,
+ "%s: subsys clk unavailable\n",
+ data->name);
+ return ERR_PTR(ret);
+ }
+ }
genpd->name = data->name;
genpd->power_off = scpsys_power_off;
genpd->power_on = scpsys_power_on;
if (MTK_SCPD_CAPS(scpd, MTK_SCPD_ACTIVE_WAKEUP))
genpd->flags |= GENPD_FLAG_ACTIVE_WAKEUP;
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_IRQ_SAVE))
+ genpd->flags |= GENPD_FLAG_IRQ_SAFE;
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_ALWAYS_ON))
+ genpd->flags |= GENPD_FLAG_ALWAYS_ON;
}
return scp;
@@ -530,8 +1057,17 @@ static void mtk_register_power_domains(struct platform_device *pdev,
* software. The unused domains will be switched off during
* late_init time.
*/
- on = !WARN_ON(genpd->power_on(genpd) < 0);
-
+ if (MTK_SCPD_CAPS(scpd, MTK_SCPD_KEEP_DEFAULT_OFF)) {
+ scpd->boot_status = scpsys_get_boot_status(scpd);
+ if (scpd->boot_status)
+ on = !WARN_ON(genpd->power_on(genpd) < 0);
+ else
+ on = false;
+ } else if (MTK_SCPD_CAPS(scpd, MTK_SCPD_BYPASS_INIT_ON)) {
+ on = false;
+ } else {
+ on = !WARN_ON(genpd->power_on(genpd) < 0);
+ }
pm_genpd_init(genpd, NULL, !on);
}
@@ -1009,6 +1545,328 @@ static const struct scp_subdomain scp_subdomain_mt8173[] = {
{MT8173_POWER_DOMAIN_MFG_2D, MT8173_POWER_DOMAIN_MFG},
};
+/*
+ * MT8189 power domain support
+ */
+static const char *mt8189_bus_list[MT8189_BUS_TYPE_NUM] = {
+ [MT8189_BP_IFR_TYPE] = "infra-infracfg-ao-reg-bus",
+ [MT8189_BP_VLP_TYPE] = "vlpcfg-reg-bus",
+ [MT8189_VLPCFG_REG_TYPE] = "vlpcfg-reg-bus",
+ [MT8189_EMICFG_AO_MEM_TYPE] = "emicfg-ao-mem",
+};
+
+static const struct scp_domain_data scp_domain_mt8189_spm_data[] = {
+ [MT8189_POWER_DOMAIN_CONN] = {
+ .name = "conn",
+ .ctl_offs = MT8189_SPM_CONN_PWR_CON,
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c94, 0x0c98, 0x0c90, 0x0c9c,
+ MT8189_PROT_EN_MCU_STA_0_CONN),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c54, 0x0c58, 0x0c50, 0x0c5c,
+ MT8189_PROT_EN_INFRASYS_STA_1_CONN),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c94, 0x0c98, 0x0c90, 0x0c9c,
+ MT8189_PROT_EN_MCU_STA_0_CONN_2ND),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c44, 0x0c48, 0x0c40, 0x0c4c,
+ MT8189_PROT_EN_INFRASYS_STA_0_CONN),
+ },
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_AUDIO] = {
+ .name = "audio",
+ .ctl_offs = MT8189_SPM_AUDIO_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c84, 0x0c88, 0x0c80, 0x0c8c,
+ MT8189_PROT_EN_PERISYS_STA_0_AUDIO),
+ },
+ .clk_id = {CLK_AUDIO},
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_ADSP_TOP_DORMANT] = {
+ .name = "adsp-top-dormant",
+ .ctl_offs = MT8189_SPM_ADSP_TOP_PWR_CON,
+ .sram_slp_bits = GENMASK(9, 9),
+ .sram_slp_ack_bits = GENMASK(13, 13),
+ .caps = MTK_SCPD_SRAM_ISO | MTK_SCPD_SRAM_SLP |
+ MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_ACTIVE_WAKEUP |
+ MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_ADSP_INFRA] = {
+ .name = "adsp-infra",
+ .ctl_offs = MT8189_SPM_ADSP_INFRA_PWR_CON,
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_ADSP_AO] = {
+ .name = "adsp-ao",
+ .ctl_offs = MT8189_SPM_ADSP_AO_PWR_CON,
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_ISP_IMG1] = {
+ .name = "isp-img1",
+ .ctl_offs = MT8189_SPM_ISP_IMG1_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c14, 0x0c18, 0x0c10, 0x0c1c,
+ MT8189_PROT_EN_MMSYS_STA_0_ISP_IMG1),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c24, 0x0c28, 0x0c20, 0x0c2c,
+ MT8189_PROT_EN_MMSYS_STA_1_ISP_IMG1),
+ },
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_ISP_IMG2] = {
+ .name = "isp-img2",
+ .ctl_offs = MT8189_SPM_ISP_IMG2_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_ISP_IPE] = {
+ .name = "isp-ipe",
+ .ctl_offs = MT8189_SPM_ISP_IPE_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c14, 0x0c18, 0x0c10, 0x0c1c,
+ MT8189_PROT_EN_MMSYS_STA_0_ISP_IPE),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c24, 0x0c28, 0x0c20, 0x0c2c,
+ MT8189_PROT_EN_MMSYS_STA_1_ISP_IPE),
+ },
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_VDE0] = {
+ .name = "vde0",
+ .ctl_offs = MT8189_SPM_VDE0_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c14, 0x0c18, 0x0c10, 0x0c1c,
+ MT8189_PROT_EN_MMSYS_STA_0_VDE0),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c24, 0x0c28, 0x0c20, 0x0c2c,
+ MT8189_PROT_EN_MMSYS_STA_1_VDE0),
+ },
+ .clk_id = {CLK_VDEC},
+ .subsys_clk_prefix = "vdec",
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_VEN0] = {
+ .name = "ven0",
+ .ctl_offs = MT8189_SPM_VEN0_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c14, 0x0c18, 0x0c10, 0x0c1c,
+ MT8189_PROT_EN_MMSYS_STA_0_VEN0),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c24, 0x0c28, 0x0c20, 0x0c2c,
+ MT8189_PROT_EN_MMSYS_STA_1_VEN0),
+ },
+ .clk_id = {CLK_VENC},
+ .subsys_clk_prefix = "venc",
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_CAM_MAIN] = {
+ .name = "cam-main",
+ .ctl_offs = MT8189_SPM_CAM_MAIN_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c14, 0x0c18, 0x0c10, 0x0c1C,
+ MT8189_PROT_EN_MMSYS_STA_0_CAM_MAIN),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c24, 0x0c28, 0x0c20, 0x0c2C,
+ MT8189_PROT_EN_MMSYS_STA_1_CAM_MAIN),
+ },
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_CAM_SUBA] = {
+ .name = "cam-suba",
+ .ctl_offs = MT8189_SPM_CAM_SUBA_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_CAM_SUBB] = {
+ .name = "cam-subb",
+ .ctl_offs = MT8189_SPM_CAM_SUBB_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_MDP0] = {
+ .name = "mdp0",
+ .ctl_offs = MT8189_SPM_MDP0_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c14, 0x0c18, 0x0c10, 0x0c1c,
+ MT8189_PROT_EN_MMSYS_STA_0_MDP0),
+ },
+ .clk_id = {CLK_MDP},
+ .subsys_clk_prefix = "mdp0",
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_DISP] = {
+ .name = "disp",
+ .ctl_offs = MT8189_SPM_DISP_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c14, 0x0c18, 0x0c10, 0x0c1c,
+ MT8189_PROT_EN_MMSYS_STA_0_DISP),
+ },
+ .clk_id = {CLK_DISP_AO_CONFIG},
+ .subsys_clk_prefix = "disp",
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_MM_INFRA] = {
+ .name = "mm-infra",
+ .ctl_offs = MT8189_SPM_MM_INFRA_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c24, 0x0c28, 0x0c20, 0x0c2c,
+ MT8189_PROT_EN_MMSYS_STA_1_MM_INFRA),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c24, 0x0c28, 0x0c20, 0x0c2c,
+ MT8189_PROT_EN_MMSYS_STA_1_MM_INFRA_2ND),
+ BUS_PROT_SUBSYS_CLK_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c24, 0x0c28, 0x0c20, 0x0c2c,
+ MT8189_PROT_EN_MM_INFRA_IGN),
+ BUS_PROT_SUBSYS_CLK_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c24, 0x0c28, 0x0c20, 0x0c2c,
+ MT8189_PROT_EN_MM_INFRA_2_IGN),
+ },
+ .clk_id = {CLK_MM},
+ .subsys_clk_prefix = "mm_infra",
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_DP_TX] = {
+ .name = "dp-tx",
+ .ctl_offs = MT8189_SPM_DP_TX_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_CSI_RX] = {
+ .name = "csi-rx",
+ .ctl_offs = MT8189_SPM_CSI_RX_PWR_CON,
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_KEEP_DEFAULT_OFF,
+ },
+ [MT8189_POWER_DOMAIN_SSUSB] = {
+ .name = "ssusb",
+ .ctl_offs = MT8189_SPM_SSUSB_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c84, 0x0c88, 0x0c80, 0x0c8c,
+ MT8189_PROT_EN_PERISYS_STA_0_SSUSB),
+ },
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_ACTIVE_WAKEUP,
+ },
+ [MT8189_POWER_DOMAIN_MFG0] = {
+ .name = "mfg0",
+ .ctl_offs = MT8189_SPM_MFG0_PWR_CON,
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ .clk_id = {CLK_MFG_TOP},
+ },
+ [MT8189_POWER_DOMAIN_MFG1] = {
+ .name = "mfg1",
+ .ctl_offs = MT8189_SPM_MFG1_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .bp_table = {
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0c54, 0x0c58, 0x0c50, 0x0C5c,
+ MT8189_PROT_EN_INFRASYS_STA_1_MFG1),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0ca4, 0x0ca8, 0x0ca0, 0x0cac,
+ MT8189_PROT_EN_MD_STA_0_MFG1),
+ BUS_PROT_IGN(MT8189_BP_IFR_TYPE,
+ 0x0ca4, 0x0ca8, 0x0ca0, 0x0cac,
+ MT8189_PROT_EN_MD_STA_0_MFG1_2ND),
+ BUS_PROT_IGN(MT8189_EMICFG_AO_MEM_TYPE,
+ 0x0084, 0x0088, 0x0080, 0x008c,
+ MT8189_PROT_EN_MFG1),
+ },
+ .clk_id = {CLK_MFG},
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_MFG2] = {
+ .name = "mfg2",
+ .ctl_offs = MT8189_SPM_MFG2_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_MFG3] = {
+ .name = "mfg3",
+ .ctl_offs = MT8189_SPM_MFG3_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_EDP_TX_DORMANT] = {
+ .name = "edp-tx-dormant",
+ .ctl_offs = MT8189_SPM_EDP_TX_PWR_CON,
+ .sram_slp_bits = GENMASK(9, 9),
+ .sram_slp_ack_bits = 0,
+ .caps = MTK_SCPD_SRAM_ISO | MTK_SCPD_SRAM_SLP |
+ MTK_SCPD_IS_PWR_CON_ON,
+ },
+ [MT8189_POWER_DOMAIN_PCIE] = {
+ .name = "pcie",
+ .ctl_offs = MT8189_SPM_PCIE_PWR_CON,
+ .sram_pdn_bits = GENMASK(8, 8),
+ .sram_pdn_ack_bits = GENMASK(12, 12),
+ .caps = MTK_SCPD_IS_PWR_CON_ON | MTK_SCPD_ACTIVE_WAKEUP,
+ },
+ [MT8189_POWER_DOMAIN_PCIE_PHY] = {
+ .name = "pcie-phy",
+ .ctl_offs = MT8189_SPM_PCIE_PHY_PWR_CON,
+ .caps = MTK_SCPD_IS_PWR_CON_ON,
+ },
+};
+
+static const struct scp_subdomain scp_subdomain_mt8189_spm[] = {
+ {MT8189_POWER_DOMAIN_ADSP_AO, MT8189_POWER_DOMAIN_ADSP_INFRA},
+ {MT8189_POWER_DOMAIN_ADSP_INFRA, MT8189_POWER_DOMAIN_ADSP_TOP_DORMANT},
+ {MT8189_POWER_DOMAIN_MM_INFRA, MT8189_POWER_DOMAIN_ISP_IMG1},
+ {MT8189_POWER_DOMAIN_ISP_IMG1, MT8189_POWER_DOMAIN_ISP_IMG2},
+ {MT8189_POWER_DOMAIN_MM_INFRA, MT8189_POWER_DOMAIN_ISP_IPE},
+ {MT8189_POWER_DOMAIN_MM_INFRA, MT8189_POWER_DOMAIN_VDE0},
+ {MT8189_POWER_DOMAIN_MM_INFRA, MT8189_POWER_DOMAIN_VEN0},
+ {MT8189_POWER_DOMAIN_MM_INFRA, MT8189_POWER_DOMAIN_CAM_MAIN},
+ {MT8189_POWER_DOMAIN_CAM_MAIN, MT8189_POWER_DOMAIN_CAM_SUBA},
+ {MT8189_POWER_DOMAIN_CAM_MAIN, MT8189_POWER_DOMAIN_CAM_SUBB},
+ {MT8189_POWER_DOMAIN_MM_INFRA, MT8189_POWER_DOMAIN_MDP0},
+ {MT8189_POWER_DOMAIN_MM_INFRA, MT8189_POWER_DOMAIN_DISP},
+ {MT8189_POWER_DOMAIN_DISP, MT8189_POWER_DOMAIN_DP_TX},
+ {MT8189_POWER_DOMAIN_MFG0, MT8189_POWER_DOMAIN_MFG1},
+ {MT8189_POWER_DOMAIN_MFG1, MT8189_POWER_DOMAIN_MFG2},
+ {MT8189_POWER_DOMAIN_MFG1, MT8189_POWER_DOMAIN_MFG3},
+ {MT8189_POWER_DOMAIN_DP_TX, MT8189_POWER_DOMAIN_EDP_TX_DORMANT},
+ {MT8189_POWER_DOMAIN_PCIE, MT8189_POWER_DOMAIN_PCIE_PHY},
+};
+
static const struct scp_soc_data mt2701_data = {
.domains = scp_domain_data_mt2701,
.num_domains = ARRAY_SIZE(scp_domain_data_mt2701),
@@ -1075,6 +1933,19 @@ static const struct scp_soc_data mt8173_data = {
.bus_prot_reg_update = true,
};
+static const struct scp_soc_data mt8189_spm_data = {
+ .domains = scp_domain_mt8189_spm_data,
+ .num_domains = ARRAY_SIZE(scp_domain_mt8189_spm_data),
+ .subdomains = scp_subdomain_mt8189_spm,
+ .num_subdomains = ARRAY_SIZE(scp_subdomain_mt8189_spm),
+ .regs = {
+ .pwr_sta_offs = 0xF40,
+ .pwr_sta2nd_offs = 0xF44,
+ },
+ .bp_list = mt8189_bus_list,
+ .num_bp = MT8189_BUS_TYPE_NUM,
+};
+
/*
* scpsys driver init
*/
@@ -1098,6 +1969,9 @@ static const struct of_device_id of_scpsys_match_tbl[] = {
}, {
.compatible = "mediatek,mt8173-scpsys",
.data = &mt8173_data,
+ }, {
+ .compatible = "mediatek,mt8189-scpsys",
+ .data = &mt8189_spm_data,
}, {
/* sentinel */
}
@@ -1113,8 +1987,7 @@ static int scpsys_probe(struct platform_device *pdev)
soc = of_device_get_match_data(&pdev->dev);
- scp = init_scp(pdev, soc->domains, soc->num_domains, &soc->regs,
- soc->bus_prot_reg_update);
+ scp = init_scp(pdev, soc);
if (IS_ERR(scp))
return PTR_ERR(scp);
--
2.45.2
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/6] dt-bindings: clock: mediatek: Add new MT8189 clock
2025-08-18 11:57 ` [PATCH 1/6] dt-bindings: clock: mediatek: Add new MT8189 clock irving.ch.lin
@ 2025-08-18 14:36 ` Rob Herring (Arm)
2025-08-18 14:42 ` Krzysztof Kozlowski
1 sibling, 0 replies; 14+ messages in thread
From: Rob Herring (Arm) @ 2025-08-18 14:36 UTC (permalink / raw)
To: irving.ch.lin
Cc: linux-kernel, Conor Dooley, linux-clk, Richard Cochran, netdev,
AngeloGioacchino Del Regno, linux-arm-kernel, Stephen Boyd,
linux-pm, Krzysztof Kozlowski, Michael Turquette, jh.hsu,
Qiqi Wang, sirius.wang, Project_Global_Chrome_Upstream_Group,
linux-mediatek, vince-wl.liu, Ulf Hansson, Matthias Brugger,
devicetree
On Mon, 18 Aug 2025 19:57:29 +0800, irving.ch.lin wrote:
> From: Irving-ch Lin <irving-ch.lin@mediatek.com>
>
> Add the new binding documentation for system clock
> and functional clock on MediaTek MT8189.
>
> Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
> ---
> .../bindings/clock/mediatek,mt8189-clock.yaml | 89 +++++++++++++++++++
> .../clock/mediatek,mt8189-sys-clock.yaml | 58 ++++++++++++
> 2 files changed, 147 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/clock/mediatek,mt8189-clock.yaml
> create mode 100644 Documentation/devicetree/bindings/clock/mediatek,mt8189-sys-clock.yaml
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/clock/mediatek,mt8189-clock.example.dtb: imp_iic_wrap_ws_clk@11b21000 (mediatek,mt8189-iic-wrap-ws): reg: [[0, 296882176], [0, 4096]] is too long
from schema $id: http://devicetree.org/schemas/clock/mediatek,mt8189-clock.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/clock/mediatek,mt8189-sys-clock.example.dtb: topckgen_clk@10000000 (mediatek,mt8189-topckgen): reg: [[0, 268435456], [0, 4096]] is too long
from schema $id: http://devicetree.org/schemas/clock/mediatek,mt8189-sys-clock.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/clock/mediatek,mt8189-sys-clock.example.dtb: topckgen_clk@10000000 (mediatek,mt8189-topckgen): reg: [[0, 268435456], [0, 4096]] is too long
from schema $id: http://devicetree.org/schemas/mfd/syscon-common.yaml#
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20250818115754.1067154-2-irving-ch.lin@mediatek.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/6] dt-bindings: power: mediatek: Add new MT8189 power
2025-08-18 11:57 ` [PATCH 2/6] dt-bindings: power: mediatek: Add new MT8189 power irving.ch.lin
@ 2025-08-18 14:37 ` Rob Herring (Arm)
2025-08-18 14:45 ` Krzysztof Kozlowski
1 sibling, 0 replies; 14+ messages in thread
From: Rob Herring (Arm) @ 2025-08-18 14:37 UTC (permalink / raw)
To: irving.ch.lin
Cc: Krzysztof Kozlowski, vince-wl.liu, Conor Dooley, Ulf Hansson,
linux-kernel, devicetree, linux-pm, Michael Turquette,
sirius.wang, linux-arm-kernel, jh.hsu, linux-mediatek,
Matthias Brugger, Stephen Boyd, Qiqi Wang, netdev,
Richard Cochran, AngeloGioacchino Del Regno,
Project_Global_Chrome_Upstream_Group, linux-clk
On Mon, 18 Aug 2025 19:57:30 +0800, irving.ch.lin wrote:
> From: Irving-ch Lin <irving-ch.lin@mediatek.com>
>
> Add the new binding documentation for power controller
> on MediaTek MT8189.
>
> Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
> ---
> .../mediatek,mt8189-power-controller.yaml | 94 +++++++++++++++++++
> 1 file changed, 94 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.example.dts:18:18: fatal error: dt-bindings/clock/mt8189-clk.h: No such file or directory
18 | #include <dt-bindings/clock/mt8189-clk.h>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [scripts/Makefile.dtbs:132: Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.example.dtb] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [/builds/robherring/dt-review-ci/linux/Makefile:1525: dt_binding_check] Error 2
make: *** [Makefile:248: __sub-make] Error 2
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20250818115754.1067154-3-irving-ch.lin@mediatek.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/6] dt-bindings: clock: mediatek: Add new MT8189 clock
2025-08-18 11:57 ` [PATCH 1/6] dt-bindings: clock: mediatek: Add new MT8189 clock irving.ch.lin
2025-08-18 14:36 ` Rob Herring (Arm)
@ 2025-08-18 14:42 ` Krzysztof Kozlowski
1 sibling, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-18 14:42 UTC (permalink / raw)
To: irving.ch.lin, Michael Turquette, Stephen Boyd, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Matthias Brugger,
AngeloGioacchino Del Regno, Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu
On 18/08/2025 13:57, irving.ch.lin wrote:
> From: Irving-ch Lin <irving-ch.lin@mediatek.com>
>
> Add the new binding documentation for system clock
> and functional clock on MediaTek MT8189.
>
> Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
Never tested so just quick review to for obvious issues. I won't bother
with full review :(
> +
> +examples:
> + - |
> + imp_iic_wrap_ws_clk@11b21000 {
1. Follow closely DTS coding style.
2. Node names should be generic. See also an explanation and list of
examples (not exhaustive) in DT specification:
https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/6] dt-bindings: power: mediatek: Add new MT8189 power
2025-08-18 11:57 ` [PATCH 2/6] dt-bindings: power: mediatek: Add new MT8189 power irving.ch.lin
2025-08-18 14:37 ` Rob Herring (Arm)
@ 2025-08-18 14:45 ` Krzysztof Kozlowski
1 sibling, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-18 14:45 UTC (permalink / raw)
To: irving.ch.lin, Michael Turquette, Stephen Boyd, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Matthias Brugger,
AngeloGioacchino Del Regno, Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu
On 18/08/2025 13:57, irving.ch.lin wrote:
> From: Irving-ch Lin <irving-ch.lin@mediatek.com>
>
> Add the new binding documentation for power controller
> on MediaTek MT8189.
>
> Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
> ---
> .../mediatek,mt8189-power-controller.yaml | 94 +++++++++++++++++++
> 1 file changed, 94 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml
>
> diff --git a/Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml b/Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml
> new file mode 100644
> index 000000000000..1bf8f94858c8
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/mediatek,mt8189-power-controller.yaml
> @@ -0,0 +1,94 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/power/mediatek,mt8189-power-controller.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: MediaTek Power Domains Controller for MT8189
> +
> +maintainers:
> + - Qiqi Wang <qiqi.wang@mediatek.com>
> +
> +description: |
> + MediaTek processors include support for multiple power domains which can be
> + powered up/down by software based on different application scenes to save power.
> +
> + IP cores belonging to a power domain should contain a 'power-domains'
> + property that is a phandle for SCPSYS node representing the domain.
> +
> +properties:
> + $nodename:
> + pattern: '^power-controller(@[0-9a-f]+)?$'
Drop. Reg is not optional.
> +
> + compatible:
> + enum:
> + - mediatek,mt8189-scpsys
> +
reg goes here.
> + '#power-domain-cells':
> + const: 1
> +
> + reg:
> + description: physical base address and size of the power-controller's register area.
No. Don't use AI tools... Look how this is written based on other bindings.
> +
> + infra-infracfg-ao-reg-bus:
Follow established practice... You do not get common properties.
> + $ref: /schemas/types.yaml#/definitions/phandle
> + description: phandle to the device containing the infracfg register range.
Also do not say what is obvious from property name, but explain the purpose.
> +
> + emicfg-ao-mem:
> + $ref: /schemas/types.yaml#/definitions/phandle
> + description: phandle to the device containing the emicfg register range.
> +
> + vlpcfg-reg-bus:
> + $ref: /schemas/types.yaml#/definitions/phandle
> + description: phandle to the device containing the vlpcfg (very low power config) register range.
> +
> + clocks:
> + description: |
> + A number of phandles to clocks that need to be enabled during domain
> + power-up sequencing.
> +
> + clock-names:
> + description: |
> + List of names of clocks, in order to match the power-up sequencing
> + for each power domain we need to group the clocks by name. BASIC
> + clocks need to be enabled before enabling the corresponding power
> + domain, and should not have a '-' in their name (i.e mm, mfg, venc).
> + SUSBYS clocks need to be enabled before releasing the bus protection,
> + and should contain a '-' in their name (i.e mm-0, isp-0, cam-0).
> +
> + In order to follow properly the power-up sequencing, the clocks must
> + be specified by order, adding first the BASIC clocks followed by the
> + SUSBSYS clocks.
> +
> + domain-supply:
> + description: domain regulator supply.
> +
> +required:
> + - compatible
> + - reg
Incomplete. Devices cannot work without power and many other things.
Sorry, but this binding is very poor and I feel like you did not put
enough of effort to write correct one. You are not independent
contributor, but do it as part of Mediatek, so I do not understand why
in Mediatek you cannot do basic in-house review.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/6] dt-bindings: clock: mediatek: Add MT8189 clock definitions
2025-08-18 11:57 ` [PATCH 3/6] dt-bindings: clock: mediatek: Add MT8189 clock definitions irving.ch.lin
@ 2025-08-18 14:46 ` Krzysztof Kozlowski
2025-08-18 14:47 ` Krzysztof Kozlowski
1 sibling, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-18 14:46 UTC (permalink / raw)
To: irving.ch.lin, Michael Turquette, Stephen Boyd, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Matthias Brugger,
AngeloGioacchino Del Regno, Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu
On 18/08/2025 13:57, irving.ch.lin wrote:
> From: Irving-ch Lin <irving-ch.lin@mediatek.com>
>
> Add device tree bindings for the clock of MediaTek MT8189 SoC.
> These definitions will be used to describe the clock topology in
> device tree sources.
>
> Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
> ---
> include/dt-bindings/clock/mt8189-clk.h | 612 +++++++++++++++++++++++++
This is not an independent commit.
Also, incorrect name - use proper vendor prefix.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/6] dt-bindings: power: mediatek: Add MT8189 power domain definitions
2025-08-18 11:57 ` [PATCH 4/6] dt-bindings: power: mediatek: Add MT8189 power domain definitions irving.ch.lin
@ 2025-08-18 14:46 ` Krzysztof Kozlowski
0 siblings, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-18 14:46 UTC (permalink / raw)
To: irving.ch.lin, Michael Turquette, Stephen Boyd, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Matthias Brugger,
AngeloGioacchino Del Regno, Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu
On 18/08/2025 13:57, irving.ch.lin wrote:
> From: Irving-ch Lin <irving-ch.lin@mediatek.com>
>
> Add device tree bindings for the power domains of MediaTek MT8189 SoC.
> These definitions will be used to describe the power domain topology in
> device tree sources.
>
> Signed-off-by: Irving-ch Lin <irving-ch.lin@mediatek.com>
> ---
> include/dt-bindings/power/mt8189-power.h | 38 ++++++++++++++++++++++++
Same issues.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/6] dt-bindings: clock: mediatek: Add MT8189 clock definitions
2025-08-18 11:57 ` [PATCH 3/6] dt-bindings: clock: mediatek: Add MT8189 clock definitions irving.ch.lin
2025-08-18 14:46 ` Krzysztof Kozlowski
@ 2025-08-18 14:47 ` Krzysztof Kozlowski
1 sibling, 0 replies; 14+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-18 14:47 UTC (permalink / raw)
To: irving.ch.lin, Michael Turquette, Stephen Boyd, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Matthias Brugger,
AngeloGioacchino Del Regno, Ulf Hansson, Richard Cochran
Cc: Qiqi Wang, linux-clk, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu
On 18/08/2025 13:57, irving.ch.lin wrote:
> +#define CLK_MDP_NR_CLK 27
That's not a binding. Drop everywhere. Mediatek already received such
feedback.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 6/6] pmdomain: mediatek: Add power domain driver for MT8189 SoC
2025-08-18 11:57 ` [PATCH 6/6] pmdomain: mediatek: Add power domain driver for MT8189 SoC irving.ch.lin
@ 2025-08-18 23:57 ` kernel test robot
0 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2025-08-18 23:57 UTC (permalink / raw)
To: irving.ch.lin, Michael Turquette, Stephen Boyd, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Matthias Brugger,
AngeloGioacchino Del Regno, Ulf Hansson, Richard Cochran
Cc: oe-kbuild-all, Qiqi Wang, linux-clk, devicetree, linux-kernel,
linux-arm-kernel, linux-mediatek, linux-pm, netdev,
Project_Global_Chrome_Upstream_Group, sirius.wang, vince-wl.liu,
jh.hsu, irving-ch.lin
Hi irving.ch.lin,
kernel test robot noticed the following build warnings:
[auto build test WARNING on clk/clk-next]
[also build test WARNING on robh/for-next linus/master v6.17-rc2 next-20250818]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/irving-ch-lin/dt-bindings-clock-mediatek-Add-new-MT8189-clock/20250818-200449
base: https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git clk-next
patch link: https://lore.kernel.org/r/20250818115754.1067154-7-irving-ch.lin%40mediatek.com
patch subject: [PATCH 6/6] pmdomain: mediatek: Add power domain driver for MT8189 SoC
config: arm-randconfig-001-20250819 (https://download.01.org/0day-ci/archive/20250819/202508190709.36QIqpVt-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 12.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250819/202508190709.36QIqpVt-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202508190709.36QIqpVt-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> Warning: drivers/pmdomain/mediatek/mtk-scpsys.c:219 struct member 'sram_slp_bits' not described in 'scp_domain_data'
>> Warning: drivers/pmdomain/mediatek/mtk-scpsys.c:219 struct member 'sram_slp_ack_bits' not described in 'scp_domain_data'
>> Warning: drivers/pmdomain/mediatek/mtk-scpsys.c:219 struct member 'subsys_clk_prefix' not described in 'scp_domain_data'
>> Warning: drivers/pmdomain/mediatek/mtk-scpsys.c:219 struct member 'bp_table' not described in 'scp_domain_data'
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-08-19 0:22 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-18 11:57 [PATCH 0/6] Add support for MT8189 clock/power controller irving.ch.lin
2025-08-18 11:57 ` [PATCH 1/6] dt-bindings: clock: mediatek: Add new MT8189 clock irving.ch.lin
2025-08-18 14:36 ` Rob Herring (Arm)
2025-08-18 14:42 ` Krzysztof Kozlowski
2025-08-18 11:57 ` [PATCH 2/6] dt-bindings: power: mediatek: Add new MT8189 power irving.ch.lin
2025-08-18 14:37 ` Rob Herring (Arm)
2025-08-18 14:45 ` Krzysztof Kozlowski
2025-08-18 11:57 ` [PATCH 3/6] dt-bindings: clock: mediatek: Add MT8189 clock definitions irving.ch.lin
2025-08-18 14:46 ` Krzysztof Kozlowski
2025-08-18 14:47 ` Krzysztof Kozlowski
2025-08-18 11:57 ` [PATCH 4/6] dt-bindings: power: mediatek: Add MT8189 power domain definitions irving.ch.lin
2025-08-18 14:46 ` Krzysztof Kozlowski
2025-08-18 11:57 ` [PATCH 6/6] pmdomain: mediatek: Add power domain driver for MT8189 SoC irving.ch.lin
2025-08-18 23:57 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).