Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'v6.2-next-soc' of https://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux into soc/drivers

Introduce MediaTek regulator coupler driver to ensure that the SRAM
voltage in par with the GPU voltage. This allows for a stable use of the
GPU.

mtk-mutex:
- add support for MT8188 vdosys0 path
- allow it to be build as module
- add support for MT8195 vdosys1 path

mmsys:
- add MT8188 vdosys0 path
- allow to be build as a module
- add MT8195 vdosys1 path
- add support for CMDQ
- allow for up to 64 reset bits
- add supprot for the MT8195 vppsys[0,1] pathes

pm-domains:
- keep power for the MT8186 ADSP on by default
- add support for MT8188
- add support for buck isolation needed in specific pm-domains for
MT8188 and MT8192

mtk-svs:
- enable IRQ later to allow using kexec
- several improvments on the code base
- fix modalias

pmic wrapper:
- convert binding to yaml. As this is thightly coupled to the MT6357
PMIC, I took patches regarding it as well.

* tag 'v6.2-next-soc' of https://git.kernel.org/pub/scm/linux/kernel/git/matthias.bgg/linux: (41 commits)
soc: mediatek: mtk-svs: add missing MODULE_DEVICE_TABLE
soc: mediatek: mtk-devapc: Switch to devm_clk_get_enabled()
soc: mtk-svs: mt8183: refactor o_slope calculation
soc: mediatek: mtk-svs: delete superfluous platform data entries
soc: mediatek: mtk-svs: move svs_platform_probe into probe
soc: mediatek: mtk-svs: improve readability of platform_probe
soc: mediatek: mtk-svs: clean up platform probing
soc: mediatek: mtk-svs: keep svs alive if CONFIG_DEBUG_FS not supported
soc: mediatek: mtk-svs: Use pm_runtime_resume_and_get() in svs_init01()
soc: mediatek: mtk-svs: reset svs when svs_resume() fail
soc: mediatek: mtk-svs: restore default voltages when svs_init02() fail
soc: mediatek: mmsys: add support for MT8195 VPPSYS
dt-bindings: arm: mediatek: mmsys: Add support for MT8195 VPPSYS
soc: mediatek: Introduce mediatek-regulator-coupler driver
soc: mediatek: mtk-svs: Enable the IRQ later
soc: mediatek: add mtk-mutex support for mt8195 vdosys1
soc: mediatek: add mtk-mutex component - dp_intf1
soc: mediatek: mmsys: add reset control for MT8195 vdosys1
soc: mediatek: mmsys: add mmsys for support 64 reset bits
soc: mediatek: add cmdq support of mtk-mmsys config API for mt8195 vdosys1
...

Link: https://lore.kernel.org/r/396d51fc-81f3-4a2b-d7a7-b966bfe3002a@gmail.com
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+1987 -222
+4
Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
··· 31 31 - mediatek,mt8173-mmsys 32 32 - mediatek,mt8183-mmsys 33 33 - mediatek,mt8186-mmsys 34 + - mediatek,mt8188-vdosys0 34 35 - mediatek,mt8192-mmsys 36 + - mediatek,mt8195-vdosys1 37 + - mediatek,mt8195-vppsys0 38 + - mediatek,mt8195-vppsys1 35 39 - mediatek,mt8365-mmsys 36 40 - const: syscon 37 41
+1
Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
··· 26 26 enum: 27 27 - mediatek,mt6323-keys 28 28 - mediatek,mt6331-keys 29 + - mediatek,mt6357-keys 29 30 - mediatek,mt6358-keys 30 31 - mediatek,mt6397-keys 31 32
+1 -1
Documentation/devicetree/bindings/leds/leds-mt6323.txt
··· 9 9 For MT6323 MFD bindings see: 10 10 Documentation/devicetree/bindings/mfd/mt6397.txt 11 11 For MediaTek PMIC wrapper bindings see: 12 - Documentation/devicetree/bindings/soc/mediatek/pwrap.txt 12 + Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml 13 13 14 14 Required properties: 15 15 - compatible : Must be "mediatek,mt6323-led"
+111
Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/mfd/mediatek,mt6357.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: MediaTek MT6357 PMIC 8 + 9 + maintainers: 10 + - Flora Fu <flora.fu@mediatek.com> 11 + - Alexandre Mergnat <amergnat@baylibre.com> 12 + 13 + description: | 14 + MT6357 is a power management system chip containing 5 buck 15 + converters and 29 LDOs. Supported features are audio codec, 16 + USB battery charging, fuel gauge, RTC 17 + 18 + This is a multifunction device with the following sub modules: 19 + - Regulator 20 + - RTC 21 + - Keys 22 + 23 + It is interfaced to host controller using SPI interface by a proprietary hardware 24 + called PMIC wrapper or pwrap. This MFD is a child device of pwrap. 25 + See the following for pwrap node definitions: 26 + Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml 27 + 28 + properties: 29 + compatible: 30 + const: mediatek,mt6357 31 + 32 + interrupts: 33 + maxItems: 1 34 + 35 + interrupt-controller: true 36 + 37 + "#interrupt-cells": 38 + const: 2 39 + 40 + regulators: 41 + type: object 42 + $ref: /schemas/regulator/mediatek,mt6357-regulator.yaml 43 + description: 44 + List of MT6357 BUCKs and LDOs regulators. 45 + 46 + rtc: 47 + type: object 48 + $ref: /schemas/rtc/rtc.yaml# 49 + description: 50 + MT6357 Real Time Clock. 51 + properties: 52 + compatible: 53 + const: mediatek,mt6357-rtc 54 + start-year: true 55 + required: 56 + - compatible 57 + 58 + keys: 59 + type: object 60 + $ref: /schemas/input/mediatek,pmic-keys.yaml 61 + description: 62 + MT6357 power and home keys. 63 + 64 + required: 65 + - compatible 66 + - regulators 67 + 68 + additionalProperties: false 69 + 70 + examples: 71 + - | 72 + #include <dt-bindings/interrupt-controller/arm-gic.h> 73 + 74 + pwrap { 75 + pmic { 76 + compatible = "mediatek,mt6357"; 77 + 78 + interrupt-parent = <&pio>; 79 + interrupts = <145 IRQ_TYPE_LEVEL_HIGH>; 80 + interrupt-controller; 81 + #interrupt-cells = <2>; 82 + 83 + regulators { 84 + mt6357_vproc_reg: buck-vproc { 85 + regulator-name = "vproc"; 86 + regulator-min-microvolt = <518750>; 87 + regulator-max-microvolt = <1312500>; 88 + regulator-ramp-delay = <6250>; 89 + regulator-enable-ramp-delay = <220>; 90 + regulator-always-on; 91 + }; 92 + 93 + // ... 94 + 95 + mt6357_vusb33_reg: ldo-vusb33 { 96 + regulator-name = "vusb33"; 97 + regulator-min-microvolt = <3000000>; 98 + regulator-max-microvolt = <3100000>; 99 + regulator-enable-ramp-delay = <264>; 100 + }; 101 + }; 102 + 103 + rtc { 104 + compatible = "mediatek,mt6357-rtc"; 105 + }; 106 + 107 + keys { 108 + compatible = "mediatek,mt6357-keys"; 109 + }; 110 + }; 111 + };
+1 -1
Documentation/devicetree/bindings/mfd/mt6397.txt
··· 13 13 It is interfaced to host controller using SPI interface by a proprietary hardware 14 14 called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap. 15 15 See the following for pwarp node definitions: 16 - ../soc/mediatek/pwrap.txt 16 + ../soc/mediatek/mediatek,pwrap.yaml 17 17 18 18 This document describes the binding for MFD device and its sub module. 19 19
+2
Documentation/devicetree/bindings/power/mediatek,power-controller.yaml
··· 28 28 - mediatek,mt8173-power-controller 29 29 - mediatek,mt8183-power-controller 30 30 - mediatek,mt8186-power-controller 31 + - mediatek,mt8188-power-controller 31 32 - mediatek,mt8192-power-controller 32 33 - mediatek,mt8195-power-controller 33 34 ··· 85 84 "include/dt-bindings/power/mt8167-power.h" - for MT8167 type power domain. 86 85 "include/dt-bindings/power/mt8173-power.h" - for MT8173 type power domain. 87 86 "include/dt-bindings/power/mt8183-power.h" - for MT8183 type power domain. 87 + "include/dt-bindings/power/mediatek,mt8188-power.h" - for MT8188 type power domain. 88 88 "include/dt-bindings/power/mt8192-power.h" - for MT8192 type power domain. 89 89 "include/dt-bindings/power/mt8195-power.h" - for MT8195 type power domain. 90 90 maxItems: 1
+1
Documentation/devicetree/bindings/soc/mediatek/mediatek,mutex.yaml
··· 32 32 - mediatek,mt8183-disp-mutex 33 33 - mediatek,mt8186-disp-mutex 34 34 - mediatek,mt8186-mdp3-mutex 35 + - mediatek,mt8188-disp-mutex 35 36 - mediatek,mt8192-disp-mutex 36 37 - mediatek,mt8195-disp-mutex 37 38
+147
Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/soc/mediatek/mediatek,pwrap.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Mediatek PMIC Wrapper 8 + 9 + maintainers: 10 + - Flora Fu <flora.fu@mediatek.com> 11 + - Alexandre Mergnat <amergnat@baylibre.com> 12 + 13 + description: 14 + On MediaTek SoCs the PMIC is connected via SPI. The SPI master interface 15 + is not directly visible to the CPU, but only through the PMIC wrapper 16 + inside the SoC. The communication between the SoC and the PMIC can 17 + optionally be encrypted. Also a non standard Dual IO SPI mode can be 18 + used to increase speed. 19 + 20 + IP Pairing 21 + 22 + On MT8135 the pins of some SoC internal peripherals can be on the PMIC. 23 + The signals of these pins are routed over the SPI bus using the pwrap 24 + bridge. In the binding description below the properties needed for bridging 25 + are marked with "IP Pairing". These are optional on SoCs which do not support 26 + IP Pairing 27 + 28 + properties: 29 + compatible: 30 + oneOf: 31 + - items: 32 + - enum: 33 + - mediatek,mt2701-pwrap 34 + - mediatek,mt6765-pwrap 35 + - mediatek,mt6779-pwrap 36 + - mediatek,mt6797-pwrap 37 + - mediatek,mt6873-pwrap 38 + - mediatek,mt7622-pwrap 39 + - mediatek,mt8135-pwrap 40 + - mediatek,mt8173-pwrap 41 + - mediatek,mt8183-pwrap 42 + - mediatek,mt8186-pwrap 43 + - mediatek,mt8188-pwrap 44 + - mediatek,mt8195-pwrap 45 + - mediatek,mt8365-pwrap 46 + - mediatek,mt8516-pwrap 47 + - items: 48 + - enum: 49 + - mediatek,mt8186-pwrap 50 + - mediatek,mt8195-pwrap 51 + - const: syscon 52 + 53 + reg: 54 + minItems: 1 55 + items: 56 + - description: PMIC wrapper registers 57 + - description: IP pairing registers 58 + 59 + reg-names: 60 + minItems: 1 61 + items: 62 + - const: pwrap 63 + - const: pwrap-bridge 64 + 65 + interrupts: 66 + maxItems: 1 67 + 68 + clocks: 69 + minItems: 2 70 + items: 71 + - description: SPI bus clock 72 + - description: Main module clock 73 + - description: System module clock 74 + - description: Timer module clock 75 + 76 + clock-names: 77 + minItems: 2 78 + items: 79 + - const: spi 80 + - const: wrap 81 + - const: sys 82 + - const: tmr 83 + 84 + resets: 85 + minItems: 1 86 + items: 87 + - description: PMIC wrapper reset 88 + - description: IP pairing reset 89 + 90 + reset-names: 91 + minItems: 1 92 + items: 93 + - const: pwrap 94 + - const: pwrap-bridge 95 + 96 + pmic: 97 + type: object 98 + 99 + required: 100 + - compatible 101 + - reg 102 + - reg-names 103 + - interrupts 104 + - clocks 105 + - clock-names 106 + 107 + dependentRequired: 108 + resets: [reset-names] 109 + 110 + allOf: 111 + - if: 112 + properties: 113 + compatible: 114 + contains: 115 + const: mediatek,mt8365-pwrap 116 + then: 117 + properties: 118 + clocks: 119 + minItems: 4 120 + 121 + clock-names: 122 + minItems: 4 123 + 124 + additionalProperties: false 125 + 126 + examples: 127 + - | 128 + #include <dt-bindings/interrupt-controller/irq.h> 129 + #include <dt-bindings/interrupt-controller/arm-gic.h> 130 + #include <dt-bindings/reset/mt8135-resets.h> 131 + 132 + soc { 133 + #address-cells = <2>; 134 + #size-cells = <2>; 135 + pwrap@1000f000 { 136 + compatible = "mediatek,mt8135-pwrap"; 137 + reg = <0 0x1000f000 0 0x1000>, 138 + <0 0x11017000 0 0x1000>; 139 + reg-names = "pwrap", "pwrap-bridge"; 140 + interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>; 141 + clocks = <&clk26m>, <&clk26m>; 142 + clock-names = "spi", "wrap"; 143 + resets = <&infracfg MT8135_INFRA_PMIC_WRAP_RST>, 144 + <&pericfg MT8135_PERI_PWRAP_BRIDGE_SW_RST>; 145 + reset-names = "pwrap", "pwrap-bridge"; 146 + }; 147 + };
-75
Documentation/devicetree/bindings/soc/mediatek/pwrap.txt
··· 1 - MediaTek PMIC Wrapper Driver 2 - 3 - This document describes the binding for the MediaTek PMIC wrapper. 4 - 5 - On MediaTek SoCs the PMIC is connected via SPI. The SPI master interface 6 - is not directly visible to the CPU, but only through the PMIC wrapper 7 - inside the SoC. The communication between the SoC and the PMIC can 8 - optionally be encrypted. Also a non standard Dual IO SPI mode can be 9 - used to increase speed. 10 - 11 - IP Pairing 12 - 13 - on MT8135 the pins of some SoC internal peripherals can be on the PMIC. 14 - The signals of these pins are routed over the SPI bus using the pwrap 15 - bridge. In the binding description below the properties needed for bridging 16 - are marked with "IP Pairing". These are optional on SoCs which do not support 17 - IP Pairing 18 - 19 - Required properties in pwrap device node. 20 - - compatible: 21 - "mediatek,mt2701-pwrap" for MT2701/7623 SoCs 22 - "mediatek,mt6765-pwrap" for MT6765 SoCs 23 - "mediatek,mt6779-pwrap" for MT6779 SoCs 24 - "mediatek,mt6797-pwrap" for MT6797 SoCs 25 - "mediatek,mt6873-pwrap" for MT6873/8192 SoCs 26 - "mediatek,mt7622-pwrap" for MT7622 SoCs 27 - "mediatek,mt8135-pwrap" for MT8135 SoCs 28 - "mediatek,mt8173-pwrap" for MT8173 SoCs 29 - "mediatek,mt8183-pwrap" for MT8183 SoCs 30 - "mediatek,mt8186-pwrap" for MT8186 SoCs 31 - "mediatek,mt8188-pwrap", "mediatek,mt8195-pwrap" for MT8188 SoCs 32 - "mediatek,mt8195-pwrap" for MT8195 SoCs 33 - "mediatek,mt8365-pwrap" for MT8365 SoCs 34 - "mediatek,mt8516-pwrap" for MT8516 SoCs 35 - - interrupts: IRQ for pwrap in SOC 36 - - reg-names: "pwrap" is required; "pwrap-bridge" is optional. 37 - "pwrap": Main registers base 38 - "pwrap-bridge": bridge base (IP Pairing) 39 - - reg: Must contain an entry for each entry in reg-names. 40 - - clock-names: Must include the following entries: 41 - "spi": SPI bus clock 42 - "wrap": Main module clock 43 - "sys": Optional system module clock 44 - "tmr": Optional timer module clock 45 - - clocks: Must contain an entry for each entry in clock-names. 46 - 47 - Optional properities: 48 - - reset-names: Some SoCs include the following entries: 49 - "pwrap" 50 - "pwrap-bridge" (IP Pairing) 51 - - resets: Must contain an entry for each entry in reset-names. 52 - - pmic: Using either MediaTek PMIC MFD as the child device of pwrap 53 - See the following for child node definitions: 54 - Documentation/devicetree/bindings/mfd/mt6397.txt 55 - or the regulator-only device as the child device of pwrap, such as MT6380. 56 - See the following definitions for such kinds of devices. 57 - Documentation/devicetree/bindings/regulator/mt6380-regulator.txt 58 - 59 - Example: 60 - pwrap: pwrap@1000f000 { 61 - compatible = "mediatek,mt8135-pwrap"; 62 - reg = <0 0x1000f000 0 0x1000>, 63 - <0 0x11017000 0 0x1000>; 64 - reg-names = "pwrap", "pwrap-bridge"; 65 - interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>; 66 - resets = <&infracfg MT8135_INFRA_PMIC_WRAP_RST>, 67 - <&pericfg MT8135_PERI_PWRAP_BRIDGE_SW_RST>; 68 - reset-names = "pwrap", "pwrap-bridge"; 69 - clocks = <&clk26m>, <&clk26m>; 70 - clock-names = "spi", "wrap"; 71 - 72 - pmic { 73 - compatible = "mediatek,mt6397"; 74 - }; 75 - };
+17
drivers/input/keyboard/mtk-pmic-keys.c
··· 10 10 #include <linux/kernel.h> 11 11 #include <linux/mfd/mt6323/registers.h> 12 12 #include <linux/mfd/mt6331/registers.h> 13 + #include <linux/mfd/mt6357/registers.h> 13 14 #include <linux/mfd/mt6358/registers.h> 14 15 #include <linux/mfd/mt6397/core.h> 15 16 #include <linux/mfd/mt6397/registers.h> ··· 89 88 MTK_PMIC_MT6331_HOMEKEY_RST), 90 89 .pmic_rst_reg = MT6331_TOP_RST_MISC, 91 90 .rst_lprst_mask = MTK_PMIC_MT6331_RST_DU_MASK, 91 + }; 92 + 93 + static const struct mtk_pmic_regs mt6357_regs = { 94 + .keys_regs[MTK_PMIC_PWRKEY_INDEX] = 95 + MTK_PMIC_KEYS_REGS(MT6357_TOPSTATUS, 96 + 0x2, MT6357_PSC_TOP_INT_CON0, 0x5, 97 + MTK_PMIC_PWRKEY_RST), 98 + .keys_regs[MTK_PMIC_HOMEKEY_INDEX] = 99 + MTK_PMIC_KEYS_REGS(MT6357_TOPSTATUS, 100 + 0x8, MT6357_PSC_TOP_INT_CON0, 0xa, 101 + MTK_PMIC_HOMEKEY_INDEX), 102 + .pmic_rst_reg = MT6357_TOP_RST_MISC, 103 + .rst_lprst_mask = MTK_PMIC_RST_DU_MASK, 92 104 }; 93 105 94 106 static const struct mtk_pmic_regs mt6358_regs = { ··· 290 276 }, { 291 277 .compatible = "mediatek,mt6331-keys", 292 278 .data = &mt6331_regs, 279 + }, { 280 + .compatible = "mediatek,mt6357-keys", 281 + .data = &mt6357_regs, 293 282 }, { 294 283 .compatible = "mediatek,mt6358-keys", 295 284 .data = &mt6358_regs,
+6 -1
drivers/soc/mediatek/Kconfig
··· 44 44 on different MediaTek SoCs. The PMIC wrapper is a proprietary 45 45 hardware to connect the PMIC. 46 46 47 + config MTK_REGULATOR_COUPLER 48 + bool "MediaTek SoC Regulator Coupler" if COMPILE_TEST 49 + default ARCH_MEDIATEK 50 + depends on REGULATOR 51 + 47 52 config MTK_SCPSYS 48 53 bool "MediaTek SCPSYS Support" 49 54 default ARCH_MEDIATEK ··· 73 68 tasks in the system. 74 69 75 70 config MTK_MMSYS 76 - bool "MediaTek MMSYS Support" 71 + tristate "MediaTek MMSYS Support" 77 72 default ARCH_MEDIATEK 78 73 depends on HAS_IOMEM 79 74 help
+1
drivers/soc/mediatek/Makefile
··· 3 3 obj-$(CONFIG_MTK_DEVAPC) += mtk-devapc.o 4 4 obj-$(CONFIG_MTK_INFRACFG) += mtk-infracfg.o 5 5 obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o 6 + obj-$(CONFIG_MTK_REGULATOR_COUPLER) += mtk-regulator-coupler.o 6 7 obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o 7 8 obj-$(CONFIG_MTK_SCPSYS_PM_DOMAINS) += mtk-pm-domains.o 8 9 obj-$(CONFIG_MTK_MMSYS) += mtk-mmsys.o
+1 -3
drivers/soc/mediatek/mt8186-pm-domains.h
··· 304 304 .ctl_offs = 0x9FC, 305 305 .pwr_sta_offs = 0x16C, 306 306 .pwr_sta2nd_offs = 0x170, 307 - .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 308 307 }, 309 308 [MT8186_POWER_DOMAIN_ADSP_INFRA] = { 310 309 .name = "adsp_infra", ··· 311 312 .ctl_offs = 0x9F8, 312 313 .pwr_sta_offs = 0x16C, 313 314 .pwr_sta2nd_offs = 0x170, 314 - .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 315 315 }, 316 316 [MT8186_POWER_DOMAIN_ADSP_TOP] = { 317 317 .name = "adsp_top", ··· 330 332 MT8186_TOP_AXI_PROT_EN_3_CLR, 331 333 MT8186_TOP_AXI_PROT_EN_3_STA), 332 334 }, 333 - .caps = MTK_SCPD_SRAM_ISO | MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_ACTIVE_WAKEUP, 335 + .caps = MTK_SCPD_SRAM_ISO | MTK_SCPD_ACTIVE_WAKEUP, 334 336 }, 335 337 }; 336 338
+149
drivers/soc/mediatek/mt8188-mmsys.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + 3 + #ifndef __SOC_MEDIATEK_MT8188_MMSYS_H 4 + #define __SOC_MEDIATEK_MT8188_MMSYS_H 5 + 6 + #define MT8188_VDO0_OVL_MOUT_EN 0xf14 7 + #define MT8188_MOUT_DISP_OVL0_TO_DISP_RDMA0 BIT(0) 8 + #define MT8188_MOUT_DISP_OVL0_TO_DISP_WDMA0 BIT(1) 9 + #define MT8188_MOUT_DISP_OVL0_TO_DISP_OVL1 BIT(2) 10 + #define MT8188_MOUT_DISP_OVL1_TO_DISP_RDMA1 BIT(4) 11 + #define MT8188_MOUT_DISP_OVL1_TO_DISP_WDMA1 BIT(5) 12 + #define MT8188_MOUT_DISP_OVL1_TO_DISP_OVL0 BIT(6) 13 + 14 + #define MT8188_VDO0_SEL_IN 0xf34 15 + #define MT8188_VDO0_SEL_OUT 0xf38 16 + 17 + #define MT8188_VDO0_DISP_RDMA_SEL 0xf40 18 + #define MT8188_SOUT_DISP_RDMA0_TO_MASK GENMASK(2, 0) 19 + #define MT8188_SOUT_DISP_RDMA0_TO_DISP_COLOR0 (0 << 0) 20 + #define MT8188_SOUT_DISP_RDMA0_TO_DISP_DSI0 (1 << 0) 21 + #define MT8188_SOUT_DISP_RDMA0_TO_DISP_DP_INTF0 (5 << 0) 22 + #define MT8188_SEL_IN_DISP_RDMA0_FROM_MASK GENMASK(8, 8) 23 + #define MT8188_SEL_IN_DISP_RDMA0_FROM_DISP_OVL0 (0 << 8) 24 + #define MT8188_SEL_IN_DISP_RDMA0_FROM_DISP_RSZ0 (1 << 8) 25 + 26 + 27 + #define MT8188_VDO0_DSI0_SEL_IN 0xf44 28 + #define MT8188_SEL_IN_DSI0_FROM_MASK BIT(0) 29 + #define MT8188_SEL_IN_DSI0_FROM_DSC_WRAP0_OUT (0 << 0) 30 + #define MT8188_SEL_IN_DSI0_FROM_DISP_DITHER0 (1 << 0) 31 + 32 + #define MT8188_VDO0_DP_INTF0_SEL_IN 0xf4C 33 + #define MT8188_SEL_IN_DP_INTF0_FROM_MASK GENMASK(2, 0) 34 + #define MT8188_SEL_IN_DP_INTF0_FROM_DSC_WRAP0C1_OUT (0 << 0) 35 + #define MT8188_SEL_IN_DP_INTF0_FROM_VPP_MERGE (1 << 0) 36 + #define MT8188_SEL_IN_DP_INTF0_FROM_DISP_DITHER0 (3 << 0) 37 + 38 + #define MT8188_VDO0_DISP_DITHER0_SEL_OUT 0xf58 39 + #define MT8188_SOUT_DISP_DITHER0_TO_MASK GENMASK(2, 0) 40 + #define MT8188_SOUT_DISP_DITHER0_TO_DSC_WRAP0_IN (0 << 0) 41 + #define MT8188_SOUT_DISP_DITHER0_TO_DSI0 (1 << 0) 42 + #define MT8188_SOUT_DISP_DITHER0_TO_VPP_MERGE0 (6 << 0) 43 + #define MT8188_SOUT_DISP_DITHER0_TO_DP_INTF0 (7 << 0) 44 + 45 + #define MT8188_VDO0_VPP_MERGE_SEL 0xf60 46 + #define MT8188_SEL_IN_VPP_MERGE_FROM_MASK GENMASK(1, 0) 47 + #define MT8188_SEL_IN_VPP_MERGE_FROM_DSC_WRAP0_OUT (0 << 0) 48 + #define MT8188_SEL_IN_VPP_MERGE_FROM_DITHER0_OUT (3 << 0) 49 + 50 + #define MT8188_SOUT_VPP_MERGE_TO_MASK GENMASK(6, 4) 51 + #define MT8188_SOUT_VPP_MERGE_TO_DSI1 (0 << 4) 52 + #define MT8188_SOUT_VPP_MERGE_TO_DP_INTF0 (1 << 4) 53 + #define MT8188_SOUT_VPP_MERGE_TO_SINA_VIRTUAL0 (2 << 4) 54 + #define MT8188_SOUT_VPP_MERGE_TO_DISP_WDMA1 (3 << 4) 55 + #define MT8188_SOUT_VPP_MERGE_TO_DSC_WRAP0_IN (4 << 4) 56 + #define MT8188_SOUT_VPP_MERGE_TO_DISP_WDMA0 (5 << 4) 57 + #define MT8188_SOUT_VPP_MERGE_TO_DSC_WRAP1_IN_MASK GENMASK(11, 11) 58 + #define MT8188_SOUT_VPP_MERGE_TO_DSC_WRAP1_IN (0 << 11) 59 + 60 + #define MT8188_VDO0_DSC_WARP_SEL 0xf64 61 + #define MT8188_SEL_IN_DSC_WRAP0C0_IN_FROM_MASK GENMASK(0, 0) 62 + #define MT8188_SEL_IN_DSC_WRAP0C0_IN_FROM_DISP_DITHER0 (0 << 0) 63 + #define MT8188_SEL_IN_DSC_WRAP0C0_IN_FROM_VPP_MERGE (1 << 0) 64 + #define MT8188_SOUT_DSC_WRAP0_OUT_TO_MASK GENMASK(19, 16) 65 + #define MT8188_SOUT_DSC_WRAP0_OUT_TO_DSI0 BIT(16) 66 + #define MT8188_SOUT_DSC_WRAP0_OUT_TO_SINB_VIRTUAL0 BIT(17) 67 + #define MT8188_SOUT_DSC_WRAP0_OUT_TO_VPP_MERGE BIT(18) 68 + #define MT8188_SOUT_DSC_WRAP0_OUT_TO_DISP_WDMA0 BIT(19) 69 + 70 + static const struct mtk_mmsys_routes mmsys_mt8188_routing_table[] = { 71 + { 72 + DDP_COMPONENT_OVL0, DDP_COMPONENT_RDMA0, 73 + MT8188_VDO0_OVL_MOUT_EN, MT8188_MOUT_DISP_OVL0_TO_DISP_RDMA0, 74 + MT8188_MOUT_DISP_OVL0_TO_DISP_RDMA0 75 + }, { 76 + DDP_COMPONENT_OVL0, DDP_COMPONENT_WDMA0, 77 + MT8188_VDO0_OVL_MOUT_EN, MT8188_MOUT_DISP_OVL0_TO_DISP_WDMA0, 78 + MT8188_MOUT_DISP_OVL0_TO_DISP_WDMA0 79 + }, { 80 + DDP_COMPONENT_OVL0, DDP_COMPONENT_RDMA0, 81 + MT8188_VDO0_DISP_RDMA_SEL, MT8188_SEL_IN_DISP_RDMA0_FROM_MASK, 82 + MT8188_SEL_IN_DISP_RDMA0_FROM_DISP_OVL0 83 + }, { 84 + DDP_COMPONENT_DITHER0, DDP_COMPONENT_DSI0, 85 + MT8188_VDO0_DSI0_SEL_IN, MT8188_SEL_IN_DSI0_FROM_MASK, 86 + MT8188_SEL_IN_DSI0_FROM_DISP_DITHER0 87 + }, { 88 + DDP_COMPONENT_DITHER0, DDP_COMPONENT_MERGE0, 89 + MT8188_VDO0_VPP_MERGE_SEL, MT8188_SEL_IN_VPP_MERGE_FROM_MASK, 90 + MT8188_SEL_IN_VPP_MERGE_FROM_DITHER0_OUT 91 + }, { 92 + DDP_COMPONENT_DITHER0, DDP_COMPONENT_DSC0, 93 + MT8188_VDO0_DSC_WARP_SEL, 94 + MT8188_SEL_IN_DSC_WRAP0C0_IN_FROM_MASK, 95 + MT8188_SEL_IN_DSC_WRAP0C0_IN_FROM_DISP_DITHER0 96 + }, { 97 + DDP_COMPONENT_DITHER0, DDP_COMPONENT_DP_INTF0, 98 + MT8188_VDO0_DP_INTF0_SEL_IN, MT8188_SEL_IN_DP_INTF0_FROM_MASK, 99 + MT8188_SEL_IN_DP_INTF0_FROM_DISP_DITHER0 100 + }, { 101 + DDP_COMPONENT_DSC0, DDP_COMPONENT_MERGE0, 102 + MT8188_VDO0_VPP_MERGE_SEL, MT8188_SEL_IN_VPP_MERGE_FROM_MASK, 103 + MT8188_SEL_IN_VPP_MERGE_FROM_DSC_WRAP0_OUT 104 + }, { 105 + DDP_COMPONENT_DSC0, DDP_COMPONENT_DSI0, 106 + MT8188_VDO0_DSI0_SEL_IN, MT8188_SEL_IN_DSI0_FROM_MASK, 107 + MT8188_SEL_IN_DSI0_FROM_DSC_WRAP0_OUT 108 + }, { 109 + DDP_COMPONENT_RDMA0, DDP_COMPONENT_COLOR0, 110 + MT8188_VDO0_DISP_RDMA_SEL, MT8188_SOUT_DISP_RDMA0_TO_MASK, 111 + MT8188_SOUT_DISP_RDMA0_TO_DISP_COLOR0 112 + }, { 113 + DDP_COMPONENT_DITHER0, DDP_COMPONENT_DSI0, 114 + MT8188_VDO0_DISP_DITHER0_SEL_OUT, 115 + MT8188_SOUT_DISP_DITHER0_TO_MASK, 116 + MT8188_SOUT_DISP_DITHER0_TO_DSI0 117 + }, { 118 + DDP_COMPONENT_DITHER0, DDP_COMPONENT_DP_INTF0, 119 + MT8188_VDO0_DISP_DITHER0_SEL_OUT, 120 + MT8188_SOUT_DISP_DITHER0_TO_MASK, 121 + MT8188_SOUT_DISP_DITHER0_TO_DP_INTF0 122 + }, { 123 + DDP_COMPONENT_MERGE0, DDP_COMPONENT_DP_INTF0, 124 + MT8188_VDO0_VPP_MERGE_SEL, MT8188_SOUT_VPP_MERGE_TO_MASK, 125 + MT8188_SOUT_VPP_MERGE_TO_DP_INTF0 126 + }, { 127 + DDP_COMPONENT_MERGE0, DDP_COMPONENT_DPI0, 128 + MT8188_VDO0_VPP_MERGE_SEL, MT8188_SOUT_VPP_MERGE_TO_MASK, 129 + MT8188_SOUT_VPP_MERGE_TO_SINA_VIRTUAL0 130 + }, { 131 + DDP_COMPONENT_MERGE0, DDP_COMPONENT_WDMA0, 132 + MT8188_VDO0_VPP_MERGE_SEL, MT8188_SOUT_VPP_MERGE_TO_MASK, 133 + MT8188_SOUT_VPP_MERGE_TO_DISP_WDMA0 134 + }, { 135 + DDP_COMPONENT_MERGE0, DDP_COMPONENT_DSC0, 136 + MT8188_VDO0_VPP_MERGE_SEL, MT8188_SOUT_VPP_MERGE_TO_MASK, 137 + MT8188_SOUT_VPP_MERGE_TO_DSC_WRAP0_IN 138 + }, { 139 + DDP_COMPONENT_DSC0, DDP_COMPONENT_DSI0, 140 + MT8188_VDO0_DSC_WARP_SEL, MT8188_SOUT_DSC_WRAP0_OUT_TO_MASK, 141 + MT8188_SOUT_DSC_WRAP0_OUT_TO_DSI0 142 + }, { 143 + DDP_COMPONENT_DSC0, DDP_COMPONENT_MERGE0, 144 + MT8188_VDO0_DSC_WARP_SEL, MT8188_SOUT_DSC_WRAP0_OUT_TO_MASK, 145 + MT8188_SOUT_DSC_WRAP0_OUT_TO_VPP_MERGE 146 + }, 147 + }; 148 + 149 + #endif /* __SOC_MEDIATEK_MT8188_MMSYS_H */
+623
drivers/soc/mediatek/mt8188-pm-domains.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2022 MediaTek Inc. 4 + * Author: Garmin Chang <garmin.chang@mediatek.com> 5 + */ 6 + 7 + #ifndef __SOC_MEDIATEK_MT8188_PM_DOMAINS_H 8 + #define __SOC_MEDIATEK_MT8188_PM_DOMAINS_H 9 + 10 + #include "mtk-pm-domains.h" 11 + #include <dt-bindings/power/mediatek,mt8188-power.h> 12 + 13 + /* 14 + * MT8188 power domain support 15 + */ 16 + 17 + static const struct scpsys_domain_data scpsys_domain_data_mt8188[] = { 18 + [MT8188_POWER_DOMAIN_MFG0] = { 19 + .name = "mfg0", 20 + .sta_mask = BIT(1), 21 + .ctl_offs = 0x300, 22 + .pwr_sta_offs = 0x174, 23 + .pwr_sta2nd_offs = 0x178, 24 + .sram_pdn_bits = BIT(8), 25 + .sram_pdn_ack_bits = BIT(12), 26 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_DOMAIN_SUPPLY, 27 + }, 28 + [MT8188_POWER_DOMAIN_MFG1] = { 29 + .name = "mfg1", 30 + .sta_mask = BIT(2), 31 + .ctl_offs = 0x304, 32 + .pwr_sta_offs = 0x174, 33 + .pwr_sta2nd_offs = 0x178, 34 + .sram_pdn_bits = BIT(8), 35 + .sram_pdn_ack_bits = BIT(12), 36 + .bp_infracfg = { 37 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MFG1_STEP1, 38 + MT8188_TOP_AXI_PROT_EN_SET, 39 + MT8188_TOP_AXI_PROT_EN_CLR, 40 + MT8188_TOP_AXI_PROT_EN_STA), 41 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_MFG1_STEP2, 42 + MT8188_TOP_AXI_PROT_EN_2_SET, 43 + MT8188_TOP_AXI_PROT_EN_2_CLR, 44 + MT8188_TOP_AXI_PROT_EN_2_STA), 45 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_1_MFG1_STEP3, 46 + MT8188_TOP_AXI_PROT_EN_1_SET, 47 + MT8188_TOP_AXI_PROT_EN_1_CLR, 48 + MT8188_TOP_AXI_PROT_EN_1_STA), 49 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_MFG1_STEP4, 50 + MT8188_TOP_AXI_PROT_EN_2_SET, 51 + MT8188_TOP_AXI_PROT_EN_2_CLR, 52 + MT8188_TOP_AXI_PROT_EN_2_STA), 53 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MFG1_STEP5, 54 + MT8188_TOP_AXI_PROT_EN_SET, 55 + MT8188_TOP_AXI_PROT_EN_CLR, 56 + MT8188_TOP_AXI_PROT_EN_STA), 57 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_MFG1_STEP6, 58 + MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET, 59 + MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR, 60 + MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA), 61 + }, 62 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_DOMAIN_SUPPLY, 63 + }, 64 + [MT8188_POWER_DOMAIN_MFG2] = { 65 + .name = "mfg2", 66 + .sta_mask = BIT(3), 67 + .ctl_offs = 0x308, 68 + .pwr_sta_offs = 0x174, 69 + .pwr_sta2nd_offs = 0x178, 70 + .sram_pdn_bits = BIT(8), 71 + .sram_pdn_ack_bits = BIT(12), 72 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 73 + }, 74 + [MT8188_POWER_DOMAIN_MFG3] = { 75 + .name = "mfg3", 76 + .sta_mask = BIT(4), 77 + .ctl_offs = 0x30C, 78 + .pwr_sta_offs = 0x174, 79 + .pwr_sta2nd_offs = 0x178, 80 + .sram_pdn_bits = BIT(8), 81 + .sram_pdn_ack_bits = BIT(12), 82 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 83 + }, 84 + [MT8188_POWER_DOMAIN_MFG4] = { 85 + .name = "mfg4", 86 + .sta_mask = BIT(5), 87 + .ctl_offs = 0x310, 88 + .pwr_sta_offs = 0x174, 89 + .pwr_sta2nd_offs = 0x178, 90 + .sram_pdn_bits = BIT(8), 91 + .sram_pdn_ack_bits = BIT(12), 92 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 93 + }, 94 + [MT8188_POWER_DOMAIN_PEXTP_MAC_P0] = { 95 + .name = "pextp_mac_p0", 96 + .sta_mask = BIT(10), 97 + .ctl_offs = 0x324, 98 + .pwr_sta_offs = 0x174, 99 + .pwr_sta2nd_offs = 0x178, 100 + .sram_pdn_bits = BIT(8), 101 + .sram_pdn_ack_bits = BIT(12), 102 + .bp_infracfg = { 103 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_PEXTP_MAC_P0_STEP1, 104 + MT8188_TOP_AXI_PROT_EN_SET, 105 + MT8188_TOP_AXI_PROT_EN_CLR, 106 + MT8188_TOP_AXI_PROT_EN_STA), 107 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_PEXTP_MAC_P0_STEP2, 108 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET, 109 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR, 110 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA), 111 + }, 112 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 113 + }, 114 + [MT8188_POWER_DOMAIN_PEXTP_PHY_TOP] = { 115 + .name = "pextp_phy_top", 116 + .sta_mask = BIT(12), 117 + .ctl_offs = 0x328, 118 + .pwr_sta_offs = 0x174, 119 + .pwr_sta2nd_offs = 0x178, 120 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 121 + }, 122 + [MT8188_POWER_DOMAIN_CSIRX_TOP] = { 123 + .name = "pextp_csirx_top", 124 + .sta_mask = BIT(17), 125 + .ctl_offs = 0x3C4, 126 + .pwr_sta_offs = 0x174, 127 + .pwr_sta2nd_offs = 0x178, 128 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 129 + }, 130 + [MT8188_POWER_DOMAIN_ETHER] = { 131 + .name = "ether", 132 + .sta_mask = BIT(1), 133 + .ctl_offs = 0x338, 134 + .pwr_sta_offs = 0x16C, 135 + .pwr_sta2nd_offs = 0x170, 136 + .sram_pdn_bits = BIT(8), 137 + .sram_pdn_ack_bits = BIT(12), 138 + .bp_infracfg = { 139 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_ETHER_STEP1, 140 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET, 141 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR, 142 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA), 143 + }, 144 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_ACTIVE_WAKEUP, 145 + }, 146 + [MT8188_POWER_DOMAIN_HDMI_TX] = { 147 + .name = "hdmi_tx", 148 + .sta_mask = BIT(18), 149 + .ctl_offs = 0x37C, 150 + .pwr_sta_offs = 0x16C, 151 + .pwr_sta2nd_offs = 0x170, 152 + .sram_pdn_bits = BIT(8), 153 + .sram_pdn_ack_bits = BIT(12), 154 + .bp_infracfg = { 155 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_HDMI_TX_STEP1, 156 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET, 157 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR, 158 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA), 159 + }, 160 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_ACTIVE_WAKEUP, 161 + }, 162 + [MT8188_POWER_DOMAIN_ADSP_AO] = { 163 + .name = "adsp_ao", 164 + .sta_mask = BIT(10), 165 + .ctl_offs = 0x35C, 166 + .pwr_sta_offs = 0x16C, 167 + .pwr_sta2nd_offs = 0x170, 168 + .bp_infracfg = { 169 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_AO_STEP1, 170 + MT8188_TOP_AXI_PROT_EN_2_SET, 171 + MT8188_TOP_AXI_PROT_EN_2_CLR, 172 + MT8188_TOP_AXI_PROT_EN_2_STA), 173 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_AO_STEP2, 174 + MT8188_TOP_AXI_PROT_EN_2_SET, 175 + MT8188_TOP_AXI_PROT_EN_2_CLR, 176 + MT8188_TOP_AXI_PROT_EN_2_STA), 177 + }, 178 + .caps = MTK_SCPD_ALWAYS_ON, 179 + }, 180 + [MT8188_POWER_DOMAIN_ADSP_INFRA] = { 181 + .name = "adsp_infra", 182 + .sta_mask = BIT(9), 183 + .ctl_offs = 0x358, 184 + .pwr_sta_offs = 0x16C, 185 + .pwr_sta2nd_offs = 0x170, 186 + .sram_pdn_bits = BIT(8), 187 + .sram_pdn_ack_bits = BIT(12), 188 + .bp_infracfg = { 189 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_INFRA_STEP1, 190 + MT8188_TOP_AXI_PROT_EN_2_SET, 191 + MT8188_TOP_AXI_PROT_EN_2_CLR, 192 + MT8188_TOP_AXI_PROT_EN_2_STA), 193 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_INFRA_STEP2, 194 + MT8188_TOP_AXI_PROT_EN_2_SET, 195 + MT8188_TOP_AXI_PROT_EN_2_CLR, 196 + MT8188_TOP_AXI_PROT_EN_2_STA), 197 + }, 198 + .caps = MTK_SCPD_SRAM_ISO | MTK_SCPD_ALWAYS_ON, 199 + }, 200 + [MT8188_POWER_DOMAIN_ADSP] = { 201 + .name = "adsp", 202 + .sta_mask = BIT(8), 203 + .ctl_offs = 0x354, 204 + .pwr_sta_offs = 0x16C, 205 + .pwr_sta2nd_offs = 0x170, 206 + .sram_pdn_bits = BIT(8), 207 + .sram_pdn_ack_bits = BIT(12), 208 + .bp_infracfg = { 209 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_STEP1, 210 + MT8188_TOP_AXI_PROT_EN_2_SET, 211 + MT8188_TOP_AXI_PROT_EN_2_CLR, 212 + MT8188_TOP_AXI_PROT_EN_2_STA), 213 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_ADSP_STEP2, 214 + MT8188_TOP_AXI_PROT_EN_2_SET, 215 + MT8188_TOP_AXI_PROT_EN_2_CLR, 216 + MT8188_TOP_AXI_PROT_EN_2_STA), 217 + }, 218 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_SRAM_ISO | MTK_SCPD_ACTIVE_WAKEUP, 219 + }, 220 + [MT8188_POWER_DOMAIN_AUDIO] = { 221 + .name = "audio", 222 + .sta_mask = BIT(6), 223 + .ctl_offs = 0x34C, 224 + .pwr_sta_offs = 0x16C, 225 + .pwr_sta2nd_offs = 0x170, 226 + .sram_pdn_bits = BIT(8), 227 + .sram_pdn_ack_bits = BIT(12), 228 + .bp_infracfg = { 229 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1, 230 + MT8188_TOP_AXI_PROT_EN_2_SET, 231 + MT8188_TOP_AXI_PROT_EN_2_CLR, 232 + MT8188_TOP_AXI_PROT_EN_2_STA), 233 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2, 234 + MT8188_TOP_AXI_PROT_EN_2_SET, 235 + MT8188_TOP_AXI_PROT_EN_2_CLR, 236 + MT8188_TOP_AXI_PROT_EN_2_STA), 237 + }, 238 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_ACTIVE_WAKEUP, 239 + }, 240 + [MT8188_POWER_DOMAIN_AUDIO_ASRC] = { 241 + .name = "audio_asrc", 242 + .sta_mask = BIT(7), 243 + .ctl_offs = 0x350, 244 + .pwr_sta_offs = 0x16C, 245 + .pwr_sta2nd_offs = 0x170, 246 + .sram_pdn_bits = BIT(8), 247 + .sram_pdn_ack_bits = BIT(12), 248 + .bp_infracfg = { 249 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_AUDIO_ASRC_STEP1, 250 + MT8188_TOP_AXI_PROT_EN_2_SET, 251 + MT8188_TOP_AXI_PROT_EN_2_CLR, 252 + MT8188_TOP_AXI_PROT_EN_2_STA), 253 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_AUDIO_ASRC_STEP2, 254 + MT8188_TOP_AXI_PROT_EN_2_SET, 255 + MT8188_TOP_AXI_PROT_EN_2_CLR, 256 + MT8188_TOP_AXI_PROT_EN_2_STA), 257 + }, 258 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 259 + }, 260 + [MT8188_POWER_DOMAIN_VPPSYS0] = { 261 + .name = "vppsys0", 262 + .sta_mask = BIT(11), 263 + .ctl_offs = 0x360, 264 + .pwr_sta_offs = 0x16C, 265 + .pwr_sta2nd_offs = 0x170, 266 + .sram_pdn_bits = BIT(8), 267 + .sram_pdn_ack_bits = BIT(12), 268 + .bp_infracfg = { 269 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_VPPSYS0_STEP1, 270 + MT8188_TOP_AXI_PROT_EN_SET, 271 + MT8188_TOP_AXI_PROT_EN_CLR, 272 + MT8188_TOP_AXI_PROT_EN_STA), 273 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS0_STEP2, 274 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 275 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 276 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 277 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_VPPSYS0_STEP3, 278 + MT8188_TOP_AXI_PROT_EN_SET, 279 + MT8188_TOP_AXI_PROT_EN_CLR, 280 + MT8188_TOP_AXI_PROT_EN_STA), 281 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS0_STEP4, 282 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 283 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 284 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 285 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_VPPSYS0_STEP5, 286 + MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET, 287 + MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR, 288 + MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA), 289 + }, 290 + }, 291 + [MT8188_POWER_DOMAIN_VDOSYS0] = { 292 + .name = "vdosys0", 293 + .sta_mask = BIT(13), 294 + .ctl_offs = 0x368, 295 + .pwr_sta_offs = 0x16C, 296 + .pwr_sta2nd_offs = 0x170, 297 + .sram_pdn_bits = BIT(8), 298 + .sram_pdn_ack_bits = BIT(12), 299 + .bp_infracfg = { 300 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDOSYS0_STEP1, 301 + MT8188_TOP_AXI_PROT_EN_MM_SET, 302 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 303 + MT8188_TOP_AXI_PROT_EN_MM_STA), 304 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_VDOSYS0_STEP2, 305 + MT8188_TOP_AXI_PROT_EN_SET, 306 + MT8188_TOP_AXI_PROT_EN_CLR, 307 + MT8188_TOP_AXI_PROT_EN_STA), 308 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_VDOSYS0_STEP3, 309 + MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET, 310 + MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR, 311 + MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA), 312 + }, 313 + }, 314 + [MT8188_POWER_DOMAIN_VDOSYS1] = { 315 + .name = "vdosys1", 316 + .sta_mask = BIT(14), 317 + .ctl_offs = 0x36C, 318 + .pwr_sta_offs = 0x16C, 319 + .pwr_sta2nd_offs = 0x170, 320 + .sram_pdn_bits = BIT(8), 321 + .sram_pdn_ack_bits = BIT(12), 322 + .bp_infracfg = { 323 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDOSYS1_STEP1, 324 + MT8188_TOP_AXI_PROT_EN_MM_SET, 325 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 326 + MT8188_TOP_AXI_PROT_EN_MM_STA), 327 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDOSYS1_STEP2, 328 + MT8188_TOP_AXI_PROT_EN_MM_SET, 329 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 330 + MT8188_TOP_AXI_PROT_EN_MM_STA), 331 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VDOSYS1_STEP3, 332 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 333 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 334 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 335 + }, 336 + }, 337 + [MT8188_POWER_DOMAIN_DP_TX] = { 338 + .name = "dp_tx", 339 + .sta_mask = BIT(16), 340 + .ctl_offs = 0x374, 341 + .pwr_sta_offs = 0x16C, 342 + .pwr_sta2nd_offs = 0x170, 343 + .sram_pdn_bits = BIT(8), 344 + .sram_pdn_ack_bits = BIT(12), 345 + .bp_infracfg = { 346 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_DP_TX_STEP1, 347 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET, 348 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR, 349 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA), 350 + }, 351 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 352 + }, 353 + [MT8188_POWER_DOMAIN_EDP_TX] = { 354 + .name = "edp_tx", 355 + .sta_mask = BIT(17), 356 + .ctl_offs = 0x378, 357 + .pwr_sta_offs = 0x16C, 358 + .pwr_sta2nd_offs = 0x170, 359 + .sram_pdn_bits = BIT(8), 360 + .sram_pdn_ack_bits = BIT(12), 361 + .bp_infracfg = { 362 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_EDP_TX_STEP1, 363 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET, 364 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR, 365 + MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA), 366 + }, 367 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 368 + }, 369 + [MT8188_POWER_DOMAIN_VPPSYS1] = { 370 + .name = "vppsys1", 371 + .sta_mask = BIT(12), 372 + .ctl_offs = 0x364, 373 + .pwr_sta_offs = 0x16C, 374 + .pwr_sta2nd_offs = 0x170, 375 + .sram_pdn_bits = BIT(8), 376 + .sram_pdn_ack_bits = BIT(12), 377 + .bp_infracfg = { 378 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VPPSYS1_STEP1, 379 + MT8188_TOP_AXI_PROT_EN_MM_SET, 380 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 381 + MT8188_TOP_AXI_PROT_EN_MM_STA), 382 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VPPSYS1_STEP2, 383 + MT8188_TOP_AXI_PROT_EN_MM_SET, 384 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 385 + MT8188_TOP_AXI_PROT_EN_MM_STA), 386 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS1_STEP3, 387 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 388 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 389 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 390 + }, 391 + }, 392 + [MT8188_POWER_DOMAIN_WPE] = { 393 + .name = "wpe", 394 + .sta_mask = BIT(15), 395 + .ctl_offs = 0x370, 396 + .pwr_sta_offs = 0x16C, 397 + .pwr_sta2nd_offs = 0x170, 398 + .sram_pdn_bits = BIT(8), 399 + .sram_pdn_ack_bits = BIT(12), 400 + .bp_infracfg = { 401 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_WPE_STEP1, 402 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 403 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 404 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 405 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_WPE_STEP2, 406 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 407 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 408 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 409 + }, 410 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 411 + }, 412 + [MT8188_POWER_DOMAIN_VDEC0] = { 413 + .name = "vdec0", 414 + .sta_mask = BIT(19), 415 + .ctl_offs = 0x380, 416 + .pwr_sta_offs = 0x16C, 417 + .pwr_sta2nd_offs = 0x170, 418 + .sram_pdn_bits = BIT(8), 419 + .sram_pdn_ack_bits = BIT(12), 420 + .bp_infracfg = { 421 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDEC0_STEP1, 422 + MT8188_TOP_AXI_PROT_EN_MM_SET, 423 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 424 + MT8188_TOP_AXI_PROT_EN_MM_STA), 425 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VDEC0_STEP2, 426 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 427 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 428 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 429 + }, 430 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 431 + }, 432 + [MT8188_POWER_DOMAIN_VDEC1] = { 433 + .name = "vdec1", 434 + .sta_mask = BIT(20), 435 + .ctl_offs = 0x384, 436 + .pwr_sta_offs = 0x16C, 437 + .pwr_sta2nd_offs = 0x170, 438 + .sram_pdn_bits = BIT(8), 439 + .sram_pdn_ack_bits = BIT(12), 440 + .bp_infracfg = { 441 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDEC1_STEP1, 442 + MT8188_TOP_AXI_PROT_EN_MM_SET, 443 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 444 + MT8188_TOP_AXI_PROT_EN_MM_STA), 445 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VDEC1_STEP2, 446 + MT8188_TOP_AXI_PROT_EN_MM_SET, 447 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 448 + MT8188_TOP_AXI_PROT_EN_MM_STA), 449 + }, 450 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 451 + }, 452 + [MT8188_POWER_DOMAIN_VENC] = { 453 + .name = "venc", 454 + .sta_mask = BIT(22), 455 + .ctl_offs = 0x38C, 456 + .pwr_sta_offs = 0x16C, 457 + .pwr_sta2nd_offs = 0x170, 458 + .sram_pdn_bits = BIT(8), 459 + .sram_pdn_ack_bits = BIT(12), 460 + .bp_infracfg = { 461 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VENC_STEP1, 462 + MT8188_TOP_AXI_PROT_EN_MM_SET, 463 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 464 + MT8188_TOP_AXI_PROT_EN_MM_STA), 465 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_VENC_STEP2, 466 + MT8188_TOP_AXI_PROT_EN_MM_SET, 467 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 468 + MT8188_TOP_AXI_PROT_EN_MM_STA), 469 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_VENC_STEP3, 470 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 471 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 472 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 473 + }, 474 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 475 + }, 476 + [MT8188_POWER_DOMAIN_IMG_VCORE] = { 477 + .name = "vcore", 478 + .sta_mask = BIT(28), 479 + .ctl_offs = 0x3A4, 480 + .pwr_sta_offs = 0x16C, 481 + .pwr_sta2nd_offs = 0x170, 482 + .bp_infracfg = { 483 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_IMG_VCORE_STEP1, 484 + MT8188_TOP_AXI_PROT_EN_MM_SET, 485 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 486 + MT8188_TOP_AXI_PROT_EN_MM_STA), 487 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_IMG_VCORE_STEP2, 488 + MT8188_TOP_AXI_PROT_EN_MM_SET, 489 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 490 + MT8188_TOP_AXI_PROT_EN_MM_STA), 491 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_IMG_VCORE_STEP3, 492 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 493 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 494 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 495 + }, 496 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_DOMAIN_SUPPLY, 497 + }, 498 + [MT8188_POWER_DOMAIN_IMG_MAIN] = { 499 + .name = "img_main", 500 + .sta_mask = BIT(29), 501 + .ctl_offs = 0x3A8, 502 + .pwr_sta_offs = 0x16C, 503 + .pwr_sta2nd_offs = 0x170, 504 + .sram_pdn_bits = BIT(8), 505 + .sram_pdn_ack_bits = BIT(12), 506 + .bp_infracfg = { 507 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_IMG_MAIN_STEP1, 508 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 509 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 510 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 511 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_IMG_MAIN_STEP2, 512 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 513 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 514 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 515 + }, 516 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 517 + }, 518 + [MT8188_POWER_DOMAIN_DIP] = { 519 + .name = "dip", 520 + .sta_mask = BIT(30), 521 + .ctl_offs = 0x3AC, 522 + .pwr_sta_offs = 0x16C, 523 + .pwr_sta2nd_offs = 0x170, 524 + .sram_pdn_bits = BIT(8), 525 + .sram_pdn_ack_bits = BIT(12), 526 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 527 + }, 528 + [MT8188_POWER_DOMAIN_IPE] = { 529 + .name = "ipe", 530 + .sta_mask = BIT(31), 531 + .ctl_offs = 0x3B0, 532 + .pwr_sta_offs = 0x16C, 533 + .pwr_sta2nd_offs = 0x170, 534 + .sram_pdn_bits = BIT(8), 535 + .sram_pdn_ack_bits = BIT(12), 536 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 537 + }, 538 + [MT8188_POWER_DOMAIN_CAM_VCORE] = { 539 + .name = "cam_vcore", 540 + .sta_mask = BIT(27), 541 + .ctl_offs = 0x3A0, 542 + .pwr_sta_offs = 0x16C, 543 + .pwr_sta2nd_offs = 0x170, 544 + .bp_infracfg = { 545 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_CAM_VCORE_STEP1, 546 + MT8188_TOP_AXI_PROT_EN_MM_SET, 547 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 548 + MT8188_TOP_AXI_PROT_EN_MM_STA), 549 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_CAM_VCORE_STEP2, 550 + MT8188_TOP_AXI_PROT_EN_2_SET, 551 + MT8188_TOP_AXI_PROT_EN_2_CLR, 552 + MT8188_TOP_AXI_PROT_EN_2_STA), 553 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_1_CAM_VCORE_STEP3, 554 + MT8188_TOP_AXI_PROT_EN_1_SET, 555 + MT8188_TOP_AXI_PROT_EN_1_CLR, 556 + MT8188_TOP_AXI_PROT_EN_1_STA), 557 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_CAM_VCORE_STEP4, 558 + MT8188_TOP_AXI_PROT_EN_MM_SET, 559 + MT8188_TOP_AXI_PROT_EN_MM_CLR, 560 + MT8188_TOP_AXI_PROT_EN_MM_STA), 561 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_CAM_VCORE_STEP5, 562 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 563 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 564 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 565 + }, 566 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_DOMAIN_SUPPLY, 567 + }, 568 + [MT8188_POWER_DOMAIN_CAM_MAIN] = { 569 + .name = "cam_main", 570 + .sta_mask = BIT(24), 571 + .ctl_offs = 0x394, 572 + .pwr_sta_offs = 0x16C, 573 + .pwr_sta2nd_offs = 0x170, 574 + .sram_pdn_bits = BIT(8), 575 + .sram_pdn_ack_bits = BIT(12), 576 + .bp_infracfg = { 577 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_CAM_MAIN_STEP1, 578 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 579 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 580 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 581 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_CAM_MAIN_STEP2, 582 + MT8188_TOP_AXI_PROT_EN_2_SET, 583 + MT8188_TOP_AXI_PROT_EN_2_CLR, 584 + MT8188_TOP_AXI_PROT_EN_2_STA), 585 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_MM_2_CAM_MAIN_STEP3, 586 + MT8188_TOP_AXI_PROT_EN_MM_2_SET, 587 + MT8188_TOP_AXI_PROT_EN_MM_2_CLR, 588 + MT8188_TOP_AXI_PROT_EN_MM_2_STA), 589 + BUS_PROT_WR(MT8188_TOP_AXI_PROT_EN_2_CAM_MAIN_STEP4, 590 + MT8188_TOP_AXI_PROT_EN_2_SET, 591 + MT8188_TOP_AXI_PROT_EN_2_CLR, 592 + MT8188_TOP_AXI_PROT_EN_2_STA), 593 + }, 594 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 595 + }, 596 + [MT8188_POWER_DOMAIN_CAM_SUBA] = { 597 + .name = "cam_suba", 598 + .sta_mask = BIT(25), 599 + .ctl_offs = 0x398, 600 + .pwr_sta_offs = 0x16C, 601 + .pwr_sta2nd_offs = 0x170, 602 + .sram_pdn_bits = BIT(8), 603 + .sram_pdn_ack_bits = BIT(12), 604 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 605 + }, 606 + [MT8188_POWER_DOMAIN_CAM_SUBB] = { 607 + .name = "cam_subb", 608 + .sta_mask = BIT(26), 609 + .ctl_offs = 0x39C, 610 + .pwr_sta_offs = 0x16C, 611 + .pwr_sta2nd_offs = 0x170, 612 + .sram_pdn_bits = BIT(8), 613 + .sram_pdn_ack_bits = BIT(12), 614 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 615 + }, 616 + }; 617 + 618 + static const struct scpsys_soc_data mt8188_scpsys_data = { 619 + .domains_data = scpsys_domain_data_mt8188, 620 + .num_domains = ARRAY_SIZE(scpsys_domain_data_mt8188), 621 + }; 622 + 623 + #endif /* __SOC_MEDIATEK_MT8188_PM_DOMAINS_H */
+146
drivers/soc/mediatek/mt8195-mmsys.h
··· 75 75 #define MT8195_SOUT_DSC_WRAP1_OUT_TO_SINA_VIRTUAL0 (2 << 16) 76 76 #define MT8195_SOUT_DSC_WRAP1_OUT_TO_VPP_MERGE (3 << 16) 77 77 78 + #define MT8195_VDO1_SW0_RST_B 0x1d0 79 + #define MT8195_VDO1_MERGE0_ASYNC_CFG_WD 0xe30 80 + #define MT8195_VDO1_HDRBE_ASYNC_CFG_WD 0xe70 81 + #define MT8195_VDO1_HDR_TOP_CFG 0xd00 82 + #define MT8195_VDO1_MIXER_IN1_ALPHA 0xd30 83 + #define MT8195_VDO1_MIXER_IN1_PAD 0xd40 84 + 85 + #define MT8195_VDO1_VPP_MERGE0_P0_SEL_IN 0xf04 86 + #define MT8195_VPP_MERGE0_P0_SEL_IN_FROM_MDP_RDMA0 1 87 + 88 + #define MT8195_VDO1_VPP_MERGE0_P1_SEL_IN 0xf08 89 + #define MT8195_VPP_MERGE0_P1_SEL_IN_FROM_MDP_RDMA1 1 90 + 91 + #define MT8195_VDO1_DISP_DPI1_SEL_IN 0xf10 92 + #define MT8195_DISP_DPI1_SEL_IN_FROM_VPP_MERGE4_MOUT 0 93 + 94 + #define MT8195_VDO1_DISP_DP_INTF0_SEL_IN 0xf14 95 + #define MT8195_DISP_DP_INTF0_SEL_IN_FROM_VPP_MERGE4_MOUT 0 96 + 97 + #define MT8195_VDO1_MERGE4_SOUT_SEL 0xf18 98 + #define MT8195_MERGE4_SOUT_TO_DPI1_SEL 2 99 + #define MT8195_MERGE4_SOUT_TO_DP_INTF0_SEL 3 100 + 101 + #define MT8195_VDO1_MIXER_IN1_SEL_IN 0xf24 102 + #define MT8195_MIXER_IN1_SEL_IN_FROM_MERGE0_ASYNC_SOUT 1 103 + 104 + #define MT8195_VDO1_MIXER_IN2_SEL_IN 0xf28 105 + #define MT8195_MIXER_IN2_SEL_IN_FROM_MERGE1_ASYNC_SOUT 1 106 + 107 + #define MT8195_VDO1_MIXER_IN3_SEL_IN 0xf2c 108 + #define MT8195_MIXER_IN3_SEL_IN_FROM_MERGE2_ASYNC_SOUT 1 109 + 110 + #define MT8195_VDO1_MIXER_IN4_SEL_IN 0xf30 111 + #define MT8195_MIXER_IN4_SEL_IN_FROM_MERGE3_ASYNC_SOUT 1 112 + 113 + #define MT8195_VDO1_MIXER_OUT_SOUT_SEL 0xf34 114 + #define MT8195_MIXER_SOUT_TO_MERGE4_ASYNC_SEL 1 115 + 116 + #define MT8195_VDO1_VPP_MERGE1_P0_SEL_IN 0xf3c 117 + #define MT8195_VPP_MERGE1_P0_SEL_IN_FROM_MDP_RDMA2 1 118 + 119 + #define MT8195_VDO1_MERGE0_ASYNC_SOUT_SEL 0xf40 120 + #define MT8195_SOUT_TO_MIXER_IN1_SEL 1 121 + 122 + #define MT8195_VDO1_MERGE1_ASYNC_SOUT_SEL 0xf44 123 + #define MT8195_SOUT_TO_MIXER_IN2_SEL 1 124 + 125 + #define MT8195_VDO1_MERGE2_ASYNC_SOUT_SEL 0xf48 126 + #define MT8195_SOUT_TO_MIXER_IN3_SEL 1 127 + 128 + #define MT8195_VDO1_MERGE3_ASYNC_SOUT_SEL 0xf4c 129 + #define MT8195_SOUT_TO_MIXER_IN4_SEL 1 130 + 131 + #define MT8195_VDO1_MERGE4_ASYNC_SEL_IN 0xf50 132 + #define MT8195_MERGE4_ASYNC_SEL_IN_FROM_MIXER_OUT_SOUT 1 133 + 134 + #define MT8195_VDO1_MIXER_IN1_SOUT_SEL 0xf58 135 + #define MT8195_MIXER_IN1_SOUT_TO_DISP_MIXER 0 136 + 137 + #define MT8195_VDO1_MIXER_IN2_SOUT_SEL 0xf5c 138 + #define MT8195_MIXER_IN2_SOUT_TO_DISP_MIXER 0 139 + 140 + #define MT8195_VDO1_MIXER_IN3_SOUT_SEL 0xf60 141 + #define MT8195_MIXER_IN3_SOUT_TO_DISP_MIXER 0 142 + 143 + #define MT8195_VDO1_MIXER_IN4_SOUT_SEL 0xf64 144 + #define MT8195_MIXER_IN4_SOUT_TO_DISP_MIXER 0 145 + 146 + #define MT8195_VDO1_MIXER_SOUT_SEL_IN 0xf68 147 + #define MT8195_MIXER_SOUT_SEL_IN_FROM_DISP_MIXER 0 148 + 78 149 static const struct mtk_mmsys_routes mmsys_mt8195_routing_table[] = { 79 150 { 80 151 DDP_COMPONENT_OVL0, DDP_COMPONENT_RDMA0, ··· 438 367 } 439 368 }; 440 369 370 + static const struct mtk_mmsys_routes mmsys_mt8195_vdo1_routing_table[] = { 371 + { 372 + DDP_COMPONENT_MDP_RDMA0, DDP_COMPONENT_MERGE1, 373 + MT8195_VDO1_VPP_MERGE0_P0_SEL_IN, GENMASK(0, 0), 374 + MT8195_VPP_MERGE0_P0_SEL_IN_FROM_MDP_RDMA0 375 + }, { 376 + DDP_COMPONENT_MDP_RDMA1, DDP_COMPONENT_MERGE1, 377 + MT8195_VDO1_VPP_MERGE0_P1_SEL_IN, GENMASK(0, 0), 378 + MT8195_VPP_MERGE0_P1_SEL_IN_FROM_MDP_RDMA1 379 + }, { 380 + DDP_COMPONENT_MDP_RDMA2, DDP_COMPONENT_MERGE2, 381 + MT8195_VDO1_VPP_MERGE1_P0_SEL_IN, GENMASK(0, 0), 382 + MT8195_VPP_MERGE1_P0_SEL_IN_FROM_MDP_RDMA2 383 + }, { 384 + DDP_COMPONENT_MERGE1, DDP_COMPONENT_ETHDR_MIXER, 385 + MT8195_VDO1_MERGE0_ASYNC_SOUT_SEL, GENMASK(1, 0), 386 + MT8195_SOUT_TO_MIXER_IN1_SEL 387 + }, { 388 + DDP_COMPONENT_MERGE2, DDP_COMPONENT_ETHDR_MIXER, 389 + MT8195_VDO1_MERGE1_ASYNC_SOUT_SEL, GENMASK(1, 0), 390 + MT8195_SOUT_TO_MIXER_IN2_SEL 391 + }, { 392 + DDP_COMPONENT_MERGE3, DDP_COMPONENT_ETHDR_MIXER, 393 + MT8195_VDO1_MERGE2_ASYNC_SOUT_SEL, GENMASK(1, 0), 394 + MT8195_SOUT_TO_MIXER_IN3_SEL 395 + }, { 396 + DDP_COMPONENT_MERGE4, DDP_COMPONENT_ETHDR_MIXER, 397 + MT8195_VDO1_MERGE3_ASYNC_SOUT_SEL, GENMASK(1, 0), 398 + MT8195_SOUT_TO_MIXER_IN4_SEL 399 + }, { 400 + DDP_COMPONENT_ETHDR_MIXER, DDP_COMPONENT_MERGE5, 401 + MT8195_VDO1_MIXER_OUT_SOUT_SEL, GENMASK(0, 0), 402 + MT8195_MIXER_SOUT_TO_MERGE4_ASYNC_SEL 403 + }, { 404 + DDP_COMPONENT_MERGE1, DDP_COMPONENT_ETHDR_MIXER, 405 + MT8195_VDO1_MIXER_IN1_SEL_IN, GENMASK(0, 0), 406 + MT8195_MIXER_IN1_SEL_IN_FROM_MERGE0_ASYNC_SOUT 407 + }, { 408 + DDP_COMPONENT_MERGE2, DDP_COMPONENT_ETHDR_MIXER, 409 + MT8195_VDO1_MIXER_IN2_SEL_IN, GENMASK(0, 0), 410 + MT8195_MIXER_IN2_SEL_IN_FROM_MERGE1_ASYNC_SOUT 411 + }, { 412 + DDP_COMPONENT_MERGE3, DDP_COMPONENT_ETHDR_MIXER, 413 + MT8195_VDO1_MIXER_IN3_SEL_IN, GENMASK(0, 0), 414 + MT8195_MIXER_IN3_SEL_IN_FROM_MERGE2_ASYNC_SOUT 415 + }, { 416 + DDP_COMPONENT_MERGE4, DDP_COMPONENT_ETHDR_MIXER, 417 + MT8195_VDO1_MIXER_IN4_SEL_IN, GENMASK(0, 0), 418 + MT8195_MIXER_IN4_SEL_IN_FROM_MERGE3_ASYNC_SOUT 419 + }, { 420 + DDP_COMPONENT_ETHDR_MIXER, DDP_COMPONENT_MERGE5, 421 + MT8195_VDO1_MIXER_SOUT_SEL_IN, GENMASK(2, 0), 422 + MT8195_MIXER_SOUT_SEL_IN_FROM_DISP_MIXER 423 + }, { 424 + DDP_COMPONENT_ETHDR_MIXER, DDP_COMPONENT_MERGE5, 425 + MT8195_VDO1_MERGE4_ASYNC_SEL_IN, GENMASK(2, 0), 426 + MT8195_MERGE4_ASYNC_SEL_IN_FROM_MIXER_OUT_SOUT 427 + }, { 428 + DDP_COMPONENT_MERGE5, DDP_COMPONENT_DPI1, 429 + MT8195_VDO1_DISP_DPI1_SEL_IN, GENMASK(1, 0), 430 + MT8195_DISP_DPI1_SEL_IN_FROM_VPP_MERGE4_MOUT 431 + }, { 432 + DDP_COMPONENT_MERGE5, DDP_COMPONENT_DPI1, 433 + MT8195_VDO1_MERGE4_SOUT_SEL, GENMASK(1, 0), 434 + MT8195_MERGE4_SOUT_TO_DPI1_SEL 435 + }, { 436 + DDP_COMPONENT_MERGE5, DDP_COMPONENT_DP_INTF1, 437 + MT8195_VDO1_DISP_DP_INTF0_SEL_IN, GENMASK(1, 0), 438 + MT8195_DISP_DP_INTF0_SEL_IN_FROM_VPP_MERGE4_MOUT 439 + }, { 440 + DDP_COMPONENT_MERGE5, DDP_COMPONENT_DP_INTF1, 441 + MT8195_VDO1_MERGE4_SOUT_SEL, GENMASK(1, 0), 442 + MT8195_MERGE4_SOUT_TO_DP_INTF0_SEL 443 + } 444 + }; 441 445 #endif /* __SOC_MEDIATEK_MT8195_MMSYS_H */
+2 -9
drivers/soc/mediatek/mtk-devapc.c
··· 276 276 if (!devapc_irq) 277 277 return -EINVAL; 278 278 279 - ctx->infra_clk = devm_clk_get(&pdev->dev, "devapc-infra-clock"); 279 + ctx->infra_clk = devm_clk_get_enabled(&pdev->dev, "devapc-infra-clock"); 280 280 if (IS_ERR(ctx->infra_clk)) 281 - return -EINVAL; 282 - 283 - if (clk_prepare_enable(ctx->infra_clk)) 284 281 return -EINVAL; 285 282 286 283 ret = devm_request_irq(&pdev->dev, devapc_irq, devapc_violation_irq, 287 284 IRQF_TRIGGER_NONE, "devapc", ctx); 288 - if (ret) { 289 - clk_disable_unprepare(ctx->infra_clk); 285 + if (ret) 290 286 return ret; 291 - } 292 287 293 288 platform_set_drvdata(pdev, ctx); 294 289 ··· 297 302 struct mtk_devapc_context *ctx = platform_get_drvdata(pdev); 298 303 299 304 stop_devapc(ctx); 300 - 301 - clk_disable_unprepare(ctx->infra_clk); 302 305 303 306 return 0; 304 307 }
+162 -40
drivers/soc/mediatek/mtk-mmsys.c
··· 7 7 #include <linux/delay.h> 8 8 #include <linux/device.h> 9 9 #include <linux/io.h> 10 + #include <linux/module.h> 10 11 #include <linux/of_device.h> 11 12 #include <linux/platform_device.h> 12 13 #include <linux/reset-controller.h> ··· 17 16 #include "mt8167-mmsys.h" 18 17 #include "mt8183-mmsys.h" 19 18 #include "mt8186-mmsys.h" 19 + #include "mt8188-mmsys.h" 20 20 #include "mt8192-mmsys.h" 21 21 #include "mt8195-mmsys.h" 22 22 #include "mt8365-mmsys.h" 23 + 24 + #define MMSYS_SW_RESET_PER_REG 32 23 25 24 26 static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = { 25 27 .clk_driver = "clk-mt2701-mm", ··· 55 51 .routes = mmsys_default_routing_table, 56 52 .num_routes = ARRAY_SIZE(mmsys_default_routing_table), 57 53 .sw0_rst_offset = MT8183_MMSYS_SW0_RST_B, 54 + .num_resets = 32, 58 55 }; 59 56 60 57 static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = { ··· 63 58 .routes = mmsys_mt8183_routing_table, 64 59 .num_routes = ARRAY_SIZE(mmsys_mt8183_routing_table), 65 60 .sw0_rst_offset = MT8183_MMSYS_SW0_RST_B, 61 + .num_resets = 32, 66 62 }; 67 63 68 64 static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = { ··· 71 65 .routes = mmsys_mt8186_routing_table, 72 66 .num_routes = ARRAY_SIZE(mmsys_mt8186_routing_table), 73 67 .sw0_rst_offset = MT8186_MMSYS_SW0_RST_B, 68 + .num_resets = 32, 69 + }; 70 + 71 + static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data = { 72 + .clk_driver = "clk-mt8188-vdo0", 73 + .routes = mmsys_mt8188_routing_table, 74 + .num_routes = ARRAY_SIZE(mmsys_mt8188_routing_table), 74 75 }; 75 76 76 77 static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data = { ··· 85 72 .routes = mmsys_mt8192_routing_table, 86 73 .num_routes = ARRAY_SIZE(mmsys_mt8192_routing_table), 87 74 .sw0_rst_offset = MT8186_MMSYS_SW0_RST_B, 75 + .num_resets = 32, 88 76 }; 89 77 90 78 static const struct mtk_mmsys_driver_data mt8195_vdosys0_driver_data = { 91 79 .clk_driver = "clk-mt8195-vdo0", 92 80 .routes = mmsys_mt8195_routing_table, 93 81 .num_routes = ARRAY_SIZE(mmsys_mt8195_routing_table), 82 + }; 83 + 84 + static const struct mtk_mmsys_driver_data mt8195_vdosys1_driver_data = { 85 + .clk_driver = "clk-mt8195-vdo1", 86 + .routes = mmsys_mt8195_vdo1_routing_table, 87 + .num_routes = ARRAY_SIZE(mmsys_mt8195_vdo1_routing_table), 88 + .sw0_rst_offset = MT8195_VDO1_SW0_RST_B, 89 + .num_resets = 64, 90 + }; 91 + 92 + static const struct mtk_mmsys_driver_data mt8195_vppsys0_driver_data = { 93 + .clk_driver = "clk-mt8195-vpp0", 94 + .is_vppsys = true, 95 + }; 96 + 97 + static const struct mtk_mmsys_driver_data mt8195_vppsys1_driver_data = { 98 + .clk_driver = "clk-mt8195-vpp1", 99 + .is_vppsys = true, 94 100 }; 95 101 96 102 static const struct mtk_mmsys_driver_data mt8365_mmsys_driver_data = { ··· 123 91 const struct mtk_mmsys_driver_data *data; 124 92 spinlock_t lock; /* protects mmsys_sw_rst_b reg */ 125 93 struct reset_controller_dev rcdev; 94 + struct cmdq_client_reg cmdq_base; 126 95 }; 96 + 97 + static void mtk_mmsys_update_bits(struct mtk_mmsys *mmsys, u32 offset, u32 mask, u32 val, 98 + struct cmdq_pkt *cmdq_pkt) 99 + { 100 + u32 tmp; 101 + 102 + #if IS_REACHABLE(CONFIG_MTK_CMDQ) 103 + if (cmdq_pkt) { 104 + if (mmsys->cmdq_base.size == 0) { 105 + pr_err("mmsys lose gce property, failed to update mmsys bits with cmdq"); 106 + return; 107 + } 108 + cmdq_pkt_write_mask(cmdq_pkt, mmsys->cmdq_base.subsys, 109 + mmsys->cmdq_base.offset + offset, val, 110 + mask); 111 + return; 112 + } 113 + #endif 114 + 115 + tmp = readl_relaxed(mmsys->regs + offset); 116 + tmp = (tmp & ~mask) | (val & mask); 117 + writel_relaxed(tmp, mmsys->regs + offset); 118 + } 127 119 128 120 void mtk_mmsys_ddp_connect(struct device *dev, 129 121 enum mtk_ddp_comp_id cur, ··· 155 99 { 156 100 struct mtk_mmsys *mmsys = dev_get_drvdata(dev); 157 101 const struct mtk_mmsys_routes *routes = mmsys->data->routes; 158 - u32 reg; 159 102 int i; 160 103 161 104 for (i = 0; i < mmsys->data->num_routes; i++) 162 - if (cur == routes[i].from_comp && next == routes[i].to_comp) { 163 - reg = readl_relaxed(mmsys->regs + routes[i].addr); 164 - reg &= ~routes[i].mask; 165 - reg |= routes[i].val; 166 - writel_relaxed(reg, mmsys->regs + routes[i].addr); 167 - } 105 + if (cur == routes[i].from_comp && next == routes[i].to_comp) 106 + mtk_mmsys_update_bits(mmsys, routes[i].addr, routes[i].mask, 107 + routes[i].val, NULL); 168 108 } 169 109 EXPORT_SYMBOL_GPL(mtk_mmsys_ddp_connect); 170 110 ··· 170 118 { 171 119 struct mtk_mmsys *mmsys = dev_get_drvdata(dev); 172 120 const struct mtk_mmsys_routes *routes = mmsys->data->routes; 173 - u32 reg; 174 121 int i; 175 122 176 123 for (i = 0; i < mmsys->data->num_routes; i++) 177 - if (cur == routes[i].from_comp && next == routes[i].to_comp) { 178 - reg = readl_relaxed(mmsys->regs + routes[i].addr); 179 - reg &= ~routes[i].mask; 180 - writel_relaxed(reg, mmsys->regs + routes[i].addr); 181 - } 124 + if (cur == routes[i].from_comp && next == routes[i].to_comp) 125 + mtk_mmsys_update_bits(mmsys, routes[i].addr, routes[i].mask, 0, NULL); 182 126 } 183 127 EXPORT_SYMBOL_GPL(mtk_mmsys_ddp_disconnect); 184 128 185 - static void mtk_mmsys_update_bits(struct mtk_mmsys *mmsys, u32 offset, u32 mask, u32 val) 129 + void mtk_mmsys_merge_async_config(struct device *dev, int idx, int width, int height, 130 + struct cmdq_pkt *cmdq_pkt) 186 131 { 187 - u32 tmp; 188 - 189 - tmp = readl_relaxed(mmsys->regs + offset); 190 - tmp = (tmp & ~mask) | val; 191 - writel_relaxed(tmp, mmsys->regs + offset); 132 + mtk_mmsys_update_bits(dev_get_drvdata(dev), MT8195_VDO1_MERGE0_ASYNC_CFG_WD + 0x10 * idx, 133 + ~0, height << 16 | width, cmdq_pkt); 192 134 } 135 + EXPORT_SYMBOL_GPL(mtk_mmsys_merge_async_config); 136 + 137 + void mtk_mmsys_hdr_config(struct device *dev, int be_width, int be_height, 138 + struct cmdq_pkt *cmdq_pkt) 139 + { 140 + mtk_mmsys_update_bits(dev_get_drvdata(dev), MT8195_VDO1_HDRBE_ASYNC_CFG_WD, ~0, 141 + be_height << 16 | be_width, cmdq_pkt); 142 + } 143 + EXPORT_SYMBOL_GPL(mtk_mmsys_hdr_config); 144 + 145 + void mtk_mmsys_mixer_in_config(struct device *dev, int idx, bool alpha_sel, u16 alpha, 146 + u8 mode, u32 biwidth, struct cmdq_pkt *cmdq_pkt) 147 + { 148 + struct mtk_mmsys *mmsys = dev_get_drvdata(dev); 149 + 150 + mtk_mmsys_update_bits(mmsys, MT8195_VDO1_MIXER_IN1_ALPHA + (idx - 1) * 4, ~0, 151 + alpha << 16 | alpha, cmdq_pkt); 152 + mtk_mmsys_update_bits(mmsys, MT8195_VDO1_HDR_TOP_CFG, BIT(19 + idx), 153 + alpha_sel << (19 + idx), cmdq_pkt); 154 + mtk_mmsys_update_bits(mmsys, MT8195_VDO1_MIXER_IN1_PAD + (idx - 1) * 4, 155 + GENMASK(31, 16) | GENMASK(1, 0), biwidth << 16 | mode, cmdq_pkt); 156 + } 157 + EXPORT_SYMBOL_GPL(mtk_mmsys_mixer_in_config); 158 + 159 + void mtk_mmsys_mixer_in_channel_swap(struct device *dev, int idx, bool channel_swap, 160 + struct cmdq_pkt *cmdq_pkt) 161 + { 162 + mtk_mmsys_update_bits(dev_get_drvdata(dev), MT8195_VDO1_MIXER_IN1_PAD + (idx - 1) * 4, 163 + BIT(4), channel_swap << 4, cmdq_pkt); 164 + } 165 + EXPORT_SYMBOL_GPL(mtk_mmsys_mixer_in_channel_swap); 193 166 194 167 void mtk_mmsys_ddp_dpi_fmt_config(struct device *dev, u32 val) 195 168 { ··· 223 146 switch (val) { 224 147 case MTK_DPI_RGB888_SDR_CON: 225 148 mtk_mmsys_update_bits(mmsys, MT8186_MMSYS_DPI_OUTPUT_FORMAT, 226 - MT8186_DPI_FORMAT_MASK, MT8186_DPI_RGB888_SDR_CON); 149 + MT8186_DPI_FORMAT_MASK, MT8186_DPI_RGB888_SDR_CON, NULL); 227 150 break; 228 151 case MTK_DPI_RGB565_SDR_CON: 229 152 mtk_mmsys_update_bits(mmsys, MT8186_MMSYS_DPI_OUTPUT_FORMAT, 230 - MT8186_DPI_FORMAT_MASK, MT8186_DPI_RGB565_SDR_CON); 153 + MT8186_DPI_FORMAT_MASK, MT8186_DPI_RGB565_SDR_CON, NULL); 231 154 break; 232 155 case MTK_DPI_RGB565_DDR_CON: 233 156 mtk_mmsys_update_bits(mmsys, MT8186_MMSYS_DPI_OUTPUT_FORMAT, 234 - MT8186_DPI_FORMAT_MASK, MT8186_DPI_RGB565_DDR_CON); 157 + MT8186_DPI_FORMAT_MASK, MT8186_DPI_RGB565_DDR_CON, NULL); 235 158 break; 236 159 case MTK_DPI_RGB888_DDR_CON: 237 160 default: 238 161 mtk_mmsys_update_bits(mmsys, MT8186_MMSYS_DPI_OUTPUT_FORMAT, 239 - MT8186_DPI_FORMAT_MASK, MT8186_DPI_RGB888_DDR_CON); 162 + MT8186_DPI_FORMAT_MASK, MT8186_DPI_RGB888_DDR_CON, NULL); 240 163 break; 241 164 } 242 165 } ··· 247 170 { 248 171 struct mtk_mmsys *mmsys = container_of(rcdev, struct mtk_mmsys, rcdev); 249 172 unsigned long flags; 173 + u32 offset; 250 174 u32 reg; 175 + 176 + offset = (id / MMSYS_SW_RESET_PER_REG) * sizeof(u32); 177 + id = id % MMSYS_SW_RESET_PER_REG; 178 + reg = mmsys->data->sw0_rst_offset + offset; 251 179 252 180 spin_lock_irqsave(&mmsys->lock, flags); 253 181 254 - reg = readl_relaxed(mmsys->regs + mmsys->data->sw0_rst_offset); 255 - 256 182 if (assert) 257 - reg &= ~BIT(id); 183 + mtk_mmsys_update_bits(mmsys, reg, BIT(id), 0, NULL); 258 184 else 259 - reg |= BIT(id); 260 - 261 - writel_relaxed(reg, mmsys->regs + mmsys->data->sw0_rst_offset); 185 + mtk_mmsys_update_bits(mmsys, reg, BIT(id), BIT(id), NULL); 262 186 263 187 spin_unlock_irqrestore(&mmsys->lock, flags); 264 188 ··· 314 236 return ret; 315 237 } 316 238 317 - spin_lock_init(&mmsys->lock); 239 + mmsys->data = of_device_get_match_data(&pdev->dev); 318 240 319 - mmsys->rcdev.owner = THIS_MODULE; 320 - mmsys->rcdev.nr_resets = 32; 321 - mmsys->rcdev.ops = &mtk_mmsys_reset_ops; 322 - mmsys->rcdev.of_node = pdev->dev.of_node; 323 - ret = devm_reset_controller_register(&pdev->dev, &mmsys->rcdev); 324 - if (ret) { 325 - dev_err(&pdev->dev, "Couldn't register mmsys reset controller: %d\n", ret); 326 - return ret; 241 + if (mmsys->data->num_resets > 0) { 242 + spin_lock_init(&mmsys->lock); 243 + 244 + mmsys->rcdev.owner = THIS_MODULE; 245 + mmsys->rcdev.nr_resets = mmsys->data->num_resets; 246 + mmsys->rcdev.ops = &mtk_mmsys_reset_ops; 247 + mmsys->rcdev.of_node = pdev->dev.of_node; 248 + ret = devm_reset_controller_register(&pdev->dev, &mmsys->rcdev); 249 + if (ret) { 250 + dev_err(&pdev->dev, "Couldn't register mmsys reset controller: %d\n", ret); 251 + return ret; 252 + } 327 253 } 328 254 329 - mmsys->data = of_device_get_match_data(&pdev->dev); 255 + #if IS_REACHABLE(CONFIG_MTK_CMDQ) 256 + ret = cmdq_dev_get_client_reg(dev, &mmsys->cmdq_base, 0); 257 + if (ret) 258 + dev_dbg(dev, "No mediatek,gce-client-reg!\n"); 259 + #endif 260 + 330 261 platform_set_drvdata(pdev, mmsys); 331 262 332 263 clks = platform_device_register_data(&pdev->dev, mmsys->data->clk_driver, 333 264 PLATFORM_DEVID_AUTO, NULL, 0); 334 265 if (IS_ERR(clks)) 335 266 return PTR_ERR(clks); 267 + 268 + if (mmsys->data->is_vppsys) 269 + goto out_probe_done; 336 270 337 271 drm = platform_device_register_data(&pdev->dev, "mediatek-drm", 338 272 PLATFORM_DEVID_AUTO, NULL, 0); ··· 353 263 return PTR_ERR(drm); 354 264 } 355 265 266 + out_probe_done: 356 267 return 0; 357 268 } 358 269 ··· 391 300 .data = &mt8186_mmsys_driver_data, 392 301 }, 393 302 { 303 + .compatible = "mediatek,mt8188-vdosys0", 304 + .data = &mt8188_vdosys0_driver_data, 305 + }, 306 + { 394 307 .compatible = "mediatek,mt8192-mmsys", 395 308 .data = &mt8192_mmsys_driver_data, 396 309 }, ··· 405 310 { 406 311 .compatible = "mediatek,mt8195-vdosys0", 407 312 .data = &mt8195_vdosys0_driver_data, 313 + }, 314 + { 315 + .compatible = "mediatek,mt8195-vdosys1", 316 + .data = &mt8195_vdosys1_driver_data, 317 + }, 318 + { 319 + .compatible = "mediatek,mt8195-vppsys0", 320 + .data = &mt8195_vppsys0_driver_data, 321 + }, 322 + { 323 + .compatible = "mediatek,mt8195-vppsys1", 324 + .data = &mt8195_vppsys1_driver_data, 408 325 }, 409 326 { 410 327 .compatible = "mediatek,mt8365-mmsys", ··· 433 326 .probe = mtk_mmsys_probe, 434 327 }; 435 328 436 - builtin_platform_driver(mtk_mmsys_drv); 329 + static int __init mtk_mmsys_init(void) 330 + { 331 + return platform_driver_register(&mtk_mmsys_drv); 332 + } 333 + 334 + static void __exit mtk_mmsys_exit(void) 335 + { 336 + platform_driver_unregister(&mtk_mmsys_drv); 337 + } 338 + 339 + module_init(mtk_mmsys_init); 340 + module_exit(mtk_mmsys_exit); 341 + 342 + MODULE_AUTHOR("Yongqiang Niu <yongqiang.niu@mediatek.com>"); 343 + MODULE_DESCRIPTION("MediaTek SoC MMSYS driver"); 344 + MODULE_LICENSE("GPL");
+2
drivers/soc/mediatek/mtk-mmsys.h
··· 91 91 const struct mtk_mmsys_routes *routes; 92 92 const unsigned int num_routes; 93 93 const u16 sw0_rst_offset; 94 + const u32 num_resets; 95 + const bool is_vppsys; 94 96 }; 95 97 96 98 /*
+106 -7
drivers/soc/mediatek/mtk-mutex.c
··· 116 116 #define MT8173_MUTEX_MOD_DISP_PWM1 24 117 117 #define MT8173_MUTEX_MOD_DISP_OD 25 118 118 119 + #define MT8188_MUTEX_MOD_DISP_OVL0 0 120 + #define MT8188_MUTEX_MOD_DISP_WDMA0 1 121 + #define MT8188_MUTEX_MOD_DISP_RDMA0 2 122 + #define MT8188_MUTEX_MOD_DISP_COLOR0 3 123 + #define MT8188_MUTEX_MOD_DISP_CCORR0 4 124 + #define MT8188_MUTEX_MOD_DISP_AAL0 5 125 + #define MT8188_MUTEX_MOD_DISP_GAMMA0 6 126 + #define MT8188_MUTEX_MOD_DISP_DITHER0 7 127 + #define MT8188_MUTEX_MOD_DISP_DSI0 8 128 + #define MT8188_MUTEX_MOD_DISP_DSC_WRAP0_CORE0 9 129 + #define MT8188_MUTEX_MOD_DISP_VPP_MERGE 20 130 + #define MT8188_MUTEX_MOD_DISP_DP_INTF0 21 131 + #define MT8188_MUTEX_MOD_DISP_POSTMASK0 24 132 + #define MT8188_MUTEX_MOD2_DISP_PWM0 33 133 + 119 134 #define MT8195_MUTEX_MOD_DISP_OVL0 0 120 135 #define MT8195_MUTEX_MOD_DISP_WDMA0 1 121 136 #define MT8195_MUTEX_MOD_DISP_RDMA0 2 ··· 144 129 #define MT8195_MUTEX_MOD_DISP_VPP_MERGE 20 145 130 #define MT8195_MUTEX_MOD_DISP_DP_INTF0 21 146 131 #define MT8195_MUTEX_MOD_DISP_PWM0 27 132 + 133 + #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA0 0 134 + #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA1 1 135 + #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA2 2 136 + #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA3 3 137 + #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA4 4 138 + #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA5 5 139 + #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA6 6 140 + #define MT8195_MUTEX_MOD_DISP1_MDP_RDMA7 7 141 + #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE0 8 142 + #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE1 9 143 + #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE2 10 144 + #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE3 11 145 + #define MT8195_MUTEX_MOD_DISP1_VPP_MERGE4 12 146 + #define MT8195_MUTEX_MOD_DISP1_DISP_MIXER 18 147 + #define MT8195_MUTEX_MOD_DISP1_DPI0 25 148 + #define MT8195_MUTEX_MOD_DISP1_DPI1 26 149 + #define MT8195_MUTEX_MOD_DISP1_DP_INTF0 27 147 150 148 151 #define MT8365_MUTEX_MOD_DISP_OVL0 7 149 152 #define MT8365_MUTEX_MOD_DISP_OVL0_2L 8 ··· 213 180 #define MT8167_MUTEX_SOF_DPI1 3 214 181 #define MT8183_MUTEX_SOF_DSI0 1 215 182 #define MT8183_MUTEX_SOF_DPI0 2 183 + #define MT8188_MUTEX_SOF_DSI0 1 184 + #define MT8188_MUTEX_SOF_DP_INTF0 3 216 185 #define MT8195_MUTEX_SOF_DSI0 1 217 186 #define MT8195_MUTEX_SOF_DSI1 2 218 187 #define MT8195_MUTEX_SOF_DP_INTF0 3 ··· 224 189 225 190 #define MT8183_MUTEX_EOF_DSI0 (MT8183_MUTEX_SOF_DSI0 << 6) 226 191 #define MT8183_MUTEX_EOF_DPI0 (MT8183_MUTEX_SOF_DPI0 << 6) 192 + #define MT8188_MUTEX_EOF_DSI0 (MT8188_MUTEX_SOF_DSI0 << 7) 193 + #define MT8188_MUTEX_EOF_DP_INTF0 (MT8188_MUTEX_SOF_DP_INTF0 << 7) 227 194 #define MT8195_MUTEX_EOF_DSI0 (MT8195_MUTEX_SOF_DSI0 << 7) 228 195 #define MT8195_MUTEX_EOF_DSI1 (MT8195_MUTEX_SOF_DSI1 << 7) 229 196 #define MT8195_MUTEX_EOF_DP_INTF0 (MT8195_MUTEX_SOF_DP_INTF0 << 7) ··· 381 344 [MUTEX_MOD_IDX_MDP_COLOR0] = MT8186_MUTEX_MOD_MDP_COLOR0, 382 345 }; 383 346 347 + static const unsigned int mt8188_mutex_mod[DDP_COMPONENT_ID_MAX] = { 348 + [DDP_COMPONENT_OVL0] = MT8188_MUTEX_MOD_DISP_OVL0, 349 + [DDP_COMPONENT_WDMA0] = MT8188_MUTEX_MOD_DISP_WDMA0, 350 + [DDP_COMPONENT_RDMA0] = MT8188_MUTEX_MOD_DISP_RDMA0, 351 + [DDP_COMPONENT_COLOR0] = MT8188_MUTEX_MOD_DISP_COLOR0, 352 + [DDP_COMPONENT_CCORR] = MT8188_MUTEX_MOD_DISP_CCORR0, 353 + [DDP_COMPONENT_AAL0] = MT8188_MUTEX_MOD_DISP_AAL0, 354 + [DDP_COMPONENT_GAMMA] = MT8188_MUTEX_MOD_DISP_GAMMA0, 355 + [DDP_COMPONENT_POSTMASK0] = MT8188_MUTEX_MOD_DISP_POSTMASK0, 356 + [DDP_COMPONENT_DITHER0] = MT8188_MUTEX_MOD_DISP_DITHER0, 357 + [DDP_COMPONENT_MERGE0] = MT8188_MUTEX_MOD_DISP_VPP_MERGE, 358 + [DDP_COMPONENT_DSC0] = MT8188_MUTEX_MOD_DISP_DSC_WRAP0_CORE0, 359 + [DDP_COMPONENT_DSI0] = MT8188_MUTEX_MOD_DISP_DSI0, 360 + [DDP_COMPONENT_PWM0] = MT8188_MUTEX_MOD2_DISP_PWM0, 361 + [DDP_COMPONENT_DP_INTF0] = MT8188_MUTEX_MOD_DISP_DP_INTF0, 362 + }; 363 + 384 364 static const unsigned int mt8192_mutex_mod[DDP_COMPONENT_ID_MAX] = { 385 365 [DDP_COMPONENT_AAL0] = MT8192_MUTEX_MOD_DISP_AAL0, 386 366 [DDP_COMPONENT_CCORR] = MT8192_MUTEX_MOD_DISP_CCORR0, ··· 426 372 [DDP_COMPONENT_DSI0] = MT8195_MUTEX_MOD_DISP_DSI0, 427 373 [DDP_COMPONENT_PWM0] = MT8195_MUTEX_MOD_DISP_PWM0, 428 374 [DDP_COMPONENT_DP_INTF0] = MT8195_MUTEX_MOD_DISP_DP_INTF0, 375 + [DDP_COMPONENT_MDP_RDMA0] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA0, 376 + [DDP_COMPONENT_MDP_RDMA1] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA1, 377 + [DDP_COMPONENT_MDP_RDMA2] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA2, 378 + [DDP_COMPONENT_MDP_RDMA3] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA3, 379 + [DDP_COMPONENT_MDP_RDMA4] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA4, 380 + [DDP_COMPONENT_MDP_RDMA5] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA5, 381 + [DDP_COMPONENT_MDP_RDMA6] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA6, 382 + [DDP_COMPONENT_MDP_RDMA7] = MT8195_MUTEX_MOD_DISP1_MDP_RDMA7, 383 + [DDP_COMPONENT_MERGE1] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE0, 384 + [DDP_COMPONENT_MERGE2] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE1, 385 + [DDP_COMPONENT_MERGE3] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE2, 386 + [DDP_COMPONENT_MERGE4] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE3, 387 + [DDP_COMPONENT_ETHDR_MIXER] = MT8195_MUTEX_MOD_DISP1_DISP_MIXER, 388 + [DDP_COMPONENT_MERGE5] = MT8195_MUTEX_MOD_DISP1_VPP_MERGE4, 389 + [DDP_COMPONENT_DP_INTF1] = MT8195_MUTEX_MOD_DISP1_DP_INTF0, 429 390 }; 430 391 431 392 static const unsigned int mt8365_mutex_mod[DDP_COMPONENT_ID_MAX] = { ··· 504 435 * but also detect the error at end of frame(EAEOF) when EOF signal 505 436 * arrives. 506 437 */ 438 + static const unsigned int mt8188_mutex_sof[DDP_MUTEX_SOF_MAX] = { 439 + [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE, 440 + [MUTEX_SOF_DSI0] = 441 + MT8188_MUTEX_SOF_DSI0 | MT8188_MUTEX_EOF_DSI0, 442 + [MUTEX_SOF_DP_INTF0] = 443 + MT8188_MUTEX_SOF_DP_INTF0 | MT8188_MUTEX_EOF_DP_INTF0, 444 + }; 445 + 507 446 static const unsigned int mt8195_mutex_sof[DDP_MUTEX_SOF_MAX] = { 508 447 [MUTEX_SOF_SINGLE_MODE] = MUTEX_SOF_SINGLE_MODE, 509 448 [MUTEX_SOF_DSI0] = MT8195_MUTEX_SOF_DSI0 | MT8195_MUTEX_EOF_DSI0, ··· 578 501 static const struct mtk_mutex_data mt8186_mutex_driver_data = { 579 502 .mutex_mod = mt8186_mutex_mod, 580 503 .mutex_sof = mt8186_mutex_sof, 504 + .mutex_mod_reg = MT8183_MUTEX0_MOD0, 505 + .mutex_sof_reg = MT8183_MUTEX0_SOF0, 506 + }; 507 + 508 + static const struct mtk_mutex_data mt8188_mutex_driver_data = { 509 + .mutex_mod = mt8188_mutex_mod, 510 + .mutex_sof = mt8188_mutex_sof, 581 511 .mutex_mod_reg = MT8183_MUTEX0_MOD0, 582 512 .mutex_sof_reg = MT8183_MUTEX0_SOF0, 583 513 }; ··· 686 602 case DDP_COMPONENT_DP_INTF0: 687 603 sof_id = MUTEX_SOF_DP_INTF0; 688 604 break; 605 + case DDP_COMPONENT_DP_INTF1: 606 + sof_id = MUTEX_SOF_DP_INTF1; 607 + break; 689 608 default: 690 609 if (mtx->data->mutex_mod[id] < 32) { 691 610 offset = DISP_REG_MUTEX_MOD(mtx->data->mutex_mod_reg, ··· 729 642 case DDP_COMPONENT_DPI0: 730 643 case DDP_COMPONENT_DPI1: 731 644 case DDP_COMPONENT_DP_INTF0: 645 + case DDP_COMPONENT_DP_INTF1: 732 646 writel_relaxed(MUTEX_SOF_SINGLE_MODE, 733 647 mtx->regs + 734 648 DISP_REG_MUTEX_SOF(mtx->data->mutex_sof_reg, ··· 920 832 return 0; 921 833 } 922 834 923 - static int mtk_mutex_remove(struct platform_device *pdev) 924 - { 925 - return 0; 926 - } 927 - 928 835 static const struct of_device_id mutex_driver_dt_match[] = { 929 836 { .compatible = "mediatek,mt2701-disp-mutex", 930 837 .data = &mt2701_mutex_driver_data}, ··· 937 854 .data = &mt8186_mutex_driver_data}, 938 855 { .compatible = "mediatek,mt8186-mdp3-mutex", 939 856 .data = &mt8186_mdp_mutex_driver_data}, 857 + { .compatible = "mediatek,mt8188-disp-mutex", 858 + .data = &mt8188_mutex_driver_data}, 940 859 { .compatible = "mediatek,mt8192-disp-mutex", 941 860 .data = &mt8192_mutex_driver_data}, 942 861 { .compatible = "mediatek,mt8195-disp-mutex", ··· 951 866 952 867 static struct platform_driver mtk_mutex_driver = { 953 868 .probe = mtk_mutex_probe, 954 - .remove = mtk_mutex_remove, 955 869 .driver = { 956 870 .name = "mediatek-mutex", 957 871 .owner = THIS_MODULE, ··· 958 874 }, 959 875 }; 960 876 961 - builtin_platform_driver(mtk_mutex_driver); 877 + static int __init mtk_mutex_init(void) 878 + { 879 + return platform_driver_register(&mtk_mutex_driver); 880 + } 881 + 882 + static void __exit mtk_mutex_exit(void) 883 + { 884 + platform_driver_unregister(&mtk_mutex_driver); 885 + } 886 + 887 + module_init(mtk_mutex_init); 888 + module_exit(mtk_mutex_exit); 889 + 890 + MODULE_AUTHOR("Yongqiang Niu <yongqiang.niu@mediatek.com>"); 891 + MODULE_DESCRIPTION("MediaTek SoC MUTEX driver"); 892 + MODULE_LICENSE("GPL");
+13
drivers/soc/mediatek/mtk-pm-domains.c
··· 21 21 #include "mt8173-pm-domains.h" 22 22 #include "mt8183-pm-domains.h" 23 23 #include "mt8186-pm-domains.h" 24 + #include "mt8188-pm-domains.h" 24 25 #include "mt8192-pm-domains.h" 25 26 #include "mt8195-pm-domains.h" 26 27 ··· 219 218 if (ret) 220 219 goto err_reg; 221 220 221 + if (pd->data->ext_buck_iso_offs && MTK_SCPD_CAPS(pd, MTK_SCPD_EXT_BUCK_ISO)) 222 + regmap_clear_bits(scpsys->base, pd->data->ext_buck_iso_offs, 223 + pd->data->ext_buck_iso_mask); 224 + 222 225 /* subsys power on */ 223 226 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_BIT); 224 227 regmap_set_bits(scpsys->base, pd->data->ctl_offs, PWR_ON_2ND_BIT); ··· 276 271 ret = scpsys_sram_disable(pd); 277 272 if (ret < 0) 278 273 return ret; 274 + 275 + if (pd->data->ext_buck_iso_offs && MTK_SCPD_CAPS(pd, MTK_SCPD_EXT_BUCK_ISO)) 276 + regmap_set_bits(scpsys->base, pd->data->ext_buck_iso_offs, 277 + pd->data->ext_buck_iso_mask); 279 278 280 279 clk_bulk_disable_unprepare(pd->num_subsys_clks, pd->subsys_clks); 281 280 ··· 587 578 { 588 579 .compatible = "mediatek,mt8186-power-controller", 589 580 .data = &mt8186_scpsys_data, 581 + }, 582 + { 583 + .compatible = "mediatek,mt8188-power-controller", 584 + .data = &mt8188_scpsys_data, 590 585 }, 591 586 { 592 587 .compatible = "mediatek,mt8192-power-controller",
+5
drivers/soc/mediatek/mtk-pm-domains.h
··· 10 10 #define MTK_SCPD_DOMAIN_SUPPLY BIT(4) 11 11 /* can't set MTK_SCPD_KEEP_DEFAULT_OFF at the same time */ 12 12 #define MTK_SCPD_ALWAYS_ON BIT(5) 13 + #define MTK_SCPD_EXT_BUCK_ISO BIT(6) 13 14 #define MTK_SCPD_CAPS(_scpd, _x) ((_scpd)->data->caps & (_x)) 14 15 15 16 #define SPM_VDE_PWR_CON 0x0210 ··· 82 81 * @ctl_offs: The offset for main power control register. 83 82 * @sram_pdn_bits: The mask for sram power control bits. 84 83 * @sram_pdn_ack_bits: The mask for sram power control acked bits. 84 + * @ext_buck_iso_offs: The offset for external buck isolation 85 + * @ext_buck_iso_mask: The mask for external buck isolation 85 86 * @caps: The flag for active wake-up action. 86 87 * @bp_infracfg: bus protection for infracfg subsystem 87 88 * @bp_smi: bus protection for smi subsystem ··· 94 91 int ctl_offs; 95 92 u32 sram_pdn_bits; 96 93 u32 sram_pdn_ack_bits; 94 + int ext_buck_iso_offs; 95 + u32 ext_buck_iso_mask; 97 96 u8 caps; 98 97 const struct scpsys_bus_prot_data bp_infracfg[SPM_MAX_BUS_PROT_DATA]; 99 98 const struct scpsys_bus_prot_data bp_smi[SPM_MAX_BUS_PROT_DATA];
+159
drivers/soc/mediatek/mtk-regulator-coupler.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Voltage regulators coupler for MediaTek SoCs 4 + * 5 + * Copyright (C) 2022 Collabora, Ltd. 6 + * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> 7 + */ 8 + 9 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 10 + 11 + #include <linux/init.h> 12 + #include <linux/kernel.h> 13 + #include <linux/of.h> 14 + #include <linux/regulator/coupler.h> 15 + #include <linux/regulator/driver.h> 16 + #include <linux/regulator/machine.h> 17 + #include <linux/suspend.h> 18 + 19 + #define to_mediatek_coupler(x) container_of(x, struct mediatek_regulator_coupler, coupler) 20 + 21 + struct mediatek_regulator_coupler { 22 + struct regulator_coupler coupler; 23 + struct regulator_dev *vsram_rdev; 24 + }; 25 + 26 + /* 27 + * We currently support only couples of not more than two vregs and 28 + * modify the vsram voltage only when changing voltage of vgpu. 29 + * 30 + * This function is limited to the GPU<->SRAM voltages relationships. 31 + */ 32 + static int mediatek_regulator_balance_voltage(struct regulator_coupler *coupler, 33 + struct regulator_dev *rdev, 34 + suspend_state_t state) 35 + { 36 + struct mediatek_regulator_coupler *mrc = to_mediatek_coupler(coupler); 37 + int max_spread = rdev->constraints->max_spread[0]; 38 + int vsram_min_uV = mrc->vsram_rdev->constraints->min_uV; 39 + int vsram_max_uV = mrc->vsram_rdev->constraints->max_uV; 40 + int vsram_target_min_uV, vsram_target_max_uV; 41 + int min_uV = 0; 42 + int max_uV = INT_MAX; 43 + int ret; 44 + 45 + /* 46 + * If the target device is on, setting the SRAM voltage directly 47 + * is not supported as it scales through its coupled supply voltage. 48 + * 49 + * An exception is made in case the use_count is zero: this means 50 + * that this is the first time we power up the SRAM regulator, which 51 + * implies that the target device has yet to perform initialization 52 + * and setting a voltage at that time is harmless. 53 + */ 54 + if (rdev == mrc->vsram_rdev) { 55 + if (rdev->use_count == 0) 56 + return regulator_do_balance_voltage(rdev, state, true); 57 + 58 + return -EPERM; 59 + } 60 + 61 + ret = regulator_check_consumers(rdev, &min_uV, &max_uV, state); 62 + if (ret < 0) 63 + return ret; 64 + 65 + if (min_uV == 0) { 66 + ret = regulator_get_voltage_rdev(rdev); 67 + if (ret < 0) 68 + return ret; 69 + min_uV = ret; 70 + } 71 + 72 + ret = regulator_check_voltage(rdev, &min_uV, &max_uV); 73 + if (ret < 0) 74 + return ret; 75 + 76 + /* 77 + * If we're asked to set a voltage less than VSRAM min_uV, set 78 + * the minimum allowed voltage on VSRAM, as in this case it is 79 + * safe to ignore the max_spread parameter. 80 + */ 81 + vsram_target_min_uV = max(vsram_min_uV, min_uV + max_spread); 82 + vsram_target_max_uV = min(vsram_max_uV, vsram_target_min_uV + max_spread); 83 + 84 + /* Make sure we're not out of range */ 85 + vsram_target_min_uV = min(vsram_target_min_uV, vsram_max_uV); 86 + 87 + pr_debug("Setting voltage %d-%duV on %s (minuV %d)\n", 88 + vsram_target_min_uV, vsram_target_max_uV, 89 + rdev_get_name(mrc->vsram_rdev), min_uV); 90 + 91 + ret = regulator_set_voltage_rdev(mrc->vsram_rdev, vsram_target_min_uV, 92 + vsram_target_max_uV, state); 93 + if (ret) 94 + return ret; 95 + 96 + /* The sram voltage is now balanced: update the target vreg voltage */ 97 + return regulator_do_balance_voltage(rdev, state, true); 98 + } 99 + 100 + static int mediatek_regulator_attach(struct regulator_coupler *coupler, 101 + struct regulator_dev *rdev) 102 + { 103 + struct mediatek_regulator_coupler *mrc = to_mediatek_coupler(coupler); 104 + const char *rdev_name = rdev_get_name(rdev); 105 + 106 + /* 107 + * If we're getting a coupling of more than two regulators here and 108 + * this means that this is surely not a GPU<->SRAM couple: in that 109 + * case, we may want to use another coupler implementation, if any, 110 + * or the generic one: the regulator core will keep walking through 111 + * the list of couplers when any .attach_regulator() cb returns 1. 112 + */ 113 + if (rdev->coupling_desc.n_coupled > 2) 114 + return 1; 115 + 116 + if (strstr(rdev_name, "sram")) { 117 + if (mrc->vsram_rdev) 118 + return -EINVAL; 119 + mrc->vsram_rdev = rdev; 120 + } else if (!strstr(rdev_name, "vgpu") && !strstr(rdev_name, "Vgpu")) { 121 + return 1; 122 + } 123 + 124 + return 0; 125 + } 126 + 127 + static int mediatek_regulator_detach(struct regulator_coupler *coupler, 128 + struct regulator_dev *rdev) 129 + { 130 + struct mediatek_regulator_coupler *mrc = to_mediatek_coupler(coupler); 131 + 132 + if (rdev == mrc->vsram_rdev) 133 + mrc->vsram_rdev = NULL; 134 + 135 + return 0; 136 + } 137 + 138 + static struct mediatek_regulator_coupler mediatek_coupler = { 139 + .coupler = { 140 + .attach_regulator = mediatek_regulator_attach, 141 + .detach_regulator = mediatek_regulator_detach, 142 + .balance_voltage = mediatek_regulator_balance_voltage, 143 + }, 144 + }; 145 + 146 + static int mediatek_regulator_coupler_init(void) 147 + { 148 + if (!of_machine_is_compatible("mediatek,mt8183") && 149 + !of_machine_is_compatible("mediatek,mt8186") && 150 + !of_machine_is_compatible("mediatek,mt8192")) 151 + return 0; 152 + 153 + return regulator_coupler_register(&mediatek_coupler.coupler); 154 + } 155 + arch_initcall(mediatek_regulator_coupler_init); 156 + 157 + MODULE_AUTHOR("AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>"); 158 + MODULE_DESCRIPTION("MediaTek Regulator Coupler driver"); 159 + MODULE_LICENSE("GPL");
+92 -85
drivers/soc/mediatek/mtk-svs.c
··· 138 138 139 139 static DEFINE_SPINLOCK(svs_lock); 140 140 141 + #ifdef CONFIG_DEBUG_FS 141 142 #define debug_fops_ro(name) \ 142 143 static int svs_##name##_debug_open(struct inode *inode, \ 143 144 struct file *filp) \ ··· 171 170 } 172 171 173 172 #define svs_dentry_data(name) {__stringify(name), &svs_##name##_debug_fops} 173 + #endif 174 174 175 175 /** 176 176 * enum svsb_phase - svs bank phase enumeration ··· 313 311 314 312 /** 315 313 * struct svs_platform - svs platform control 316 - * @name: svs platform name 317 314 * @base: svs platform register base 318 315 * @dev: svs platform device 319 316 * @main_clk: main clock for svs bank 320 317 * @pbank: svs bank pointer needing to be protected by spin_lock section 321 318 * @banks: svs banks that svs platform supports 322 319 * @rst: svs platform reset control 323 - * @efuse_parsing: svs platform efuse parsing function pointer 324 - * @probe: svs platform probe function pointer 325 320 * @efuse_max: total number of svs efuse 326 321 * @tefuse_max: total number of thermal efuse 327 322 * @regs: svs platform registers map ··· 327 328 * @tefuse: thermal efuse data received from NVMEM framework 328 329 */ 329 330 struct svs_platform { 330 - char *name; 331 331 void __iomem *base; 332 332 struct device *dev; 333 333 struct clk *main_clk; 334 334 struct svs_bank *pbank; 335 335 struct svs_bank *banks; 336 336 struct reset_control *rst; 337 - bool (*efuse_parsing)(struct svs_platform *svsp); 338 - int (*probe)(struct svs_platform *svsp); 339 337 size_t efuse_max; 340 338 size_t tefuse_max; 341 339 const u32 *regs; ··· 624 628 return ret; 625 629 } 626 630 631 + #ifdef CONFIG_DEBUG_FS 627 632 static int svs_dump_debug_show(struct seq_file *m, void *p) 628 633 { 629 634 struct svs_platform *svsp = (struct svs_platform *)m->private; ··· 840 843 841 844 return 0; 842 845 } 846 + #endif /* CONFIG_DEBUG_FS */ 843 847 844 848 static u32 interpolate(u32 f0, u32 f1, u32 v0, u32 v1, u32 fx) 845 849 { ··· 1322 1324 svsb->pm_runtime_enabled_count++; 1323 1325 } 1324 1326 1325 - ret = pm_runtime_get_sync(svsb->opp_dev); 1327 + ret = pm_runtime_resume_and_get(svsb->opp_dev); 1326 1328 if (ret < 0) { 1327 1329 dev_err(svsb->dev, "mtcmos on fail: %d\n", ret); 1328 1330 goto svs_init01_resume_cpuidle; ··· 1459 1461 { 1460 1462 struct svs_bank *svsb; 1461 1463 unsigned long flags, time_left; 1464 + int ret; 1462 1465 u32 idx; 1463 1466 1464 1467 for (idx = 0; idx < svsp->bank_max; idx++) { ··· 1478 1479 msecs_to_jiffies(5000)); 1479 1480 if (!time_left) { 1480 1481 dev_err(svsb->dev, "init02 completion timeout\n"); 1481 - return -EBUSY; 1482 + ret = -EBUSY; 1483 + goto out_of_init02; 1482 1484 } 1483 1485 } 1484 1486 ··· 1497 1497 if (svsb->type == SVSB_HIGH || svsb->type == SVSB_LOW) { 1498 1498 if (svs_sync_bank_volts_from_opp(svsb)) { 1499 1499 dev_err(svsb->dev, "sync volt fail\n"); 1500 - return -EPERM; 1500 + ret = -EPERM; 1501 + goto out_of_init02; 1501 1502 } 1502 1503 } 1503 1504 } 1504 1505 1505 1506 return 0; 1507 + 1508 + out_of_init02: 1509 + for (idx = 0; idx < svsp->bank_max; idx++) { 1510 + svsb = &svsp->banks[idx]; 1511 + 1512 + spin_lock_irqsave(&svs_lock, flags); 1513 + svsp->pbank = svsb; 1514 + svs_switch_bank(svsp); 1515 + svs_writel_relaxed(svsp, SVSB_PTPEN_OFF, SVSEN); 1516 + svs_writel_relaxed(svsp, SVSB_INTSTS_VAL_CLEAN, INTSTS); 1517 + spin_unlock_irqrestore(&svs_lock, flags); 1518 + 1519 + svsb->phase = SVSB_PHASE_ERROR; 1520 + svs_adjust_pm_opp_volts(svsb); 1521 + } 1522 + 1523 + return ret; 1506 1524 } 1507 1525 1508 1526 static void svs_mon_mode(struct svs_platform *svsp) ··· 1612 1594 1613 1595 ret = svs_init02(svsp); 1614 1596 if (ret) 1615 - goto out_of_resume; 1597 + goto svs_resume_reset_assert; 1616 1598 1617 1599 svs_mon_mode(svsp); 1618 1600 1619 1601 return 0; 1602 + 1603 + svs_resume_reset_assert: 1604 + dev_err(svsp->dev, "assert reset: %d\n", 1605 + reset_control_assert(svsp->rst)); 1620 1606 1621 1607 out_of_resume: 1622 1608 clk_disable_unprepare(svsp->main_clk); ··· 1921 1899 o_slope_sign = (svsp->tefuse[0] >> 7) & BIT(0); 1922 1900 1923 1901 ts_id = (svsp->tefuse[1] >> 9) & BIT(0); 1924 - o_slope = (svsp->tefuse[0] >> 26) & GENMASK(5, 0); 1925 - 1926 - if (adc_cali_en_t == 1) { 1927 - if (!ts_id) 1928 - o_slope = 0; 1929 - 1930 - if (adc_ge_t < 265 || adc_ge_t > 758 || 1931 - adc_oe_t < 265 || adc_oe_t > 758 || 1932 - o_vtsmcu[0] < -8 || o_vtsmcu[0] > 484 || 1933 - o_vtsmcu[1] < -8 || o_vtsmcu[1] > 484 || 1934 - o_vtsmcu[2] < -8 || o_vtsmcu[2] > 484 || 1935 - o_vtsmcu[3] < -8 || o_vtsmcu[3] > 484 || 1936 - o_vtsmcu[4] < -8 || o_vtsmcu[4] > 484 || 1937 - o_vtsabb < -8 || o_vtsabb > 484 || 1938 - degc_cali < 1 || degc_cali > 63) { 1939 - dev_err(svsp->dev, "bad thermal efuse, no mon mode\n"); 1940 - goto remove_mt8183_svsb_mon_mode; 1941 - } 1902 + if (!ts_id) { 1903 + o_slope = 1534; 1942 1904 } else { 1943 - dev_err(svsp->dev, "no thermal efuse, no mon mode\n"); 1905 + o_slope = (svsp->tefuse[0] >> 26) & GENMASK(5, 0); 1906 + if (!o_slope_sign) 1907 + o_slope = 1534 + o_slope * 10; 1908 + else 1909 + o_slope = 1534 - o_slope * 10; 1910 + } 1911 + 1912 + if (adc_cali_en_t == 0 || 1913 + adc_ge_t < 265 || adc_ge_t > 758 || 1914 + adc_oe_t < 265 || adc_oe_t > 758 || 1915 + o_vtsmcu[0] < -8 || o_vtsmcu[0] > 484 || 1916 + o_vtsmcu[1] < -8 || o_vtsmcu[1] > 484 || 1917 + o_vtsmcu[2] < -8 || o_vtsmcu[2] > 484 || 1918 + o_vtsmcu[3] < -8 || o_vtsmcu[3] > 484 || 1919 + o_vtsmcu[4] < -8 || o_vtsmcu[4] > 484 || 1920 + o_vtsabb < -8 || o_vtsabb > 484 || 1921 + degc_cali < 1 || degc_cali > 63) { 1922 + dev_err(svsp->dev, "bad thermal efuse, no mon mode\n"); 1944 1923 goto remove_mt8183_svsb_mon_mode; 1945 1924 } 1946 1925 ··· 1960 1937 x_roomt[i] = (((format[i] * 10000) / 4096) * 10000) / gain; 1961 1938 1962 1939 temp0 = (10000 * 100000 / gain) * 15 / 18; 1963 - 1964 - if (!o_slope_sign) 1965 - mts = (temp0 * 10) / (1534 + o_slope * 10); 1966 - else 1967 - mts = (temp0 * 10) / (1534 - o_slope * 10); 1940 + mts = (temp0 * 10) / o_slope; 1968 1941 1969 1942 for (idx = 0; idx < svsp->bank_max; idx++) { 1970 1943 svsb = &svsp->banks[idx]; ··· 1987 1968 temp0 = (degc_cali * 10 / 2); 1988 1969 temp1 = ((10000 * 100000 / 4096 / gain) * 1989 1970 oe + tb_roomt * 10) * 15 / 18; 1990 - 1991 - if (!o_slope_sign) 1992 - temp2 = temp1 * 100 / (1534 + o_slope * 10); 1993 - else 1994 - temp2 = temp1 * 100 / (1534 - o_slope * 10); 1971 + temp2 = temp1 * 100 / o_slope; 1995 1972 1996 1973 svsb->bts = (temp0 + temp2 - 250) * 4 / 10; 1997 1974 } ··· 2026 2011 svsp->efuse_max /= sizeof(u32); 2027 2012 nvmem_cell_put(cell); 2028 2013 2029 - return svsp->efuse_parsing(svsp); 2014 + return true; 2030 2015 } 2031 2016 2032 2017 static struct device *svs_get_subsys_device(struct svs_platform *svsp, ··· 2341 2326 /* Sentinel */ 2342 2327 }, 2343 2328 }; 2344 - 2345 - static struct svs_platform *svs_platform_probe(struct platform_device *pdev) 2346 - { 2347 - struct svs_platform *svsp; 2348 - const struct svs_platform_data *svsp_data; 2349 - int ret; 2350 - 2351 - svsp_data = of_device_get_match_data(&pdev->dev); 2352 - if (!svsp_data) { 2353 - dev_err(&pdev->dev, "no svs platform data?\n"); 2354 - return ERR_PTR(-EPERM); 2355 - } 2356 - 2357 - svsp = devm_kzalloc(&pdev->dev, sizeof(*svsp), GFP_KERNEL); 2358 - if (!svsp) 2359 - return ERR_PTR(-ENOMEM); 2360 - 2361 - svsp->dev = &pdev->dev; 2362 - svsp->name = svsp_data->name; 2363 - svsp->banks = svsp_data->banks; 2364 - svsp->efuse_parsing = svsp_data->efuse_parsing; 2365 - svsp->probe = svsp_data->probe; 2366 - svsp->regs = svsp_data->regs; 2367 - svsp->bank_max = svsp_data->bank_max; 2368 - 2369 - ret = svsp->probe(svsp); 2370 - if (ret) 2371 - return ERR_PTR(ret); 2372 - 2373 - return svsp; 2374 - } 2329 + MODULE_DEVICE_TABLE(of, svs_of_match); 2375 2330 2376 2331 static int svs_probe(struct platform_device *pdev) 2377 2332 { 2378 2333 struct svs_platform *svsp; 2379 - int svsp_irq, ret; 2334 + const struct svs_platform_data *svsp_data; 2335 + int ret, svsp_irq; 2380 2336 2381 - svsp = svs_platform_probe(pdev); 2382 - if (IS_ERR(svsp)) 2383 - return PTR_ERR(svsp); 2337 + svsp_data = of_device_get_match_data(&pdev->dev); 2338 + 2339 + svsp = devm_kzalloc(&pdev->dev, sizeof(*svsp), GFP_KERNEL); 2340 + if (!svsp) 2341 + return -ENOMEM; 2342 + 2343 + svsp->dev = &pdev->dev; 2344 + svsp->banks = svsp_data->banks; 2345 + svsp->regs = svsp_data->regs; 2346 + svsp->bank_max = svsp_data->bank_max; 2347 + 2348 + ret = svsp_data->probe(svsp); 2349 + if (ret) 2350 + return ret; 2384 2351 2385 2352 if (!svs_is_efuse_data_correct(svsp)) { 2386 2353 dev_notice(svsp->dev, "efuse data isn't correct\n"); 2354 + ret = -EPERM; 2355 + goto svs_probe_free_efuse; 2356 + } 2357 + 2358 + if (!svsp_data->efuse_parsing(svsp)) { 2359 + dev_err(svsp->dev, "efuse data parsing failed\n"); 2387 2360 ret = -EPERM; 2388 2361 goto svs_probe_free_resource; 2389 2362 } ··· 2385 2382 svsp_irq = platform_get_irq(pdev, 0); 2386 2383 if (svsp_irq < 0) { 2387 2384 ret = svsp_irq; 2388 - goto svs_probe_free_resource; 2389 - } 2390 - 2391 - ret = devm_request_threaded_irq(svsp->dev, svsp_irq, NULL, svs_isr, 2392 - IRQF_ONESHOT, svsp->name, svsp); 2393 - if (ret) { 2394 - dev_err(svsp->dev, "register irq(%d) failed: %d\n", 2395 - svsp_irq, ret); 2396 2385 goto svs_probe_free_resource; 2397 2386 } 2398 2387 ··· 2409 2414 goto svs_probe_clk_disable; 2410 2415 } 2411 2416 2417 + ret = devm_request_threaded_irq(svsp->dev, svsp_irq, NULL, svs_isr, 2418 + IRQF_ONESHOT, svsp_data->name, svsp); 2419 + if (ret) { 2420 + dev_err(svsp->dev, "register irq(%d) failed: %d\n", 2421 + svsp_irq, ret); 2422 + goto svs_probe_iounmap; 2423 + } 2424 + 2412 2425 ret = svs_start(svsp); 2413 2426 if (ret) { 2414 2427 dev_err(svsp->dev, "svs start fail: %d\n", ret); 2415 2428 goto svs_probe_iounmap; 2416 2429 } 2417 2430 2431 + #ifdef CONFIG_DEBUG_FS 2418 2432 ret = svs_create_debug_cmds(svsp); 2419 2433 if (ret) { 2420 2434 dev_err(svsp->dev, "svs create debug cmds fail: %d\n", ret); 2421 2435 goto svs_probe_iounmap; 2422 2436 } 2437 + #endif 2423 2438 2424 2439 return 0; 2425 2440 ··· 2440 2435 clk_disable_unprepare(svsp->main_clk); 2441 2436 2442 2437 svs_probe_free_resource: 2443 - if (!IS_ERR_OR_NULL(svsp->efuse)) 2444 - kfree(svsp->efuse); 2445 2438 if (!IS_ERR_OR_NULL(svsp->tefuse)) 2446 2439 kfree(svsp->tefuse); 2440 + 2441 + svs_probe_free_efuse: 2442 + if (!IS_ERR_OR_NULL(svsp->efuse)) 2443 + kfree(svsp->efuse); 2447 2444 2448 2445 return ret; 2449 2446 }
+44
include/dt-bindings/power/mediatek,mt8188-power.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ 2 + /* 3 + * Copyright (c) 2022 MediaTek Inc. 4 + * Author: Garmin Chang <garmin.chang@mediatek.com> 5 + */ 6 + 7 + #ifndef _DT_BINDINGS_POWER_MT8188_POWER_H 8 + #define _DT_BINDINGS_POWER_MT8188_POWER_H 9 + 10 + #define MT8188_POWER_DOMAIN_MFG0 0 11 + #define MT8188_POWER_DOMAIN_MFG1 1 12 + #define MT8188_POWER_DOMAIN_MFG2 2 13 + #define MT8188_POWER_DOMAIN_MFG3 3 14 + #define MT8188_POWER_DOMAIN_MFG4 4 15 + #define MT8188_POWER_DOMAIN_PEXTP_MAC_P0 5 16 + #define MT8188_POWER_DOMAIN_PEXTP_PHY_TOP 6 17 + #define MT8188_POWER_DOMAIN_CSIRX_TOP 7 18 + #define MT8188_POWER_DOMAIN_ETHER 8 19 + #define MT8188_POWER_DOMAIN_HDMI_TX 9 20 + #define MT8188_POWER_DOMAIN_ADSP_AO 10 21 + #define MT8188_POWER_DOMAIN_ADSP_INFRA 11 22 + #define MT8188_POWER_DOMAIN_ADSP 12 23 + #define MT8188_POWER_DOMAIN_AUDIO 13 24 + #define MT8188_POWER_DOMAIN_AUDIO_ASRC 14 25 + #define MT8188_POWER_DOMAIN_VPPSYS0 15 26 + #define MT8188_POWER_DOMAIN_VDOSYS0 16 27 + #define MT8188_POWER_DOMAIN_VDOSYS1 17 28 + #define MT8188_POWER_DOMAIN_DP_TX 18 29 + #define MT8188_POWER_DOMAIN_EDP_TX 19 30 + #define MT8188_POWER_DOMAIN_VPPSYS1 20 31 + #define MT8188_POWER_DOMAIN_WPE 21 32 + #define MT8188_POWER_DOMAIN_VDEC0 22 33 + #define MT8188_POWER_DOMAIN_VDEC1 23 34 + #define MT8188_POWER_DOMAIN_VENC 24 35 + #define MT8188_POWER_DOMAIN_IMG_VCORE 25 36 + #define MT8188_POWER_DOMAIN_IMG_MAIN 26 37 + #define MT8188_POWER_DOMAIN_DIP 27 38 + #define MT8188_POWER_DOMAIN_IPE 28 39 + #define MT8188_POWER_DOMAIN_CAM_VCORE 29 40 + #define MT8188_POWER_DOMAIN_CAM_MAIN 30 41 + #define MT8188_POWER_DOMAIN_CAM_SUBA 31 42 + #define MT8188_POWER_DOMAIN_CAM_SUBB 32 43 + 44 + #endif /* _DT_BINDINGS_POWER_MT8188_POWER_H */
+45
include/dt-bindings/reset/mt8195-resets.h
··· 35 35 #define MT8195_INFRA_RST2_PCIE_P1_SWRST 4 36 36 #define MT8195_INFRA_RST2_USBSIF_P1_SWRST 5 37 37 38 + /* VDOSYS1 */ 39 + #define MT8195_VDOSYS1_SW0_RST_B_SMI_LARB2 0 40 + #define MT8195_VDOSYS1_SW0_RST_B_SMI_LARB3 1 41 + #define MT8195_VDOSYS1_SW0_RST_B_GALS 2 42 + #define MT8195_VDOSYS1_SW0_RST_B_FAKE_ENG0 3 43 + #define MT8195_VDOSYS1_SW0_RST_B_FAKE_ENG1 4 44 + #define MT8195_VDOSYS1_SW0_RST_B_MDP_RDMA0 5 45 + #define MT8195_VDOSYS1_SW0_RST_B_MDP_RDMA1 6 46 + #define MT8195_VDOSYS1_SW0_RST_B_MDP_RDMA2 7 47 + #define MT8195_VDOSYS1_SW0_RST_B_MDP_RDMA3 8 48 + #define MT8195_VDOSYS1_SW0_RST_B_VPP_MERGE0 9 49 + #define MT8195_VDOSYS1_SW0_RST_B_VPP_MERGE1 10 50 + #define MT8195_VDOSYS1_SW0_RST_B_VPP_MERGE2 11 51 + #define MT8195_VDOSYS1_SW0_RST_B_VPP_MERGE3 12 52 + #define MT8195_VDOSYS1_SW0_RST_B_VPP_MERGE4 13 53 + #define MT8195_VDOSYS1_SW0_RST_B_VPP2_TO_VDO1_DL_ASYNC 14 54 + #define MT8195_VDOSYS1_SW0_RST_B_VPP3_TO_VDO1_DL_ASYNC 15 55 + #define MT8195_VDOSYS1_SW0_RST_B_DISP_MUTEX 16 56 + #define MT8195_VDOSYS1_SW0_RST_B_MDP_RDMA4 17 57 + #define MT8195_VDOSYS1_SW0_RST_B_MDP_RDMA5 18 58 + #define MT8195_VDOSYS1_SW0_RST_B_MDP_RDMA6 19 59 + #define MT8195_VDOSYS1_SW0_RST_B_MDP_RDMA7 20 60 + #define MT8195_VDOSYS1_SW0_RST_B_DP_INTF0 21 61 + #define MT8195_VDOSYS1_SW0_RST_B_DPI0 22 62 + #define MT8195_VDOSYS1_SW0_RST_B_DPI1 23 63 + #define MT8195_VDOSYS1_SW0_RST_B_DISP_MONITOR 24 64 + #define MT8195_VDOSYS1_SW0_RST_B_MERGE0_DL_ASYNC 25 65 + #define MT8195_VDOSYS1_SW0_RST_B_MERGE1_DL_ASYNC 26 66 + #define MT8195_VDOSYS1_SW0_RST_B_MERGE2_DL_ASYNC 27 67 + #define MT8195_VDOSYS1_SW0_RST_B_MERGE3_DL_ASYNC 28 68 + #define MT8195_VDOSYS1_SW0_RST_B_MERGE4_DL_ASYNC 29 69 + #define MT8195_VDOSYS1_SW0_RST_B_VDO0_DSC_TO_VDO1_DL_ASYNC 30 70 + #define MT8195_VDOSYS1_SW0_RST_B_VDO0_MERGE_TO_VDO1_DL_ASYNC 31 71 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_FE0 32 72 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_GFX_FE0 33 73 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_BE 34 74 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_FE1 48 75 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_GFX_FE1 49 76 + #define MT8195_VDOSYS1_SW1_RST_B_DISP_MIXER 50 77 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_FE0_DL_ASYNC 51 78 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_FE1_DL_ASYNC 52 79 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_GFX_FE0_DL_ASYNC 53 80 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_GFX_FE1_DL_ASYNC 54 81 + #define MT8195_VDOSYS1_SW1_RST_B_HDR_VDO_BE_DL_ASYNC 55 82 + 38 83 #endif /* _DT_BINDINGS_RESET_CONTROLLER_MT8195 */
+121
include/linux/soc/mediatek/infracfg.h
··· 140 140 #define MT8192_TOP_AXI_PROT_EN_MM_2_MDP_2ND BIT(13) 141 141 #define MT8192_TOP_AXI_PROT_EN_VDNR_CAM BIT(21) 142 142 143 + #define MT8188_TOP_AXI_PROT_EN_SET 0x2A0 144 + #define MT8188_TOP_AXI_PROT_EN_CLR 0x2A4 145 + #define MT8188_TOP_AXI_PROT_EN_STA 0x228 146 + #define MT8188_TOP_AXI_PROT_EN_1_SET 0x2A8 147 + #define MT8188_TOP_AXI_PROT_EN_1_CLR 0x2AC 148 + #define MT8188_TOP_AXI_PROT_EN_1_STA 0x258 149 + #define MT8188_TOP_AXI_PROT_EN_2_SET 0x714 150 + #define MT8188_TOP_AXI_PROT_EN_2_CLR 0x718 151 + #define MT8188_TOP_AXI_PROT_EN_2_STA 0x724 152 + 153 + #define MT8188_TOP_AXI_PROT_EN_MM_SET 0x2D4 154 + #define MT8188_TOP_AXI_PROT_EN_MM_CLR 0x2D8 155 + #define MT8188_TOP_AXI_PROT_EN_MM_STA 0x2EC 156 + #define MT8188_TOP_AXI_PROT_EN_MM_2_SET 0xDCC 157 + #define MT8188_TOP_AXI_PROT_EN_MM_2_CLR 0xDD0 158 + #define MT8188_TOP_AXI_PROT_EN_MM_2_STA 0xDD8 159 + 160 + #define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_SET 0xB84 161 + #define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_CLR 0xB88 162 + #define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_STA 0xB90 163 + #define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET 0xBCC 164 + #define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR 0xBD0 165 + #define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA 0xBD8 166 + 167 + #define MT8188_TOP_AXI_PROT_EN_MFG1_STEP1 BIT(11) 168 + #define MT8188_TOP_AXI_PROT_EN_2_MFG1_STEP2 BIT(7) 169 + #define MT8188_TOP_AXI_PROT_EN_1_MFG1_STEP3 BIT(19) 170 + #define MT8188_TOP_AXI_PROT_EN_2_MFG1_STEP4 BIT(5) 171 + #define MT8188_TOP_AXI_PROT_EN_MFG1_STEP5 GENMASK(22, 21) 172 + #define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_MFG1_STEP6 BIT(17) 173 + 174 + #define MT8188_TOP_AXI_PROT_EN_PEXTP_MAC_P0_STEP1 BIT(2) 175 + #define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_PEXTP_MAC_P0_STEP2 (BIT(8) | BIT(18) | BIT(30)) 176 + #define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_ETHER_STEP1 BIT(24) 177 + #define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_HDMI_TX_STEP1 BIT(20) 178 + #define MT8188_TOP_AXI_PROT_EN_2_ADSP_AO_STEP1 GENMASK(31, 29) 179 + #define MT8188_TOP_AXI_PROT_EN_2_ADSP_AO_STEP2 (GENMASK(4, 3) | BIT(28)) 180 + #define MT8188_TOP_AXI_PROT_EN_2_ADSP_INFRA_STEP1 (GENMASK(16, 14) | BIT(23) | \ 181 + BIT(27)) 182 + #define MT8188_TOP_AXI_PROT_EN_2_ADSP_INFRA_STEP2 (GENMASK(19, 17) | GENMASK(26, 25)) 183 + #define MT8188_TOP_AXI_PROT_EN_2_ADSP_STEP1 GENMASK(11, 8) 184 + #define MT8188_TOP_AXI_PROT_EN_2_ADSP_STEP2 GENMASK(22, 21) 185 + #define MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP1 BIT(20) 186 + #define MT8188_TOP_AXI_PROT_EN_2_AUDIO_STEP2 BIT(12) 187 + #define MT8188_TOP_AXI_PROT_EN_2_AUDIO_ASRC_STEP1 BIT(24) 188 + #define MT8188_TOP_AXI_PROT_EN_2_AUDIO_ASRC_STEP2 BIT(13) 189 + 190 + #define MT8188_TOP_AXI_PROT_EN_VPPSYS0_STEP1 BIT(10) 191 + #define MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS0_STEP2 GENMASK(9, 8) 192 + #define MT8188_TOP_AXI_PROT_EN_VPPSYS0_STEP3 BIT(23) 193 + #define MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS0_STEP4 (BIT(1) | BIT(4) | BIT(11)) 194 + #define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_VPPSYS0_STEP5 (BIT(20)) 195 + #define MT8188_TOP_AXI_PROT_EN_MM_VDOSYS0_STEP1 (GENMASK(18, 17) | GENMASK(21, 20)) 196 + #define MT8188_TOP_AXI_PROT_EN_VDOSYS0_STEP2 BIT(6) 197 + #define MT8188_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_VDOSYS0_STEP3 BIT(21) 198 + #define MT8188_TOP_AXI_PROT_EN_MM_VDOSYS1_STEP1 GENMASK(31, 30) 199 + #define MT8188_TOP_AXI_PROT_EN_MM_VDOSYS1_STEP2 BIT(22) 200 + #define MT8188_TOP_AXI_PROT_EN_MM_2_VDOSYS1_STEP3 BIT(10) 201 + #define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_DP_TX_STEP1 BIT(23) 202 + #define MT8188_TOP_AXI_PROT_EN_INFRA_VDNR_EDP_TX_STEP1 BIT(22) 203 + 204 + #define MT8188_TOP_AXI_PROT_EN_MM_VPPSYS1_STEP1 GENMASK(6, 5) 205 + #define MT8188_TOP_AXI_PROT_EN_MM_VPPSYS1_STEP2 BIT(23) 206 + #define MT8188_TOP_AXI_PROT_EN_MM_2_VPPSYS1_STEP3 BIT(18) 207 + #define MT8188_TOP_AXI_PROT_EN_MM_2_WPE_STEP1 BIT(23) 208 + #define MT8188_TOP_AXI_PROT_EN_MM_2_WPE_STEP2 BIT(21) 209 + #define MT8188_TOP_AXI_PROT_EN_MM_VDEC0_STEP1 BIT(13) 210 + #define MT8188_TOP_AXI_PROT_EN_MM_2_VDEC0_STEP2 BIT(13) 211 + #define MT8188_TOP_AXI_PROT_EN_MM_VDEC1_STEP1 BIT(14) 212 + #define MT8188_TOP_AXI_PROT_EN_MM_VDEC1_STEP2 BIT(29) 213 + #define MT8188_TOP_AXI_PROT_EN_MM_VENC_STEP1 (BIT(9) | BIT(11)) 214 + #define MT8188_TOP_AXI_PROT_EN_MM_VENC_STEP2 BIT(26) 215 + #define MT8188_TOP_AXI_PROT_EN_MM_2_VENC_STEP3 BIT(2) 216 + #define MT8188_TOP_AXI_PROT_EN_MM_IMG_VCORE_STEP1 (BIT(1) | BIT(3)) 217 + #define MT8188_TOP_AXI_PROT_EN_MM_IMG_VCORE_STEP2 BIT(25) 218 + #define MT8188_TOP_AXI_PROT_EN_MM_2_IMG_VCORE_STEP3 BIT(16) 219 + #define MT8188_TOP_AXI_PROT_EN_MM_2_IMG_MAIN_STEP1 GENMASK(27, 26) 220 + #define MT8188_TOP_AXI_PROT_EN_MM_2_IMG_MAIN_STEP2 GENMASK(25, 24) 221 + #define MT8188_TOP_AXI_PROT_EN_MM_CAM_VCORE_STEP1 (BIT(2) | BIT(4)) 222 + #define MT8188_TOP_AXI_PROT_EN_2_CAM_VCORE_STEP2 BIT(0) 223 + #define MT8188_TOP_AXI_PROT_EN_1_CAM_VCORE_STEP3 BIT(22) 224 + #define MT8188_TOP_AXI_PROT_EN_MM_CAM_VCORE_STEP4 BIT(24) 225 + #define MT8188_TOP_AXI_PROT_EN_MM_2_CAM_VCORE_STEP5 BIT(17) 226 + #define MT8188_TOP_AXI_PROT_EN_MM_2_CAM_MAIN_STEP1 GENMASK(31, 30) 227 + #define MT8188_TOP_AXI_PROT_EN_2_CAM_MAIN_STEP2 BIT(2) 228 + #define MT8188_TOP_AXI_PROT_EN_MM_2_CAM_MAIN_STEP3 GENMASK(29, 28) 229 + #define MT8188_TOP_AXI_PROT_EN_2_CAM_MAIN_STEP4 BIT(1) 230 + 231 + #define MT8188_SMI_COMMON_CLAMP_EN_STA 0x3C0 232 + #define MT8188_SMI_COMMON_CLAMP_EN_SET 0x3C4 233 + #define MT8188_SMI_COMMON_CLAMP_EN_CLR 0x3C8 234 + 235 + #define MT8188_SMI_COMMON_SMI_CLAMP_DIP_TO_VDO0 GENMASK(3, 1) 236 + #define MT8188_SMI_COMMON_SMI_CLAMP_DIP_TO_VPP1 GENMASK(2, 1) 237 + #define MT8188_SMI_COMMON_SMI_CLAMP_IPE_TO_VPP1 BIT(0) 238 + 239 + #define MT8188_SMI_COMMON_SMI_CLAMP_CAM_SUBA_TO_VPP0 GENMASK(3, 2) 240 + #define MT8188_SMI_COMMON_SMI_CLAMP_CAM_SUBB_TO_VDO0 GENMASK(3, 2) 241 + 242 + #define MT8188_SMI_LARB10_RESET_ADDR 0xC 243 + #define MT8188_SMI_LARB11A_RESET_ADDR 0xC 244 + #define MT8188_SMI_LARB11C_RESET_ADDR 0xC 245 + #define MT8188_SMI_LARB12_RESET_ADDR 0xC 246 + #define MT8188_SMI_LARB11B_RESET_ADDR 0xC 247 + #define MT8188_SMI_LARB15_RESET_ADDR 0xC 248 + #define MT8188_SMI_LARB16B_RESET_ADDR 0xA0 249 + #define MT8188_SMI_LARB17B_RESET_ADDR 0xA0 250 + #define MT8188_SMI_LARB16A_RESET_ADDR 0xA0 251 + #define MT8188_SMI_LARB17A_RESET_ADDR 0xA0 252 + 253 + #define MT8188_SMI_LARB10_RESET BIT(0) 254 + #define MT8188_SMI_LARB11A_RESET BIT(0) 255 + #define MT8188_SMI_LARB11C_RESET BIT(0) 256 + #define MT8188_SMI_LARB12_RESET BIT(8) 257 + #define MT8188_SMI_LARB11B_RESET BIT(0) 258 + #define MT8188_SMI_LARB15_RESET BIT(0) 259 + #define MT8188_SMI_LARB16B_RESET BIT(4) 260 + #define MT8188_SMI_LARB17B_RESET BIT(4) 261 + #define MT8188_SMI_LARB16A_RESET BIT(4) 262 + #define MT8188_SMI_LARB17A_RESET BIT(4) 263 + 143 264 #define MT8186_TOP_AXI_PROT_EN_SET (0x2A0) 144 265 #define MT8186_TOP_AXI_PROT_EN_CLR (0x2A4) 145 266 #define MT8186_TOP_AXI_PROT_EN_STA (0x228)
+25
include/linux/soc/mediatek/mtk-mmsys.h
··· 6 6 #ifndef __MTK_MMSYS_H 7 7 #define __MTK_MMSYS_H 8 8 9 + #include <linux/mailbox_controller.h> 10 + #include <linux/mailbox/mtk-cmdq-mailbox.h> 11 + #include <linux/soc/mediatek/mtk-cmdq.h> 12 + 9 13 enum mtk_ddp_comp_id; 10 14 struct device; 11 15 ··· 40 36 DDP_COMPONENT_DSI1, 41 37 DDP_COMPONENT_DSI2, 42 38 DDP_COMPONENT_DSI3, 39 + DDP_COMPONENT_ETHDR_MIXER, 43 40 DDP_COMPONENT_GAMMA, 41 + DDP_COMPONENT_MDP_RDMA0, 42 + DDP_COMPONENT_MDP_RDMA1, 43 + DDP_COMPONENT_MDP_RDMA2, 44 + DDP_COMPONENT_MDP_RDMA3, 45 + DDP_COMPONENT_MDP_RDMA4, 46 + DDP_COMPONENT_MDP_RDMA5, 47 + DDP_COMPONENT_MDP_RDMA6, 48 + DDP_COMPONENT_MDP_RDMA7, 44 49 DDP_COMPONENT_MERGE0, 45 50 DDP_COMPONENT_MERGE1, 46 51 DDP_COMPONENT_MERGE2, ··· 86 73 enum mtk_ddp_comp_id next); 87 74 88 75 void mtk_mmsys_ddp_dpi_fmt_config(struct device *dev, u32 val); 76 + 77 + void mtk_mmsys_merge_async_config(struct device *dev, int idx, int width, 78 + int height, struct cmdq_pkt *cmdq_pkt); 79 + 80 + void mtk_mmsys_hdr_config(struct device *dev, int be_width, int be_height, 81 + struct cmdq_pkt *cmdq_pkt); 82 + 83 + void mtk_mmsys_mixer_in_config(struct device *dev, int idx, bool alpha_sel, u16 alpha, 84 + u8 mode, u32 biwidth, struct cmdq_pkt *cmdq_pkt); 85 + 86 + void mtk_mmsys_mixer_in_channel_swap(struct device *dev, int idx, bool channel_swap, 87 + struct cmdq_pkt *cmdq_pkt); 89 88 90 89 #endif /* __MTK_MMSYS_H */