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

Merge tag 'pmdomain-v6.16' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm

Pull pmdomain updates from Ulf Hansson:
"pmdomain core:
- Add residency reflection for domain-idlestates to debugfs
- Add genpd helper to correct the usage/rejected counters

pmdomain providers:
- mediatek: Add support for Dimensity 1200 MT6893
- qcom: Add support for SM4450 power domains
- rockchip: Add support for RK3562 SoC
- sunxi: Add support for Allwinner H6/H616 PRCM PPU
- ti: Fix STANDBY handling of OMAP2+ PER power domain

cpuidle-psci:
- Correct the domain-idlestate statistics in debugfs"

* tag 'pmdomain-v6.16' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm: (23 commits)
pmdomain: ti: Fix STANDBY handling of PER power domain
pmdomain: amlogic: Constify some structures
pmdomain: core: Use genpd->opp_table to simplify error/remove path
pmdomain: core: Simplify return statement in genpd_power_off()
pmdomain: core: Convert genpd_power_off() to void
pmdomain: core: Convert to device_awake_path()
pmdomain: mediatek: Add error messages for missing regmaps
pmdomain: arm: Do not enable by default during compile testing
pmdomain: qcom: rpmhpd: Add SM4450 power domains
dt-bindings: power: qcom,rpmpd: Add SM4450 compatible
pmdomain: sunxi: add H6 PRCM PPU driver
dt-bindings: power: Add Allwinner H6/H616 PRCM PPU
pmdomain: bcm: bcm2835-power: Use devm_clk_get_optional
pmdomain: rockchip: Add support for RK3562 SoC
dt-bindings: power: rockchip: Add support for RK3562 SoC
pmdomain: mediatek: Add support for Dimensity 1200 MT6893
pmdomain: mediatek: Bump maximum bus protect data array elements
dt-bindings: power: mediatek: Support Dimensity 1200 MT6893 MTCMOS
pmdomain: core: Reset genpd->states to avoid freeing invalid data
pmdomain: core: Add residency reflection for domain-idlestates to debugfs
...

+1185 -115
+42
Documentation/devicetree/bindings/power/allwinner,sun50i-h6-prcm-ppu.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/power/allwinner,sun50i-h6-prcm-ppu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Allwinner SoCs PRCM power domain controller 8 + 9 + maintainers: 10 + - Andre Przywara <andre.przywara@arm.com> 11 + 12 + description: 13 + The Allwinner Power Reset Clock Management (PRCM) unit contains bits to 14 + control a few power domains. 15 + 16 + properties: 17 + compatible: 18 + enum: 19 + - allwinner,sun50i-h6-prcm-ppu 20 + - allwinner,sun50i-h616-prcm-ppu 21 + - allwinner,sun55i-a523-prcm-ppu 22 + 23 + reg: 24 + maxItems: 1 25 + 26 + '#power-domain-cells': 27 + const: 1 28 + 29 + required: 30 + - compatible 31 + - reg 32 + - '#power-domain-cells' 33 + 34 + additionalProperties: false 35 + 36 + examples: 37 + - | 38 + prcm_ppu: power-controller@7010210 { 39 + compatible = "allwinner,sun50i-h616-prcm-ppu"; 40 + reg = <0x7010210 0x10>; 41 + #power-domain-cells = <1>; 42 + };
+2
Documentation/devicetree/bindings/power/mediatek,power-controller.yaml
··· 25 25 enum: 26 26 - mediatek,mt6735-power-controller 27 27 - mediatek,mt6795-power-controller 28 + - mediatek,mt6893-power-controller 28 29 - mediatek,mt8167-power-controller 29 30 - mediatek,mt8173-power-controller 30 31 - mediatek,mt8183-power-controller ··· 89 88 description: | 90 89 Power domain index. Valid values are defined in: 91 90 "include/dt-bindings/power/mt6795-power.h" - for MT8167 type power domain. 91 + "include/dt-bindings/power/mediatek,mt6893-power.h" - for MT6893 type power domain. 92 92 "include/dt-bindings/power/mt8167-power.h" - for MT8167 type power domain. 93 93 "include/dt-bindings/power/mt8173-power.h" - for MT8173 type power domain. 94 94 "include/dt-bindings/power/mt8183-power.h" - for MT8183 type power domain.
+1
Documentation/devicetree/bindings/power/qcom,rpmpd.yaml
··· 50 50 - qcom,sdx55-rpmhpd 51 51 - qcom,sdx65-rpmhpd 52 52 - qcom,sdx75-rpmhpd 53 + - qcom,sm4450-rpmhpd 53 54 - qcom,sm6115-rpmpd 54 55 - qcom,sm6125-rpmpd 55 56 - qcom,sm6350-rpmhpd
+1
Documentation/devicetree/bindings/power/rockchip,power-controller.yaml
··· 40 40 - rockchip,rk3366-power-controller 41 41 - rockchip,rk3368-power-controller 42 42 - rockchip,rk3399-power-controller 43 + - rockchip,rk3562-power-controller 43 44 - rockchip,rk3568-power-controller 44 45 - rockchip,rk3576-power-controller 45 46 - rockchip,rk3588-power-controller
+1 -1
drivers/cpuidle/cpuidle-psci-domain.c
··· 43 43 44 44 /* OSI mode is enabled, set the corresponding domain state. */ 45 45 pd_state = state->data; 46 - psci_set_domain_state(*pd_state); 46 + psci_set_domain_state(pd, pd->state_idx, *pd_state); 47 47 48 48 return 0; 49 49 }
+28 -12
drivers/cpuidle/cpuidle-psci.c
··· 36 36 struct device *dev; 37 37 }; 38 38 39 + struct psci_cpuidle_domain_state { 40 + struct generic_pm_domain *pd; 41 + unsigned int state_idx; 42 + u32 state; 43 + }; 44 + 39 45 static DEFINE_PER_CPU_READ_MOSTLY(struct psci_cpuidle_data, psci_cpuidle_data); 40 - static DEFINE_PER_CPU(u32, domain_state); 46 + static DEFINE_PER_CPU(struct psci_cpuidle_domain_state, psci_domain_state); 41 47 static bool psci_cpuidle_use_syscore; 42 48 static bool psci_cpuidle_use_cpuhp; 43 49 44 - void psci_set_domain_state(u32 state) 50 + void psci_set_domain_state(struct generic_pm_domain *pd, unsigned int state_idx, 51 + u32 state) 45 52 { 46 - __this_cpu_write(domain_state, state); 53 + struct psci_cpuidle_domain_state *ds = this_cpu_ptr(&psci_domain_state); 54 + 55 + ds->pd = pd; 56 + ds->state_idx = state_idx; 57 + ds->state = state; 47 58 } 48 59 49 - static inline u32 psci_get_domain_state(void) 60 + static inline void psci_clear_domain_state(void) 50 61 { 51 - return __this_cpu_read(domain_state); 62 + __this_cpu_write(psci_domain_state.state, 0); 52 63 } 53 64 54 65 static __cpuidle int __psci_enter_domain_idle_state(struct cpuidle_device *dev, ··· 69 58 struct psci_cpuidle_data *data = this_cpu_ptr(&psci_cpuidle_data); 70 59 u32 *states = data->psci_states; 71 60 struct device *pd_dev = data->dev; 72 - u32 state; 61 + struct psci_cpuidle_domain_state *ds; 62 + u32 state = states[idx]; 73 63 int ret; 74 64 75 65 ret = cpu_pm_enter(); ··· 83 71 else 84 72 pm_runtime_put_sync_suspend(pd_dev); 85 73 86 - state = psci_get_domain_state(); 87 - if (!state) 88 - state = states[idx]; 74 + ds = this_cpu_ptr(&psci_domain_state); 75 + if (ds->state) 76 + state = ds->state; 89 77 90 78 trace_psci_domain_idle_enter(dev->cpu, state, s2idle); 91 79 ret = psci_cpu_suspend_enter(state) ? -1 : idx; ··· 98 86 99 87 cpu_pm_exit(); 100 88 89 + /* Correct domain-idlestate statistics if we failed to enter. */ 90 + if (ret == -1 && ds->state) 91 + pm_genpd_inc_rejected(ds->pd, ds->state_idx); 92 + 101 93 /* Clear the domain state to start fresh when back from idle. */ 102 - psci_set_domain_state(0); 94 + psci_clear_domain_state(); 103 95 return ret; 104 96 } 105 97 ··· 137 121 if (pd_dev) { 138 122 pm_runtime_put_sync(pd_dev); 139 123 /* Clear domain state to start fresh at next online. */ 140 - psci_set_domain_state(0); 124 + psci_clear_domain_state(); 141 125 } 142 126 143 127 return 0; ··· 163 147 164 148 /* Clear domain state to re-start fresh. */ 165 149 if (!cleared) { 166 - psci_set_domain_state(0); 150 + psci_clear_domain_state(); 167 151 cleared = true; 168 152 } 169 153 }
+3 -1
drivers/cpuidle/cpuidle-psci.h
··· 4 4 #define __CPUIDLE_PSCI_H 5 5 6 6 struct device_node; 7 + struct generic_pm_domain; 7 8 8 - void psci_set_domain_state(u32 state); 9 + void psci_set_domain_state(struct generic_pm_domain *pd, unsigned int state_idx, 10 + u32 state); 9 11 int psci_dt_parse_state_node(struct device_node *np, u32 *state); 10 12 11 13 #endif /* __CPUIDLE_PSCI_H */
+39 -39
drivers/pmdomain/amlogic/meson-ee-pwrc.c
··· 69 69 char *name; 70 70 unsigned int reset_names_count; 71 71 unsigned int clk_names_count; 72 - struct meson_ee_pwrc_top_domain *top_pd; 72 + const struct meson_ee_pwrc_top_domain *top_pd; 73 73 unsigned int mem_pd_count; 74 - struct meson_ee_pwrc_mem_domain *mem_pd; 74 + const struct meson_ee_pwrc_mem_domain *mem_pd; 75 75 bool (*is_powered_off)(struct meson_ee_pwrc_domain *pwrc_domain); 76 76 }; 77 77 78 78 struct meson_ee_pwrc_domain_data { 79 79 unsigned int count; 80 - struct meson_ee_pwrc_domain_desc *domains; 80 + const struct meson_ee_pwrc_domain_desc *domains; 81 81 }; 82 82 83 83 /* TOP Power Domains */ 84 84 85 - static struct meson_ee_pwrc_top_domain gx_pwrc_vpu = { 85 + static const struct meson_ee_pwrc_top_domain gx_pwrc_vpu = { 86 86 .sleep_reg = GX_AO_RTI_GEN_PWR_SLEEP0, 87 87 .sleep_mask = BIT(8), 88 88 .iso_reg = GX_AO_RTI_GEN_PWR_SLEEP0, 89 89 .iso_mask = BIT(9), 90 90 }; 91 91 92 - static struct meson_ee_pwrc_top_domain meson8_pwrc_vpu = { 92 + static const struct meson_ee_pwrc_top_domain meson8_pwrc_vpu = { 93 93 .sleep_reg = MESON8_AO_RTI_GEN_PWR_SLEEP0, 94 94 .sleep_mask = BIT(8), 95 95 .iso_reg = MESON8_AO_RTI_GEN_PWR_SLEEP0, ··· 104 104 .iso_mask = BIT(__bit), \ 105 105 } 106 106 107 - static struct meson_ee_pwrc_top_domain sm1_pwrc_vpu = SM1_EE_PD(8); 108 - static struct meson_ee_pwrc_top_domain sm1_pwrc_nna = SM1_EE_PD(16); 109 - static struct meson_ee_pwrc_top_domain sm1_pwrc_usb = SM1_EE_PD(17); 110 - static struct meson_ee_pwrc_top_domain sm1_pwrc_pci = SM1_EE_PD(18); 111 - static struct meson_ee_pwrc_top_domain sm1_pwrc_ge2d = SM1_EE_PD(19); 107 + static const struct meson_ee_pwrc_top_domain sm1_pwrc_vpu = SM1_EE_PD(8); 108 + static const struct meson_ee_pwrc_top_domain sm1_pwrc_nna = SM1_EE_PD(16); 109 + static const struct meson_ee_pwrc_top_domain sm1_pwrc_usb = SM1_EE_PD(17); 110 + static const struct meson_ee_pwrc_top_domain sm1_pwrc_pci = SM1_EE_PD(18); 111 + static const struct meson_ee_pwrc_top_domain sm1_pwrc_ge2d = SM1_EE_PD(19); 112 112 113 - static struct meson_ee_pwrc_top_domain g12a_pwrc_nna = { 113 + static const struct meson_ee_pwrc_top_domain g12a_pwrc_nna = { 114 114 .sleep_reg = GX_AO_RTI_GEN_PWR_SLEEP0, 115 115 .sleep_mask = BIT(16) | BIT(17), 116 116 .iso_reg = GX_AO_RTI_GEN_PWR_ISO0, 117 117 .iso_mask = BIT(16) | BIT(17), 118 118 }; 119 119 120 - static struct meson_ee_pwrc_top_domain g12a_pwrc_isp = { 120 + static const struct meson_ee_pwrc_top_domain g12a_pwrc_isp = { 121 121 .sleep_reg = GX_AO_RTI_GEN_PWR_SLEEP0, 122 122 .sleep_mask = BIT(18) | BIT(19), 123 123 .iso_reg = GX_AO_RTI_GEN_PWR_ISO0, ··· 154 154 { __reg, BIT(14) }, \ 155 155 { __reg, BIT(15) } 156 156 157 - static struct meson_ee_pwrc_mem_domain axg_pwrc_mem_vpu[] = { 157 + static const struct meson_ee_pwrc_mem_domain axg_pwrc_mem_vpu[] = { 158 158 VPU_MEMPD(HHI_VPU_MEM_PD_REG0), 159 159 VPU_HHI_MEMPD(HHI_MEM_PD_REG0), 160 160 }; 161 161 162 - static struct meson_ee_pwrc_mem_domain g12a_pwrc_mem_vpu[] = { 162 + static const struct meson_ee_pwrc_mem_domain g12a_pwrc_mem_vpu[] = { 163 163 VPU_MEMPD(HHI_VPU_MEM_PD_REG0), 164 164 VPU_MEMPD(HHI_VPU_MEM_PD_REG1), 165 165 VPU_MEMPD(HHI_VPU_MEM_PD_REG2), 166 166 VPU_HHI_MEMPD(HHI_MEM_PD_REG0), 167 167 }; 168 168 169 - static struct meson_ee_pwrc_mem_domain gxbb_pwrc_mem_vpu[] = { 169 + static const struct meson_ee_pwrc_mem_domain gxbb_pwrc_mem_vpu[] = { 170 170 VPU_MEMPD(HHI_VPU_MEM_PD_REG0), 171 171 VPU_MEMPD(HHI_VPU_MEM_PD_REG1), 172 172 VPU_HHI_MEMPD(HHI_MEM_PD_REG0), 173 173 }; 174 174 175 - static struct meson_ee_pwrc_mem_domain meson_pwrc_mem_eth[] = { 175 + static const struct meson_ee_pwrc_mem_domain meson_pwrc_mem_eth[] = { 176 176 { HHI_MEM_PD_REG0, GENMASK(3, 2) }, 177 177 }; 178 178 179 - static struct meson_ee_pwrc_mem_domain meson8_pwrc_audio_dsp_mem[] = { 179 + static const struct meson_ee_pwrc_mem_domain meson8_pwrc_audio_dsp_mem[] = { 180 180 { HHI_MEM_PD_REG0, GENMASK(1, 0) }, 181 181 }; 182 182 183 - static struct meson_ee_pwrc_mem_domain meson8_pwrc_mem_vpu[] = { 183 + static const struct meson_ee_pwrc_mem_domain meson8_pwrc_mem_vpu[] = { 184 184 VPU_MEMPD(HHI_VPU_MEM_PD_REG0), 185 185 VPU_MEMPD(HHI_VPU_MEM_PD_REG1), 186 186 VPU_HHI_MEMPD(HHI_MEM_PD_REG0), 187 187 }; 188 188 189 - static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_vpu[] = { 189 + static const struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_vpu[] = { 190 190 VPU_MEMPD(HHI_VPU_MEM_PD_REG0), 191 191 VPU_MEMPD(HHI_VPU_MEM_PD_REG1), 192 192 VPU_MEMPD(HHI_VPU_MEM_PD_REG2), ··· 198 198 VPU_HHI_MEMPD(HHI_MEM_PD_REG0), 199 199 }; 200 200 201 - static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_nna[] = { 201 + static const struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_nna[] = { 202 202 { HHI_NANOQ_MEM_PD_REG0, 0xff }, 203 203 { HHI_NANOQ_MEM_PD_REG1, 0xff }, 204 204 }; 205 205 206 - static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_usb[] = { 206 + static const struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_usb[] = { 207 207 { HHI_MEM_PD_REG0, GENMASK(31, 30) }, 208 208 }; 209 209 210 - static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_pcie[] = { 210 + static const struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_pcie[] = { 211 211 { HHI_MEM_PD_REG0, GENMASK(29, 26) }, 212 212 }; 213 213 214 - static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_ge2d[] = { 214 + static const struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_ge2d[] = { 215 215 { HHI_MEM_PD_REG0, GENMASK(25, 18) }, 216 216 }; 217 217 218 - static struct meson_ee_pwrc_mem_domain axg_pwrc_mem_audio[] = { 218 + static const struct meson_ee_pwrc_mem_domain axg_pwrc_mem_audio[] = { 219 219 { HHI_MEM_PD_REG0, GENMASK(5, 4) }, 220 220 }; 221 221 222 - static struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_audio[] = { 222 + static const struct meson_ee_pwrc_mem_domain sm1_pwrc_mem_audio[] = { 223 223 { HHI_MEM_PD_REG0, GENMASK(5, 4) }, 224 224 { HHI_AUDIO_MEM_PD_REG0, GENMASK(1, 0) }, 225 225 { HHI_AUDIO_MEM_PD_REG0, GENMASK(3, 2) }, ··· 235 235 { HHI_AUDIO_MEM_PD_REG0, GENMASK(27, 26) }, 236 236 }; 237 237 238 - static struct meson_ee_pwrc_mem_domain g12a_pwrc_mem_nna[] = { 238 + static const struct meson_ee_pwrc_mem_domain g12a_pwrc_mem_nna[] = { 239 239 { G12A_HHI_NANOQ_MEM_PD_REG0, GENMASK(31, 0) }, 240 240 { G12A_HHI_NANOQ_MEM_PD_REG1, GENMASK(31, 0) }, 241 241 }; 242 242 243 - static struct meson_ee_pwrc_mem_domain g12a_pwrc_mem_isp[] = { 243 + static const struct meson_ee_pwrc_mem_domain g12a_pwrc_mem_isp[] = { 244 244 { G12A_HHI_ISP_MEM_PD_REG0, GENMASK(31, 0) }, 245 245 { G12A_HHI_ISP_MEM_PD_REG1, GENMASK(31, 0) }, 246 246 }; ··· 270 270 271 271 static bool pwrc_ee_is_powered_off(struct meson_ee_pwrc_domain *pwrc_domain); 272 272 273 - static struct meson_ee_pwrc_domain_desc axg_pwrc_domains[] = { 273 + static const struct meson_ee_pwrc_domain_desc axg_pwrc_domains[] = { 274 274 [PWRC_AXG_VPU_ID] = VPU_PD("VPU", &gx_pwrc_vpu, axg_pwrc_mem_vpu, 275 275 pwrc_ee_is_powered_off, 5, 2), 276 276 [PWRC_AXG_ETHERNET_MEM_ID] = MEM_PD("ETH", meson_pwrc_mem_eth), 277 277 [PWRC_AXG_AUDIO_ID] = MEM_PD("AUDIO", axg_pwrc_mem_audio), 278 278 }; 279 279 280 - static struct meson_ee_pwrc_domain_desc g12a_pwrc_domains[] = { 280 + static const struct meson_ee_pwrc_domain_desc g12a_pwrc_domains[] = { 281 281 [PWRC_G12A_VPU_ID] = VPU_PD("VPU", &gx_pwrc_vpu, g12a_pwrc_mem_vpu, 282 282 pwrc_ee_is_powered_off, 11, 2), 283 283 [PWRC_G12A_ETH_ID] = MEM_PD("ETH", meson_pwrc_mem_eth), ··· 287 287 pwrc_ee_is_powered_off), 288 288 }; 289 289 290 - static struct meson_ee_pwrc_domain_desc gxbb_pwrc_domains[] = { 290 + static const struct meson_ee_pwrc_domain_desc gxbb_pwrc_domains[] = { 291 291 [PWRC_GXBB_VPU_ID] = VPU_PD("VPU", &gx_pwrc_vpu, gxbb_pwrc_mem_vpu, 292 292 pwrc_ee_is_powered_off, 12, 2), 293 293 [PWRC_GXBB_ETHERNET_MEM_ID] = MEM_PD("ETH", meson_pwrc_mem_eth), 294 294 }; 295 295 296 - static struct meson_ee_pwrc_domain_desc meson8_pwrc_domains[] = { 296 + static const struct meson_ee_pwrc_domain_desc meson8_pwrc_domains[] = { 297 297 [PWRC_MESON8_VPU_ID] = VPU_PD("VPU", &meson8_pwrc_vpu, 298 298 meson8_pwrc_mem_vpu, 299 299 pwrc_ee_is_powered_off, 0, 1), ··· 303 303 meson8_pwrc_audio_dsp_mem), 304 304 }; 305 305 306 - static struct meson_ee_pwrc_domain_desc meson8b_pwrc_domains[] = { 306 + static const struct meson_ee_pwrc_domain_desc meson8b_pwrc_domains[] = { 307 307 [PWRC_MESON8_VPU_ID] = VPU_PD("VPU", &meson8_pwrc_vpu, 308 308 meson8_pwrc_mem_vpu, 309 309 pwrc_ee_is_powered_off, 11, 1), ··· 313 313 meson8_pwrc_audio_dsp_mem), 314 314 }; 315 315 316 - static struct meson_ee_pwrc_domain_desc sm1_pwrc_domains[] = { 316 + static const struct meson_ee_pwrc_domain_desc sm1_pwrc_domains[] = { 317 317 [PWRC_SM1_VPU_ID] = VPU_PD("VPU", &sm1_pwrc_vpu, sm1_pwrc_mem_vpu, 318 318 pwrc_ee_is_powered_off, 11, 2), 319 319 [PWRC_SM1_NNA_ID] = TOP_PD("NNA", &sm1_pwrc_nna, sm1_pwrc_mem_nna, ··· 576 576 } 577 577 } 578 578 579 - static struct meson_ee_pwrc_domain_data meson_ee_g12a_pwrc_data = { 579 + static const struct meson_ee_pwrc_domain_data meson_ee_g12a_pwrc_data = { 580 580 .count = ARRAY_SIZE(g12a_pwrc_domains), 581 581 .domains = g12a_pwrc_domains, 582 582 }; 583 583 584 - static struct meson_ee_pwrc_domain_data meson_ee_axg_pwrc_data = { 584 + static const struct meson_ee_pwrc_domain_data meson_ee_axg_pwrc_data = { 585 585 .count = ARRAY_SIZE(axg_pwrc_domains), 586 586 .domains = axg_pwrc_domains, 587 587 }; 588 588 589 - static struct meson_ee_pwrc_domain_data meson_ee_gxbb_pwrc_data = { 589 + static const struct meson_ee_pwrc_domain_data meson_ee_gxbb_pwrc_data = { 590 590 .count = ARRAY_SIZE(gxbb_pwrc_domains), 591 591 .domains = gxbb_pwrc_domains, 592 592 }; 593 593 594 - static struct meson_ee_pwrc_domain_data meson_ee_m8_pwrc_data = { 594 + static const struct meson_ee_pwrc_domain_data meson_ee_m8_pwrc_data = { 595 595 .count = ARRAY_SIZE(meson8_pwrc_domains), 596 596 .domains = meson8_pwrc_domains, 597 597 }; 598 598 599 - static struct meson_ee_pwrc_domain_data meson_ee_m8b_pwrc_data = { 599 + static const struct meson_ee_pwrc_domain_data meson_ee_m8b_pwrc_data = { 600 600 .count = ARRAY_SIZE(meson8b_pwrc_domains), 601 601 .domains = meson8b_pwrc_domains, 602 602 }; 603 603 604 - static struct meson_ee_pwrc_domain_data meson_ee_sm1_pwrc_data = { 604 + static const struct meson_ee_pwrc_domain_data meson_ee_sm1_pwrc_data = { 605 605 .count = ARRAY_SIZE(sm1_pwrc_domains), 606 606 .domains = sm1_pwrc_domains, 607 607 };
+3 -3
drivers/pmdomain/arm/Kconfig
··· 2 2 config ARM_SCMI_PERF_DOMAIN 3 3 tristate "SCMI performance domain driver" 4 4 depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF) 5 - default y 5 + default ARM_SCMI_PROTOCOL 6 6 select PM_GENERIC_DOMAINS if PM 7 7 help 8 8 This enables support for the SCMI performance domains which can be ··· 14 14 config ARM_SCMI_POWER_DOMAIN 15 15 tristate "SCMI power domain driver" 16 16 depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF) 17 - default y 17 + default ARM_SCMI_PROTOCOL 18 18 select PM_GENERIC_DOMAINS if PM 19 19 help 20 20 This enables support for the SCMI power domains which can be ··· 27 27 config ARM_SCPI_POWER_DOMAIN 28 28 tristate "SCPI power domain driver" 29 29 depends on ARM_SCPI_PROTOCOL || (COMPILE_TEST && OF) 30 - default y 30 + default ARM_SCPI_PROTOCOL 31 31 select PM_GENERIC_DOMAINS if PM 32 32 help 33 33 This enables support for the SCPI power domains which can be
+4 -12
drivers/pmdomain/bcm/bcm2835-power.c
··· 506 506 struct device *dev = power->dev; 507 507 struct bcm2835_power_domain *dom = &power->domains[pd_xlate_index]; 508 508 509 - dom->clk = devm_clk_get(dev->parent, name); 510 - if (IS_ERR(dom->clk)) { 511 - int ret = PTR_ERR(dom->clk); 512 - 513 - if (ret == -EPROBE_DEFER) 514 - return ret; 515 - 516 - /* Some domains don't have a clk, so make sure that we 517 - * don't deref an error pointer later. 518 - */ 519 - dom->clk = NULL; 520 - } 509 + dom->clk = devm_clk_get_optional(dev->parent, name); 510 + if (IS_ERR(dom->clk)) 511 + return dev_err_probe(dev, PTR_ERR(dom->clk), "Failed to get clock %s\n", 512 + name); 521 513 522 514 dom->base.name = name; 523 515 dom->base.flags = GENPD_FLAG_ACTIVE_WAKEUP;
+91 -40
drivers/pmdomain/core.c
··· 304 304 305 305 genpd->accounting_time = now; 306 306 } 307 + 308 + static void genpd_reflect_residency(struct generic_pm_domain *genpd) 309 + { 310 + struct genpd_governor_data *gd = genpd->gd; 311 + struct genpd_power_state *state, *next_state; 312 + unsigned int state_idx; 313 + s64 sleep_ns, target_ns; 314 + 315 + if (!gd || !gd->reflect_residency) 316 + return; 317 + 318 + sleep_ns = ktime_to_ns(ktime_sub(ktime_get(), gd->last_enter)); 319 + state_idx = genpd->state_idx; 320 + state = &genpd->states[state_idx]; 321 + target_ns = state->power_off_latency_ns + state->residency_ns; 322 + 323 + if (sleep_ns < target_ns) { 324 + state->above++; 325 + } else if (state_idx < (genpd->state_count -1)) { 326 + next_state = &genpd->states[state_idx + 1]; 327 + target_ns = next_state->power_off_latency_ns + 328 + next_state->residency_ns; 329 + 330 + if (sleep_ns >= target_ns) 331 + state->below++; 332 + } 333 + 334 + gd->reflect_residency = false; 335 + } 307 336 #else 308 337 static inline void genpd_debug_add(struct generic_pm_domain *genpd) {} 309 338 static inline void genpd_debug_remove(struct generic_pm_domain *genpd) {} 310 339 static inline void genpd_update_accounting(struct generic_pm_domain *genpd) {} 340 + static inline void genpd_reflect_residency(struct generic_pm_domain *genpd) {} 311 341 #endif 312 342 313 343 static int _genpd_reeval_performance_state(struct generic_pm_domain *genpd, ··· 758 728 } 759 729 EXPORT_SYMBOL_GPL(dev_pm_genpd_rpm_always_on); 760 730 731 + /** 732 + * pm_genpd_inc_rejected() - Adjust the rejected/usage counts for an idle-state. 733 + * 734 + * @genpd: The PM domain the idle-state belongs to. 735 + * @state_idx: The index of the idle-state that failed. 736 + * 737 + * In some special cases the ->power_off() callback is asynchronously powering 738 + * off the PM domain, leading to that it may return zero to indicate success, 739 + * even though the actual power-off could fail. To account for this correctly in 740 + * the rejected/usage counts for the idle-state statistics, users can call this 741 + * function to adjust the values. 742 + * 743 + * It is assumed that the users guarantee that the genpd doesn't get removed 744 + * while this routine is getting called. 745 + */ 746 + void pm_genpd_inc_rejected(struct generic_pm_domain *genpd, 747 + unsigned int state_idx) 748 + { 749 + genpd_lock(genpd); 750 + genpd->states[genpd->state_idx].rejected++; 751 + genpd->states[genpd->state_idx].usage--; 752 + genpd_unlock(genpd); 753 + } 754 + EXPORT_SYMBOL_GPL(pm_genpd_inc_rejected); 755 + 761 756 static int _genpd_power_on(struct generic_pm_domain *genpd, bool timed) 762 757 { 763 758 unsigned int state_idx = genpd->state_idx; ··· 908 853 * If all of the @genpd's devices have been suspended and all of its subdomains 909 854 * have been powered down, remove power from @genpd. 910 855 */ 911 - static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on, 912 - unsigned int depth) 856 + static void genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on, 857 + unsigned int depth) 913 858 { 914 859 struct pm_domain_data *pdd; 915 860 struct gpd_link *link; 916 861 unsigned int not_suspended = 0; 917 - int ret; 918 862 919 863 /* 920 864 * Do not try to power off the domain in the following situations: 921 - * (1) The domain is already in the "power off" state. 922 - * (2) System suspend is in progress. 865 + * The domain is already in the "power off" state. 866 + * System suspend is in progress. 867 + * The domain is configured as always on. 868 + * The domain has a subdomain being powered on. 923 869 */ 924 - if (!genpd_status_on(genpd) || genpd->prepared_count > 0) 925 - return 0; 926 - 927 - /* 928 - * Abort power off for the PM domain in the following situations: 929 - * (1) The domain is configured as always on. 930 - * (2) When the domain has a subdomain being powered on. 931 - */ 932 - if (genpd_is_always_on(genpd) || 933 - genpd_is_rpm_always_on(genpd) || 934 - atomic_read(&genpd->sd_count) > 0) 935 - return -EBUSY; 870 + if (!genpd_status_on(genpd) || genpd->prepared_count > 0 || 871 + genpd_is_always_on(genpd) || genpd_is_rpm_always_on(genpd) || 872 + atomic_read(&genpd->sd_count) > 0) 873 + return; 936 874 937 875 /* 938 876 * The children must be in their deepest (powered-off) states to allow ··· 936 888 list_for_each_entry(link, &genpd->parent_links, parent_node) { 937 889 struct generic_pm_domain *child = link->child; 938 890 if (child->state_idx < child->state_count - 1) 939 - return -EBUSY; 891 + return; 940 892 } 941 893 942 894 list_for_each_entry(pdd, &genpd->dev_list, list_node) { ··· 950 902 951 903 /* The device may need its PM domain to stay powered on. */ 952 904 if (to_gpd_data(pdd)->rpm_always_on) 953 - return -EBUSY; 905 + return; 954 906 } 955 907 956 908 if (not_suspended > 1 || (not_suspended == 1 && !one_dev_on)) 957 - return -EBUSY; 909 + return; 958 910 959 911 if (genpd->gov && genpd->gov->power_down_ok) { 960 912 if (!genpd->gov->power_down_ok(&genpd->domain)) 961 - return -EAGAIN; 913 + return; 962 914 } 963 915 964 916 /* Default to shallowest state. */ ··· 967 919 968 920 /* Don't power off, if a child domain is waiting to power on. */ 969 921 if (atomic_read(&genpd->sd_count) > 0) 970 - return -EBUSY; 922 + return; 971 923 972 - ret = _genpd_power_off(genpd, true); 973 - if (ret) { 924 + if (_genpd_power_off(genpd, true)) { 974 925 genpd->states[genpd->state_idx].rejected++; 975 - return ret; 926 + return; 976 927 } 977 928 978 929 genpd->status = GENPD_STATE_OFF; ··· 984 937 genpd_power_off(link->parent, false, depth + 1); 985 938 genpd_unlock(link->parent); 986 939 } 987 - 988 - return 0; 989 940 } 990 941 991 942 /** ··· 1001 956 1002 957 if (genpd_status_on(genpd)) 1003 958 return 0; 959 + 960 + /* Reflect over the entered idle-states residency for debugfs. */ 961 + genpd_reflect_residency(genpd); 1004 962 1005 963 /* 1006 964 * The list is guaranteed not to change while the loop below is being ··· 1498 1450 if (ret) 1499 1451 return ret; 1500 1452 1501 - if (device_wakeup_path(dev) && genpd_is_active_wakeup(genpd)) 1453 + if (device_awake_path(dev) && genpd_is_active_wakeup(genpd)) 1502 1454 return 0; 1503 1455 1504 1456 if (genpd->dev_ops.stop && genpd->dev_ops.start && ··· 1553 1505 if (IS_ERR(genpd)) 1554 1506 return -EINVAL; 1555 1507 1556 - if (device_wakeup_path(dev) && genpd_is_active_wakeup(genpd)) 1508 + if (device_awake_path(dev) && genpd_is_active_wakeup(genpd)) 1557 1509 return resume_noirq(dev); 1558 1510 1559 1511 genpd_lock(genpd); ··· 2277 2229 return 0; 2278 2230 put: 2279 2231 put_device(&genpd->dev); 2280 - if (genpd->free_states == genpd_free_default_power_state) 2232 + if (genpd->free_states == genpd_free_default_power_state) { 2281 2233 kfree(genpd->states); 2234 + genpd->states = NULL; 2235 + } 2282 2236 free: 2283 2237 if (genpd_is_cpu_domain(genpd)) 2284 2238 free_cpumask_var(genpd->cpus); ··· 2343 2293 genpd->provider = NULL; 2344 2294 genpd->device_id = -ENXIO; 2345 2295 genpd->has_provider = false; 2296 + genpd->opp_table = NULL; 2346 2297 genpd->accounting_time = ktime_get_mono_fast_ns(); 2347 2298 genpd->domain.ops.runtime_suspend = genpd_runtime_suspend; 2348 2299 genpd->domain.ops.runtime_resume = genpd_runtime_resume; ··· 2618 2567 2619 2568 ret = genpd_add_provider(np, genpd_xlate_simple, genpd); 2620 2569 if (ret) { 2621 - if (!genpd_is_opp_table_fw(genpd) && genpd->set_performance_state) { 2570 + if (genpd->opp_table) { 2622 2571 dev_pm_opp_put_opp_table(genpd->opp_table); 2623 2572 dev_pm_opp_of_remove_table(&genpd->dev); 2624 2573 } ··· 2698 2647 genpd->provider = NULL; 2699 2648 genpd->has_provider = false; 2700 2649 2701 - if (!genpd_is_opp_table_fw(genpd) && genpd->set_performance_state) { 2650 + if (genpd->opp_table) { 2702 2651 dev_pm_opp_put_opp_table(genpd->opp_table); 2703 2652 dev_pm_opp_of_remove_table(&genpd->dev); 2704 2653 } ··· 2730 2679 if (gpd->provider == &np->fwnode) { 2731 2680 gpd->has_provider = false; 2732 2681 2733 - if (genpd_is_opp_table_fw(gpd) || !gpd->set_performance_state) 2734 - continue; 2735 - 2736 - dev_pm_opp_put_opp_table(gpd->opp_table); 2737 - dev_pm_opp_of_remove_table(&gpd->dev); 2682 + if (gpd->opp_table) { 2683 + dev_pm_opp_put_opp_table(gpd->opp_table); 2684 + dev_pm_opp_of_remove_table(&gpd->dev); 2685 + } 2738 2686 } 2739 2687 } 2740 2688 ··· 3542 3492 if (ret) 3543 3493 return -ERESTARTSYS; 3544 3494 3545 - seq_puts(s, "State Time Spent(ms) Usage Rejected\n"); 3495 + seq_puts(s, "State Time Spent(ms) Usage Rejected Above Below\n"); 3546 3496 3547 3497 for (i = 0; i < genpd->state_count; i++) { 3548 3498 struct genpd_power_state *state = &genpd->states[i]; ··· 3562 3512 snprintf(state_name, ARRAY_SIZE(state_name), "S%-13d", i); 3563 3513 3564 3514 do_div(idle_time, NSEC_PER_MSEC); 3565 - seq_printf(s, "%-14s %-14llu %-14llu %llu\n", 3515 + seq_printf(s, "%-14s %-14llu %-10llu %-10llu %-10llu %llu\n", 3566 3516 state->name ?: state_name, idle_time, 3567 - state->usage, state->rejected); 3517 + state->usage, state->rejected, state->above, 3518 + state->below); 3568 3519 } 3569 3520 3570 3521 genpd_unlock(genpd);
+2
drivers/pmdomain/governor.c
··· 392 392 if (idle_duration_ns >= (genpd->states[i].residency_ns + 393 393 genpd->states[i].power_off_latency_ns)) { 394 394 genpd->state_idx = i; 395 + genpd->gd->last_enter = now; 396 + genpd->gd->reflect_residency = true; 395 397 return true; 396 398 } 397 399 } while (--i >= 0);
+585
drivers/pmdomain/mediatek/mt6893-pm-domains.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2025 Collabora Ltd 4 + * AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> 5 + */ 6 + 7 + #ifndef __PMDOMAIN_MEDIATEK_MT6893_PM_DOMAINS_H 8 + #define __PMDOMAIN_MEDIATEK_MT6893_PM_DOMAINS_H 9 + 10 + #include <linux/soc/mediatek/infracfg.h> 11 + #include <dt-bindings/power/mediatek,mt6893-power.h> 12 + #include "mtk-pm-domains.h" 13 + 14 + #define MT6893_TOP_AXI_PROT_EN_MCU_STA1 0x2e4 15 + #define MT6893_TOP_AXI_PROT_EN_MCU_SET 0x2c4 16 + #define MT6893_TOP_AXI_PROT_EN_MCU_CLR 0x2c8 17 + #define MT6893_TOP_AXI_PROT_EN_VDNR_1_SET 0xba4 18 + #define MT6893_TOP_AXI_PROT_EN_VDNR_1_CLR 0xba8 19 + #define MT6893_TOP_AXI_PROT_EN_VDNR_1_STA1 0xbb0 20 + #define MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET 0xbb8 21 + #define MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR 0xbbc 22 + #define MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA1 0xbc4 23 + 24 + #define MT6893_TOP_AXI_PROT_EN_1_MFG1_STEP1 GENMASK(21, 19) 25 + #define MT6893_TOP_AXI_PROT_EN_2_MFG1_STEP2 GENMASK(6, 5) 26 + #define MT6893_TOP_AXI_PROT_EN_MFG1_STEP3 GENMASK(22, 21) 27 + #define MT6893_TOP_AXI_PROT_EN_2_MFG1_STEP4 BIT(7) 28 + #define MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_MFG1_STEP5 GENMASK(19, 17) 29 + #define MT6893_TOP_AXI_PROT_EN_MM_VDEC0_STEP1 BIT(24) 30 + #define MT6893_TOP_AXI_PROT_EN_MM_2_VDEC0_STEP2 BIT(25) 31 + #define MT6893_TOP_AXI_PROT_EN_MM_VDEC1_STEP1 BIT(6) 32 + #define MT6893_TOP_AXI_PROT_EN_MM_VDEC1_STEP2 BIT(7) 33 + #define MT6893_TOP_AXI_PROT_EN_MM_VENC0_STEP1 BIT(26) 34 + #define MT6893_TOP_AXI_PROT_EN_MM_2_VENC0_STEP2 BIT(0) 35 + #define MT6893_TOP_AXI_PROT_EN_MM_VENC0_STEP3 BIT(27) 36 + #define MT6893_TOP_AXI_PROT_EN_MM_2_VENC0_STEP4 BIT(1) 37 + #define MT6893_TOP_AXI_PROT_EN_MM_VENC1_STEP1 GENMASK(30, 28) 38 + #define MT6893_TOP_AXI_PROT_EN_MM_VENC1_STEP2 GENMASK(31, 29) 39 + #define MT6893_TOP_AXI_PROT_EN_MDP_STEP1 BIT(10) 40 + #define MT6893_TOP_AXI_PROT_EN_MM_MDP_STEP2 (BIT(2) | BIT(4) | BIT(6) | \ 41 + BIT(8) | BIT(18) | BIT(22) | \ 42 + BIT(28) | BIT(30)) 43 + #define MT6893_TOP_AXI_PROT_EN_MM_2_MDP_STEP3 (BIT(0) | BIT(2) | BIT(4) | \ 44 + BIT(6) | BIT(8)) 45 + #define MT6893_TOP_AXI_PROT_EN_MDP_STEP4 BIT(23) 46 + #define MT6893_TOP_AXI_PROT_EN_MM_MDP_STEP5 (BIT(3) | BIT(5) | BIT(7) | \ 47 + BIT(9) | BIT(19) | BIT(23) | \ 48 + BIT(29) | BIT(31)) 49 + #define MT6893_TOP_AXI_PROT_EN_MM_2_MDP_STEP6 (BIT(1) | BIT(7) | BIT(9) | BIT(11)) 50 + #define MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_MDP_STEP7 BIT(20) 51 + #define MT6893_TOP_AXI_PROT_EN_MM_DISP_STEP1 (BIT(0) | BIT(6) | BIT(8) | \ 52 + BIT(10) | BIT(12) | BIT(14) | \ 53 + BIT(16) | BIT(20) | BIT(24) | \ 54 + BIT(26)) 55 + #define MT6893_TOP_AXI_PROT_EN_DISP_STEP2 BIT(6) 56 + #define MT6893_TOP_AXI_PROT_EN_MM_DISP_STEP3 (BIT(1) | BIT(7) | BIT(9) | \ 57 + BIT(15) | BIT(17) | BIT(21) | \ 58 + BIT(25) | BIT(27)) 59 + #define MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_DISP_STEP4 BIT(21) 60 + #define MT6893_TOP_AXI_PROT_EN_2_ADSP BIT(3) 61 + #define MT6893_TOP_AXI_PROT_EN_2_CAM_STEP1 BIT(1) 62 + #define MT6893_TOP_AXI_PROT_EN_MM_CAM_STEP2 (BIT(0) | BIT(2) | BIT(4)) 63 + #define MT6893_TOP_AXI_PROT_EN_1_CAM_STEP3 BIT(22) 64 + #define MT6893_TOP_AXI_PROT_EN_MM_CAM_STEP4 (BIT(1) | BIT(3) | BIT(5)) 65 + #define MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWA_STEP1 BIT(18) 66 + #define MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWA_STEP2 BIT(19) 67 + #define MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWB_STEP1 BIT(20) 68 + #define MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWB_STEP2 BIT(21) 69 + #define MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWC_STEP1 BIT(22) 70 + #define MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWC_STEP2 BIT(23) 71 + 72 + /* 73 + * MT6893 Power Domain (MTCMOS) support 74 + * 75 + * The register layout for this IP is very similar to MT8192 so where possible 76 + * the same definitions are reused to avoid duplication. 77 + * Where the bus protection bits are also the same, the entire set is reused. 78 + */ 79 + static const struct scpsys_domain_data scpsys_domain_data_mt6893[] = { 80 + [MT6893_POWER_DOMAIN_CONN] = { 81 + .name = "conn", 82 + .sta_mask = BIT(1), 83 + .ctl_offs = 0x304, 84 + .pwr_sta_offs = 0x16c, 85 + .pwr_sta2nd_offs = 0x170, 86 + .sram_pdn_bits = 0, 87 + .sram_pdn_ack_bits = 0, 88 + .bp_cfg = { 89 + BUS_PROT_WR(INFRA, 90 + MT8192_TOP_AXI_PROT_EN_CONN, 91 + MT8192_TOP_AXI_PROT_EN_SET, 92 + MT8192_TOP_AXI_PROT_EN_CLR, 93 + MT8192_TOP_AXI_PROT_EN_STA1), 94 + BUS_PROT_WR(INFRA, 95 + MT8192_TOP_AXI_PROT_EN_CONN_2ND, 96 + MT8192_TOP_AXI_PROT_EN_SET, 97 + MT8192_TOP_AXI_PROT_EN_CLR, 98 + MT8192_TOP_AXI_PROT_EN_STA1), 99 + BUS_PROT_WR(INFRA, 100 + MT8192_TOP_AXI_PROT_EN_1_CONN, 101 + MT8192_TOP_AXI_PROT_EN_1_SET, 102 + MT8192_TOP_AXI_PROT_EN_1_CLR, 103 + MT8192_TOP_AXI_PROT_EN_1_STA1), 104 + }, 105 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 106 + }, 107 + [MT6893_POWER_DOMAIN_MFG0] = { 108 + .name = "mfg0", 109 + .sta_mask = BIT(2), 110 + .ctl_offs = 0x308, 111 + .pwr_sta_offs = 0x16c, 112 + .pwr_sta2nd_offs = 0x170, 113 + .sram_pdn_bits = BIT(8), 114 + .sram_pdn_ack_bits = BIT(12), 115 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_DOMAIN_SUPPLY, 116 + }, 117 + [MT6893_POWER_DOMAIN_MFG1] = { 118 + .name = "mfg1", 119 + .sta_mask = BIT(3), 120 + .ctl_offs = 0x30c, 121 + .pwr_sta_offs = 0x16c, 122 + .pwr_sta2nd_offs = 0x170, 123 + .sram_pdn_bits = BIT(8), 124 + .sram_pdn_ack_bits = BIT(12), 125 + .bp_cfg = { 126 + BUS_PROT_WR(INFRA, 127 + MT6893_TOP_AXI_PROT_EN_1_MFG1_STEP1, 128 + MT8192_TOP_AXI_PROT_EN_1_SET, 129 + MT8192_TOP_AXI_PROT_EN_1_CLR, 130 + MT8192_TOP_AXI_PROT_EN_1_STA1), 131 + BUS_PROT_WR(INFRA, 132 + MT6893_TOP_AXI_PROT_EN_2_MFG1_STEP2, 133 + MT8192_TOP_AXI_PROT_EN_2_SET, 134 + MT8192_TOP_AXI_PROT_EN_2_CLR, 135 + MT8192_TOP_AXI_PROT_EN_2_STA1), 136 + BUS_PROT_WR(INFRA, 137 + MT6893_TOP_AXI_PROT_EN_MFG1_STEP3, 138 + MT8192_TOP_AXI_PROT_EN_SET, 139 + MT8192_TOP_AXI_PROT_EN_CLR, 140 + MT8192_TOP_AXI_PROT_EN_STA1), 141 + BUS_PROT_WR(INFRA, 142 + MT6893_TOP_AXI_PROT_EN_2_MFG1_STEP4, 143 + MT8192_TOP_AXI_PROT_EN_2_SET, 144 + MT8192_TOP_AXI_PROT_EN_2_CLR, 145 + MT8192_TOP_AXI_PROT_EN_2_STA1), 146 + BUS_PROT_WR(INFRA, 147 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_MFG1_STEP5, 148 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET, 149 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR, 150 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA1), 151 + }, 152 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF | MTK_SCPD_DOMAIN_SUPPLY, 153 + }, 154 + [MT6893_POWER_DOMAIN_MFG2] = { 155 + .name = "mfg2", 156 + .sta_mask = BIT(4), 157 + .ctl_offs = 0x310, 158 + .pwr_sta_offs = 0x16c, 159 + .pwr_sta2nd_offs = 0x170, 160 + .sram_pdn_bits = BIT(8), 161 + .sram_pdn_ack_bits = BIT(12), 162 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 163 + }, 164 + [MT6893_POWER_DOMAIN_MFG3] = { 165 + .name = "mfg3", 166 + .sta_mask = BIT(5), 167 + .ctl_offs = 0x314, 168 + .pwr_sta_offs = 0x16c, 169 + .pwr_sta2nd_offs = 0x170, 170 + .sram_pdn_bits = BIT(8), 171 + .sram_pdn_ack_bits = BIT(12), 172 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 173 + }, 174 + [MT6893_POWER_DOMAIN_MFG4] = { 175 + .name = "mfg4", 176 + .sta_mask = BIT(6), 177 + .ctl_offs = 0x318, 178 + .pwr_sta_offs = 0x16c, 179 + .pwr_sta2nd_offs = 0x170, 180 + .sram_pdn_bits = BIT(8), 181 + .sram_pdn_ack_bits = BIT(12), 182 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 183 + }, 184 + [MT6893_POWER_DOMAIN_MFG5] = { 185 + .name = "mfg5", 186 + .sta_mask = BIT(7), 187 + .ctl_offs = 0x31c, 188 + .pwr_sta_offs = 0x16c, 189 + .pwr_sta2nd_offs = 0x170, 190 + .sram_pdn_bits = BIT(8), 191 + .sram_pdn_ack_bits = BIT(12), 192 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 193 + }, 194 + [MT6893_POWER_DOMAIN_MFG6] = { 195 + .name = "mfg6", 196 + .sta_mask = BIT(8), 197 + .ctl_offs = 0x320, 198 + .pwr_sta_offs = 0x16c, 199 + .pwr_sta2nd_offs = 0x170, 200 + .sram_pdn_bits = BIT(8), 201 + .sram_pdn_ack_bits = BIT(12), 202 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 203 + }, 204 + [MT6893_POWER_DOMAIN_ISP] = { 205 + .name = "isp", 206 + .sta_mask = BIT(12), 207 + .ctl_offs = 0x330, 208 + .pwr_sta_offs = 0x16c, 209 + .pwr_sta2nd_offs = 0x170, 210 + .sram_pdn_bits = BIT(8), 211 + .sram_pdn_ack_bits = BIT(12), 212 + .bp_cfg = { 213 + BUS_PROT_WR(INFRA, 214 + MT8192_TOP_AXI_PROT_EN_MM_2_ISP, 215 + MT8192_TOP_AXI_PROT_EN_MM_2_SET, 216 + MT8192_TOP_AXI_PROT_EN_MM_2_CLR, 217 + MT8192_TOP_AXI_PROT_EN_MM_2_STA1), 218 + BUS_PROT_WR(INFRA, 219 + MT8192_TOP_AXI_PROT_EN_MM_2_ISP_2ND, 220 + MT8192_TOP_AXI_PROT_EN_MM_2_SET, 221 + MT8192_TOP_AXI_PROT_EN_MM_2_CLR, 222 + MT8192_TOP_AXI_PROT_EN_MM_2_STA1), 223 + }, 224 + }, 225 + [MT6893_POWER_DOMAIN_ISP2] = { 226 + .name = "isp2", 227 + .sta_mask = BIT(13), 228 + .ctl_offs = 0x334, 229 + .pwr_sta_offs = 0x16c, 230 + .pwr_sta2nd_offs = 0x170, 231 + .sram_pdn_bits = BIT(8), 232 + .sram_pdn_ack_bits = BIT(12), 233 + .bp_cfg = { 234 + BUS_PROT_WR(INFRA, 235 + MT8192_TOP_AXI_PROT_EN_MM_ISP2, 236 + MT8192_TOP_AXI_PROT_EN_MM_SET, 237 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 238 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 239 + BUS_PROT_WR(INFRA, 240 + MT8192_TOP_AXI_PROT_EN_MM_ISP2_2ND, 241 + MT8192_TOP_AXI_PROT_EN_MM_SET, 242 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 243 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 244 + }, 245 + }, 246 + [MT6893_POWER_DOMAIN_IPE] = { 247 + .name = "ipe", 248 + .sta_mask = BIT(14), 249 + .ctl_offs = 0x338, 250 + .pwr_sta_offs = 0x16c, 251 + .pwr_sta2nd_offs = 0x170, 252 + .sram_pdn_bits = BIT(8), 253 + .sram_pdn_ack_bits = BIT(12), 254 + .bp_cfg = { 255 + BUS_PROT_WR(INFRA, 256 + MT8192_TOP_AXI_PROT_EN_MM_IPE, 257 + MT8192_TOP_AXI_PROT_EN_MM_SET, 258 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 259 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 260 + BUS_PROT_WR(INFRA, 261 + MT8192_TOP_AXI_PROT_EN_MM_IPE_2ND, 262 + MT8192_TOP_AXI_PROT_EN_MM_SET, 263 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 264 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 265 + }, 266 + }, 267 + [MT6893_POWER_DOMAIN_VDEC0] = { 268 + .name = "vdec0", 269 + .sta_mask = BIT(15), 270 + .ctl_offs = 0x33c, 271 + .pwr_sta_offs = 0x16c, 272 + .pwr_sta2nd_offs = 0x170, 273 + .sram_pdn_bits = BIT(8), 274 + .sram_pdn_ack_bits = BIT(12), 275 + .bp_cfg = { 276 + BUS_PROT_WR(INFRA, 277 + MT6893_TOP_AXI_PROT_EN_MM_VDEC0_STEP1, 278 + MT8192_TOP_AXI_PROT_EN_MM_SET, 279 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 280 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 281 + BUS_PROT_WR(INFRA, 282 + MT6893_TOP_AXI_PROT_EN_MM_2_VDEC0_STEP2, 283 + MT8192_TOP_AXI_PROT_EN_MM_2_SET, 284 + MT8192_TOP_AXI_PROT_EN_MM_2_CLR, 285 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 286 + }, 287 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 288 + }, 289 + [MT6893_POWER_DOMAIN_VDEC1] = { 290 + .name = "vdec1", 291 + .sta_mask = BIT(16), 292 + .ctl_offs = 0x340, 293 + .pwr_sta_offs = 0x16c, 294 + .pwr_sta2nd_offs = 0x170, 295 + .sram_pdn_bits = BIT(8), 296 + .sram_pdn_ack_bits = BIT(12), 297 + .bp_cfg = { 298 + BUS_PROT_WR(INFRA, 299 + MT6893_TOP_AXI_PROT_EN_MM_VDEC1_STEP1, 300 + MT8192_TOP_AXI_PROT_EN_MM_SET, 301 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 302 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 303 + BUS_PROT_WR(INFRA, 304 + MT6893_TOP_AXI_PROT_EN_MM_VDEC1_STEP2, 305 + MT8192_TOP_AXI_PROT_EN_MM_SET, 306 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 307 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 308 + }, 309 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 310 + }, 311 + [MT6893_POWER_DOMAIN_VENC0] = { 312 + .name = "venc0", 313 + .sta_mask = BIT(17), 314 + .ctl_offs = 0x344, 315 + .pwr_sta_offs = 0x16c, 316 + .pwr_sta2nd_offs = 0x170, 317 + .sram_pdn_bits = BIT(8), 318 + .sram_pdn_ack_bits = BIT(12), 319 + .bp_cfg = { 320 + BUS_PROT_WR(INFRA, 321 + MT6893_TOP_AXI_PROT_EN_MM_VENC0_STEP1, 322 + MT8192_TOP_AXI_PROT_EN_MM_SET, 323 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 324 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 325 + BUS_PROT_WR(INFRA, 326 + MT6893_TOP_AXI_PROT_EN_MM_2_VENC0_STEP2, 327 + MT8192_TOP_AXI_PROT_EN_MM_2_SET, 328 + MT8192_TOP_AXI_PROT_EN_MM_2_CLR, 329 + MT8192_TOP_AXI_PROT_EN_MM_2_STA1), 330 + BUS_PROT_WR(INFRA, 331 + MT6893_TOP_AXI_PROT_EN_MM_VENC0_STEP3, 332 + MT8192_TOP_AXI_PROT_EN_MM_SET, 333 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 334 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 335 + BUS_PROT_WR(INFRA, 336 + MT6893_TOP_AXI_PROT_EN_MM_2_VENC0_STEP4, 337 + MT8192_TOP_AXI_PROT_EN_MM_2_SET, 338 + MT8192_TOP_AXI_PROT_EN_MM_2_CLR, 339 + MT8192_TOP_AXI_PROT_EN_MM_2_STA1), 340 + }, 341 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 342 + }, 343 + [MT6893_POWER_DOMAIN_VENC1] = { 344 + .name = "venc1", 345 + .sta_mask = BIT(18), 346 + .ctl_offs = 0x348, 347 + .pwr_sta_offs = 0x16c, 348 + .pwr_sta2nd_offs = 0x170, 349 + .sram_pdn_bits = BIT(8), 350 + .sram_pdn_ack_bits = BIT(12), 351 + .bp_cfg = { 352 + BUS_PROT_WR(INFRA, 353 + MT6893_TOP_AXI_PROT_EN_MM_VENC1_STEP1, 354 + MT8192_TOP_AXI_PROT_EN_MM_SET, 355 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 356 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 357 + BUS_PROT_WR(INFRA, 358 + MT6893_TOP_AXI_PROT_EN_MM_VENC1_STEP2, 359 + MT8192_TOP_AXI_PROT_EN_MM_SET, 360 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 361 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 362 + }, 363 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 364 + }, 365 + [MT6893_POWER_DOMAIN_MDP] = { 366 + .name = "mdp", 367 + .sta_mask = BIT(19), 368 + .ctl_offs = 0x34c, 369 + .pwr_sta_offs = 0x16c, 370 + .pwr_sta2nd_offs = 0x170, 371 + .sram_pdn_bits = BIT(8), 372 + .sram_pdn_ack_bits = BIT(12), 373 + .bp_cfg = { 374 + BUS_PROT_WR(INFRA, 375 + MT6893_TOP_AXI_PROT_EN_MDP_STEP1, 376 + MT8192_TOP_AXI_PROT_EN_SET, 377 + MT8192_TOP_AXI_PROT_EN_CLR, 378 + MT8192_TOP_AXI_PROT_EN_STA1), 379 + BUS_PROT_WR(INFRA, 380 + MT6893_TOP_AXI_PROT_EN_MM_MDP_STEP2, 381 + MT8192_TOP_AXI_PROT_EN_MM_SET, 382 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 383 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 384 + BUS_PROT_WR(INFRA, 385 + MT6893_TOP_AXI_PROT_EN_MM_2_MDP_STEP3, 386 + MT8192_TOP_AXI_PROT_EN_MM_2_SET, 387 + MT8192_TOP_AXI_PROT_EN_MM_2_CLR, 388 + MT8192_TOP_AXI_PROT_EN_MM_2_STA1), 389 + BUS_PROT_WR(INFRA, 390 + MT6893_TOP_AXI_PROT_EN_MDP_STEP4, 391 + MT8192_TOP_AXI_PROT_EN_SET, 392 + MT8192_TOP_AXI_PROT_EN_CLR, 393 + MT8192_TOP_AXI_PROT_EN_STA1), 394 + BUS_PROT_WR(INFRA, 395 + MT6893_TOP_AXI_PROT_EN_MM_MDP_STEP5, 396 + MT8192_TOP_AXI_PROT_EN_MM_SET, 397 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 398 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 399 + BUS_PROT_WR(INFRA, 400 + MT6893_TOP_AXI_PROT_EN_MM_2_MDP_STEP6, 401 + MT8192_TOP_AXI_PROT_EN_MM_2_SET, 402 + MT8192_TOP_AXI_PROT_EN_MM_2_CLR, 403 + MT8192_TOP_AXI_PROT_EN_MM_2_STA1), 404 + BUS_PROT_WR(INFRA, 405 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_MDP_STEP7, 406 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET, 407 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR, 408 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA1), 409 + }, 410 + }, 411 + [MT6893_POWER_DOMAIN_DISP] = { 412 + .name = "disp", 413 + .sta_mask = BIT(20), 414 + .ctl_offs = 0x350, 415 + .pwr_sta_offs = 0x16c, 416 + .pwr_sta2nd_offs = 0x170, 417 + .sram_pdn_bits = BIT(8), 418 + .sram_pdn_ack_bits = BIT(12), 419 + .bp_cfg = { 420 + BUS_PROT_WR(INFRA, 421 + MT6893_TOP_AXI_PROT_EN_MM_DISP_STEP1, 422 + MT8192_TOP_AXI_PROT_EN_MM_SET, 423 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 424 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 425 + BUS_PROT_WR(INFRA, 426 + MT6893_TOP_AXI_PROT_EN_DISP_STEP2, 427 + MT8192_TOP_AXI_PROT_EN_SET, 428 + MT8192_TOP_AXI_PROT_EN_CLR, 429 + MT8192_TOP_AXI_PROT_EN_STA1), 430 + BUS_PROT_WR(INFRA, 431 + MT6893_TOP_AXI_PROT_EN_MM_DISP_STEP3, 432 + MT8192_TOP_AXI_PROT_EN_MM_SET, 433 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 434 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 435 + BUS_PROT_WR(INFRA, 436 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_DISP_STEP4, 437 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_SET, 438 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_CLR, 439 + MT6893_TOP_AXI_PROT_EN_SUB_INFRA_VDNR_STA1), 440 + }, 441 + }, 442 + [MT6893_POWER_DOMAIN_AUDIO] = { 443 + .name = "audio", 444 + .sta_mask = BIT(21), 445 + .ctl_offs = 0x354, 446 + .pwr_sta_offs = 0x16c, 447 + .pwr_sta2nd_offs = 0x170, 448 + .sram_pdn_bits = BIT(8), 449 + .sram_pdn_ack_bits = BIT(12), 450 + .bp_cfg = { 451 + BUS_PROT_WR(INFRA, 452 + MT8192_TOP_AXI_PROT_EN_2_AUDIO, 453 + MT8192_TOP_AXI_PROT_EN_2_SET, 454 + MT8192_TOP_AXI_PROT_EN_2_CLR, 455 + MT8192_TOP_AXI_PROT_EN_2_STA1), 456 + }, 457 + }, 458 + [MT6893_POWER_DOMAIN_ADSP] = { 459 + .name = "audio", 460 + .sta_mask = BIT(22), 461 + .ctl_offs = 0x358, 462 + .pwr_sta_offs = 0x16c, 463 + .pwr_sta2nd_offs = 0x170, 464 + .sram_pdn_bits = BIT(9), 465 + .sram_pdn_ack_bits = BIT(12), 466 + .bp_cfg = { 467 + BUS_PROT_WR(INFRA, 468 + MT6893_TOP_AXI_PROT_EN_2_ADSP, 469 + MT8192_TOP_AXI_PROT_EN_2_SET, 470 + MT8192_TOP_AXI_PROT_EN_2_CLR, 471 + MT8192_TOP_AXI_PROT_EN_2_STA1), 472 + }, 473 + }, 474 + [MT6893_POWER_DOMAIN_CAM] = { 475 + .name = "cam", 476 + .sta_mask = BIT(23), 477 + .ctl_offs = 0x35c, 478 + .pwr_sta_offs = 0x16c, 479 + .pwr_sta2nd_offs = 0x170, 480 + .sram_pdn_bits = BIT(8), 481 + .sram_pdn_ack_bits = BIT(12), 482 + .bp_cfg = { 483 + BUS_PROT_WR(INFRA, 484 + MT6893_TOP_AXI_PROT_EN_2_CAM_STEP1, 485 + MT8192_TOP_AXI_PROT_EN_2_SET, 486 + MT8192_TOP_AXI_PROT_EN_2_CLR, 487 + MT8192_TOP_AXI_PROT_EN_2_STA1), 488 + BUS_PROT_WR(INFRA, 489 + MT6893_TOP_AXI_PROT_EN_MM_CAM_STEP2, 490 + MT8192_TOP_AXI_PROT_EN_MM_SET, 491 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 492 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 493 + BUS_PROT_WR(INFRA, 494 + MT6893_TOP_AXI_PROT_EN_1_CAM_STEP3, 495 + MT8192_TOP_AXI_PROT_EN_1_SET, 496 + MT8192_TOP_AXI_PROT_EN_1_CLR, 497 + MT8192_TOP_AXI_PROT_EN_1_STA1), 498 + BUS_PROT_WR(INFRA, 499 + MT6893_TOP_AXI_PROT_EN_MM_CAM_STEP4, 500 + MT8192_TOP_AXI_PROT_EN_MM_SET, 501 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 502 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 503 + }, 504 + }, 505 + [MT6893_POWER_DOMAIN_CAM_RAWA] = { 506 + .name = "cam_rawa", 507 + .sta_mask = BIT(24), 508 + .ctl_offs = 0x360, 509 + .pwr_sta_offs = 0x16c, 510 + .pwr_sta2nd_offs = 0x170, 511 + .sram_pdn_bits = BIT(8), 512 + .sram_pdn_ack_bits = BIT(12), 513 + .bp_cfg = { 514 + BUS_PROT_WR(INFRA, 515 + MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWA_STEP1, 516 + MT8192_TOP_AXI_PROT_EN_MM_SET, 517 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 518 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 519 + BUS_PROT_WR(INFRA, 520 + MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWA_STEP2, 521 + MT8192_TOP_AXI_PROT_EN_MM_SET, 522 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 523 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 524 + }, 525 + }, 526 + [MT6893_POWER_DOMAIN_CAM_RAWB] = { 527 + .name = "cam_rawb", 528 + .sta_mask = BIT(25), 529 + .ctl_offs = 0x364, 530 + .pwr_sta_offs = 0x16c, 531 + .pwr_sta2nd_offs = 0x170, 532 + .sram_pdn_bits = BIT(8), 533 + .sram_pdn_ack_bits = BIT(12), 534 + .bp_cfg = { 535 + BUS_PROT_WR(INFRA, 536 + MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWB_STEP1, 537 + MT8192_TOP_AXI_PROT_EN_MM_SET, 538 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 539 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 540 + BUS_PROT_WR(INFRA, 541 + MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWB_STEP2, 542 + MT8192_TOP_AXI_PROT_EN_MM_SET, 543 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 544 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 545 + }, 546 + }, 547 + [MT6893_POWER_DOMAIN_CAM_RAWC] = { 548 + .name = "cam_rawc", 549 + .sta_mask = BIT(26), 550 + .ctl_offs = 0x368, 551 + .pwr_sta_offs = 0x16c, 552 + .pwr_sta2nd_offs = 0x170, 553 + .sram_pdn_bits = BIT(8), 554 + .sram_pdn_ack_bits = BIT(12), 555 + .bp_cfg = { 556 + BUS_PROT_WR(INFRA, 557 + MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWC_STEP1, 558 + MT8192_TOP_AXI_PROT_EN_MM_SET, 559 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 560 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 561 + BUS_PROT_WR(INFRA, 562 + MT6893_TOP_AXI_PROT_EN_MM_CAM_RAWC_STEP2, 563 + MT8192_TOP_AXI_PROT_EN_MM_SET, 564 + MT8192_TOP_AXI_PROT_EN_MM_CLR, 565 + MT8192_TOP_AXI_PROT_EN_MM_STA1), 566 + }, 567 + }, 568 + [MT6893_POWER_DOMAIN_DP_TX] = { 569 + .name = "dp_tx", 570 + .sta_mask = BIT(27), 571 + .ctl_offs = 0x3ac, 572 + .pwr_sta_offs = 0x16c, 573 + .pwr_sta2nd_offs = 0x170, 574 + .sram_pdn_bits = BIT(8), 575 + .sram_pdn_ack_bits = BIT(12), 576 + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, 577 + }, 578 + }; 579 + 580 + static const struct scpsys_soc_data mt6893_scpsys_data = { 581 + .domains_data = scpsys_domain_data_mt6893, 582 + .num_domains = ARRAY_SIZE(scpsys_domain_data_mt6893), 583 + }; 584 + 585 + #endif /* __PMDOMAIN_MEDIATEK_MT6893_PM_DOMAINS_H */
+14 -3
drivers/pmdomain/mediatek/mtk-pm-domains.c
··· 18 18 19 19 #include "mt6735-pm-domains.h" 20 20 #include "mt6795-pm-domains.h" 21 + #include "mt6893-pm-domains.h" 21 22 #include "mt8167-pm-domains.h" 22 23 #include "mt8173-pm-domains.h" 23 24 #include "mt8183-pm-domains.h" ··· 398 397 399 398 pd->infracfg = syscon_regmap_lookup_by_phandle_optional(node, "mediatek,infracfg"); 400 399 if (IS_ERR(pd->infracfg)) 401 - return ERR_CAST(pd->infracfg); 400 + return dev_err_cast_probe(scpsys->dev, pd->infracfg, 401 + "%pOF: failed to get infracfg regmap\n", 402 + node); 402 403 403 404 smi_node = of_parse_phandle(node, "mediatek,smi", 0); 404 405 if (smi_node) { 405 406 pd->smi = device_node_to_regmap(smi_node); 406 407 of_node_put(smi_node); 407 408 if (IS_ERR(pd->smi)) 408 - return ERR_CAST(pd->smi); 409 + return dev_err_cast_probe(scpsys->dev, pd->smi, 410 + "%pOF: failed to get SMI regmap\n", 411 + node); 409 412 } 410 413 411 414 if (MTK_SCPD_CAPS(pd, MTK_SCPD_HAS_INFRA_NAO)) { 412 415 pd->infracfg_nao = syscon_regmap_lookup_by_phandle(node, "mediatek,infracfg-nao"); 413 416 if (IS_ERR(pd->infracfg_nao)) 414 - return ERR_CAST(pd->infracfg_nao); 417 + return dev_err_cast_probe(scpsys->dev, pd->infracfg_nao, 418 + "%pOF: failed to get infracfg-nao regmap\n", 419 + node); 415 420 } else { 416 421 pd->infracfg_nao = NULL; 417 422 } ··· 623 616 { 624 617 .compatible = "mediatek,mt6795-power-controller", 625 618 .data = &mt6795_scpsys_data, 619 + }, 620 + { 621 + .compatible = "mediatek,mt6893-power-controller", 622 + .data = &mt6893_scpsys_data, 626 623 }, 627 624 { 628 625 .compatible = "mediatek,mt8167-power-controller",
+1 -1
drivers/pmdomain/mediatek/mtk-pm-domains.h
··· 44 44 #define PWR_STATUS_AUDIO BIT(24) 45 45 #define PWR_STATUS_USB BIT(25) 46 46 47 - #define SPM_MAX_BUS_PROT_DATA 6 47 + #define SPM_MAX_BUS_PROT_DATA 7 48 48 49 49 enum scpsys_bus_prot_flags { 50 50 BUS_PROT_REG_UPDATE = BIT(1),
+16
drivers/pmdomain/qcom/rpmhpd.c
··· 360 360 .num_pds = ARRAY_SIZE(sdx75_rpmhpds), 361 361 }; 362 362 363 + /* SM4450 RPMH powerdomains */ 364 + static struct rpmhpd *sm4450_rpmhpds[] = { 365 + [RPMHPD_CX] = &cx, 366 + [RPMHPD_CX_AO] = &cx_ao, 367 + [RPMHPD_EBI] = &ebi, 368 + [RPMHPD_LMX] = &lmx, 369 + [RPMHPD_MSS] = &mss, 370 + [RPMHPD_MX] = &mx, 371 + }; 372 + 373 + static const struct rpmhpd_desc sm4450_desc = { 374 + .rpmhpds = sm4450_rpmhpds, 375 + .num_pds = ARRAY_SIZE(sm4450_rpmhpds), 376 + }; 377 + 363 378 /* SM6350 RPMH powerdomains */ 364 379 static struct rpmhpd *sm6350_rpmhpds[] = { 365 380 [SM6350_CX] = &cx_w_mx_parent, ··· 739 724 { .compatible = "qcom,sdx55-rpmhpd", .data = &sdx55_desc}, 740 725 { .compatible = "qcom,sdx65-rpmhpd", .data = &sdx65_desc}, 741 726 { .compatible = "qcom,sdx75-rpmhpd", .data = &sdx75_desc}, 727 + { .compatible = "qcom,sm4450-rpmhpd", .data = &sm4450_desc }, 742 728 { .compatible = "qcom,sm6350-rpmhpd", .data = &sm6350_desc }, 743 729 { .compatible = "qcom,sm7150-rpmhpd", .data = &sm7150_desc }, 744 730 { .compatible = "qcom,sm8150-rpmhpd", .data = &sm8150_desc },
+47 -1
drivers/pmdomain/rockchip/pm-domains.c
··· 2 2 /* 3 3 * Rockchip Generic power domain support. 4 4 * 5 - * Copyright (c) 2015 ROCKCHIP, Co. Ltd. 5 + * Copyright (c) 2015 Rockchip Electronics Co., Ltd. 6 6 */ 7 7 8 8 #include <linux/arm-smccc.h> ··· 35 35 #include <dt-bindings/power/rk3366-power.h> 36 36 #include <dt-bindings/power/rk3368-power.h> 37 37 #include <dt-bindings/power/rk3399-power.h> 38 + #include <dt-bindings/power/rockchip,rk3562-power.h> 38 39 #include <dt-bindings/power/rk3568-power.h> 39 40 #include <dt-bindings/power/rockchip,rk3576-power.h> 40 41 #include <dt-bindings/power/rk3588-power.h> ··· 136 135 .active_wakeup = wakeup, \ 137 136 } 138 137 138 + #define DOMAIN_M_G_SD(_name, pwr, status, req, idle, ack, g_mask, mem, wakeup, keepon) \ 139 + { \ 140 + .name = _name, \ 141 + .pwr_w_mask = (pwr) << 16, \ 142 + .pwr_mask = (pwr), \ 143 + .status_mask = (status), \ 144 + .req_w_mask = (req) << 16, \ 145 + .req_mask = (req), \ 146 + .idle_mask = (idle), \ 147 + .ack_mask = (ack), \ 148 + .clk_ungate_mask = (g_mask), \ 149 + .active_wakeup = wakeup, \ 150 + } 151 + 139 152 #define DOMAIN_M_O_R(_name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, ack, wakeup, regulator) \ 140 153 { \ 141 154 .name = _name, \ ··· 215 200 216 201 #define DOMAIN_RK3399(name, pwr, status, req, wakeup) \ 217 202 DOMAIN(name, pwr, status, req, req, req, wakeup) 203 + 204 + #define DOMAIN_RK3562(name, pwr, req, g_mask, mem, wakeup) \ 205 + DOMAIN_M_G_SD(name, pwr, pwr, req, req, req, g_mask, mem, wakeup, false) 218 206 219 207 #define DOMAIN_RK3568(name, pwr, req, wakeup) \ 220 208 DOMAIN_M(name, pwr, pwr, req, req, req, wakeup) ··· 1215 1197 [RK3399_PD_SDIOAUDIO] = DOMAIN_RK3399("sdioaudio", BIT(31), BIT(31), BIT(29), true), 1216 1198 }; 1217 1199 1200 + static const struct rockchip_domain_info rk3562_pm_domains[] = { 1201 + /* name pwr req g_mask mem wakeup */ 1202 + [RK3562_PD_GPU] = DOMAIN_RK3562("gpu", BIT(0), BIT(1), BIT(1), 0, false), 1203 + [RK3562_PD_NPU] = DOMAIN_RK3562("npu", BIT(1), BIT(2), BIT(2), 0, false), 1204 + [RK3562_PD_VDPU] = DOMAIN_RK3562("vdpu", BIT(2), BIT(6), BIT(6), 0, false), 1205 + [RK3562_PD_VEPU] = DOMAIN_RK3562("vepu", BIT(3), BIT(7), BIT(7) | BIT(3), 0, false), 1206 + [RK3562_PD_RGA] = DOMAIN_RK3562("rga", BIT(4), BIT(5), BIT(5) | BIT(4), 0, false), 1207 + [RK3562_PD_VI] = DOMAIN_RK3562("vi", BIT(5), BIT(3), BIT(3), 0, false), 1208 + [RK3562_PD_VO] = DOMAIN_RK3562("vo", BIT(6), BIT(4), BIT(4), 16, false), 1209 + [RK3562_PD_PHP] = DOMAIN_RK3562("php", BIT(7), BIT(8), BIT(8), 0, false), 1210 + }; 1211 + 1218 1212 static const struct rockchip_domain_info rk3568_pm_domains[] = { 1219 1213 [RK3568_PD_NPU] = DOMAIN_RK3568("npu", BIT(1), BIT(2), false), 1220 1214 [RK3568_PD_GPU] = DOMAIN_RK3568("gpu", BIT(0), BIT(1), false), ··· 1428 1398 .domain_info = rk3399_pm_domains, 1429 1399 }; 1430 1400 1401 + static const struct rockchip_pmu_info rk3562_pmu = { 1402 + .pwr_offset = 0x210, 1403 + .status_offset = 0x230, 1404 + .req_offset = 0x110, 1405 + .idle_offset = 0x128, 1406 + .ack_offset = 0x120, 1407 + .clk_ungate_offset = 0x140, 1408 + 1409 + .num_domains = ARRAY_SIZE(rk3562_pm_domains), 1410 + .domain_info = rk3562_pm_domains, 1411 + }; 1412 + 1431 1413 static const struct rockchip_pmu_info rk3568_pmu = { 1432 1414 .pwr_offset = 0xa0, 1433 1415 .status_offset = 0x98, ··· 1537 1495 { 1538 1496 .compatible = "rockchip,rk3399-power-controller", 1539 1497 .data = (void *)&rk3399_pmu, 1498 + }, 1499 + { 1500 + .compatible = "rockchip,rk3562-power-controller", 1501 + .data = (void *)&rk3562_pmu, 1540 1502 }, 1541 1503 { 1542 1504 .compatible = "rockchip,rk3568-power-controller",
+10
drivers/pmdomain/sunxi/Kconfig
··· 8 8 help 9 9 Say y to enable the PPU power domain driver. This saves power 10 10 when certain peripherals, such as the video engine, are idle. 11 + 12 + config SUN50I_H6_PRCM_PPU 13 + tristate "Allwinner H6 PRCM power domain driver" 14 + depends on ARCH_SUNXI || COMPILE_TEST 15 + depends on PM 16 + select PM_GENERIC_DOMAINS 17 + help 18 + Say y to enable the Allwinner H6/H616 PRCM power domain driver. 19 + This is required to enable the Mali GPU in the H616 SoC, it is 20 + optional for the H6.
+1
drivers/pmdomain/sunxi/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 obj-$(CONFIG_SUN20I_PPU) += sun20i-ppu.o 3 + obj-$(CONFIG_SUN50I_H6_PRCM_PPU) += sun50i-h6-prcm-ppu.o
+208
drivers/pmdomain/sunxi/sun50i-h6-prcm-ppu.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (C) Arm Ltd. 2024 4 + * 5 + * Allwinner H6/H616 PRCM power domain driver. 6 + * This covers a few registers inside the PRCM (Power Reset Clock Management) 7 + * block that control some power rails, most prominently for the Mali GPU. 8 + */ 9 + 10 + #include <linux/bitfield.h> 11 + #include <linux/clk.h> 12 + #include <linux/io.h> 13 + #include <linux/iopoll.h> 14 + #include <linux/module.h> 15 + #include <linux/of.h> 16 + #include <linux/platform_device.h> 17 + #include <linux/pm_domain.h> 18 + #include <linux/reset.h> 19 + 20 + /* 21 + * The PRCM block covers multiple devices, starting with some clocks, 22 + * then followed by the power rails. 23 + * The clocks are covered by a different driver, so this driver's MMIO range 24 + * starts later in the PRCM MMIO frame, not at the beginning of it. 25 + * To keep the register offsets consistent with other PRCM documentation, 26 + * express the registers relative to the beginning of the whole PRCM, and 27 + * subtract the PPU offset this driver is bound to. 28 + */ 29 + #define PD_H6_PPU_OFFSET 0x250 30 + #define PD_H6_VDD_SYS_REG 0x250 31 + #define PD_H616_ANA_VDD_GATE BIT(4) 32 + #define PD_H6_CPUS_VDD_GATE BIT(3) 33 + #define PD_H6_AVCC_VDD_GATE BIT(2) 34 + #define PD_H6_GPU_REG 0x254 35 + #define PD_H6_GPU_GATE BIT(0) 36 + 37 + struct sun50i_h6_ppu_pd { 38 + struct generic_pm_domain genpd; 39 + void __iomem *reg; 40 + u32 gate_mask; 41 + bool negated; 42 + }; 43 + 44 + #define FLAG_PPU_ALWAYS_ON BIT(0) 45 + #define FLAG_PPU_NEGATED BIT(1) 46 + 47 + struct sun50i_h6_ppu_desc { 48 + const char *name; 49 + u32 offset; 50 + u32 mask; 51 + unsigned int flags; 52 + }; 53 + 54 + static const struct sun50i_h6_ppu_desc sun50i_h6_ppus[] = { 55 + { "AVCC", PD_H6_VDD_SYS_REG, PD_H6_AVCC_VDD_GATE }, 56 + { "CPUS", PD_H6_VDD_SYS_REG, PD_H6_CPUS_VDD_GATE }, 57 + { "GPU", PD_H6_GPU_REG, PD_H6_GPU_GATE }, 58 + }; 59 + static const struct sun50i_h6_ppu_desc sun50i_h616_ppus[] = { 60 + { "PLL", PD_H6_VDD_SYS_REG, PD_H6_AVCC_VDD_GATE, 61 + FLAG_PPU_ALWAYS_ON | FLAG_PPU_NEGATED }, 62 + { "ANA", PD_H6_VDD_SYS_REG, PD_H616_ANA_VDD_GATE, FLAG_PPU_ALWAYS_ON }, 63 + { "GPU", PD_H6_GPU_REG, PD_H6_GPU_GATE, FLAG_PPU_NEGATED }, 64 + }; 65 + 66 + struct sun50i_h6_ppu_data { 67 + const struct sun50i_h6_ppu_desc *descs; 68 + int nr_domains; 69 + }; 70 + 71 + static const struct sun50i_h6_ppu_data sun50i_h6_ppu_data = { 72 + .descs = sun50i_h6_ppus, 73 + .nr_domains = ARRAY_SIZE(sun50i_h6_ppus), 74 + }; 75 + 76 + static const struct sun50i_h6_ppu_data sun50i_h616_ppu_data = { 77 + .descs = sun50i_h616_ppus, 78 + .nr_domains = ARRAY_SIZE(sun50i_h616_ppus), 79 + }; 80 + 81 + #define to_sun50i_h6_ppu_pd(_genpd) \ 82 + container_of(_genpd, struct sun50i_h6_ppu_pd, genpd) 83 + 84 + static bool sun50i_h6_ppu_power_status(const struct sun50i_h6_ppu_pd *pd) 85 + { 86 + bool bit = readl(pd->reg) & pd->gate_mask; 87 + 88 + return bit ^ pd->negated; 89 + } 90 + 91 + static int sun50i_h6_ppu_pd_set_power(const struct sun50i_h6_ppu_pd *pd, 92 + bool set_bit) 93 + { 94 + u32 reg = readl(pd->reg); 95 + 96 + if (set_bit) 97 + writel(reg | pd->gate_mask, pd->reg); 98 + else 99 + writel(reg & ~pd->gate_mask, pd->reg); 100 + 101 + return 0; 102 + } 103 + 104 + static int sun50i_h6_ppu_pd_power_on(struct generic_pm_domain *genpd) 105 + { 106 + const struct sun50i_h6_ppu_pd *pd = to_sun50i_h6_ppu_pd(genpd); 107 + 108 + return sun50i_h6_ppu_pd_set_power(pd, !pd->negated); 109 + } 110 + 111 + static int sun50i_h6_ppu_pd_power_off(struct generic_pm_domain *genpd) 112 + { 113 + const struct sun50i_h6_ppu_pd *pd = to_sun50i_h6_ppu_pd(genpd); 114 + 115 + return sun50i_h6_ppu_pd_set_power(pd, pd->negated); 116 + } 117 + 118 + static int sun50i_h6_ppu_probe(struct platform_device *pdev) 119 + { 120 + struct device *dev = &pdev->dev; 121 + struct genpd_onecell_data *ppu; 122 + struct sun50i_h6_ppu_pd *pds; 123 + const struct sun50i_h6_ppu_data *data; 124 + void __iomem *base; 125 + int ret, i; 126 + 127 + data = of_device_get_match_data(dev); 128 + if (!data) 129 + return -EINVAL; 130 + 131 + pds = devm_kcalloc(dev, data->nr_domains, sizeof(*pds), GFP_KERNEL); 132 + if (!pds) 133 + return -ENOMEM; 134 + 135 + ppu = devm_kzalloc(dev, sizeof(*ppu), GFP_KERNEL); 136 + if (!ppu) 137 + return -ENOMEM; 138 + 139 + ppu->num_domains = data->nr_domains; 140 + ppu->domains = devm_kcalloc(dev, data->nr_domains, 141 + sizeof(*ppu->domains), GFP_KERNEL); 142 + if (!ppu->domains) 143 + return -ENOMEM; 144 + 145 + platform_set_drvdata(pdev, ppu); 146 + 147 + base = devm_platform_ioremap_resource(pdev, 0); 148 + if (IS_ERR(base)) 149 + return PTR_ERR(base); 150 + 151 + for (i = 0; i < data->nr_domains; i++) { 152 + struct sun50i_h6_ppu_pd *pd = &pds[i]; 153 + const struct sun50i_h6_ppu_desc *desc = &data->descs[i]; 154 + 155 + pd->genpd.name = desc->name; 156 + pd->genpd.power_off = sun50i_h6_ppu_pd_power_off; 157 + pd->genpd.power_on = sun50i_h6_ppu_pd_power_on; 158 + if (desc->flags & FLAG_PPU_ALWAYS_ON) 159 + pd->genpd.flags = GENPD_FLAG_ALWAYS_ON; 160 + pd->negated = !!(desc->flags & FLAG_PPU_NEGATED); 161 + pd->reg = base + desc->offset - PD_H6_PPU_OFFSET; 162 + pd->gate_mask = desc->mask; 163 + 164 + ret = pm_genpd_init(&pd->genpd, NULL, 165 + !sun50i_h6_ppu_power_status(pd)); 166 + if (ret) { 167 + dev_warn(dev, "Failed to add %s power domain: %d\n", 168 + desc->name, ret); 169 + goto out_remove_pds; 170 + } 171 + ppu->domains[i] = &pd->genpd; 172 + } 173 + 174 + ret = of_genpd_add_provider_onecell(dev->of_node, ppu); 175 + if (!ret) 176 + return 0; 177 + 178 + dev_warn(dev, "Failed to add provider: %d\n", ret); 179 + out_remove_pds: 180 + for (i--; i >= 0; i--) 181 + pm_genpd_remove(&pds[i].genpd); 182 + 183 + return ret; 184 + } 185 + 186 + static const struct of_device_id sun50i_h6_ppu_of_match[] = { 187 + { .compatible = "allwinner,sun50i-h6-prcm-ppu", 188 + .data = &sun50i_h6_ppu_data }, 189 + { .compatible = "allwinner,sun50i-h616-prcm-ppu", 190 + .data = &sun50i_h616_ppu_data }, 191 + { } 192 + }; 193 + MODULE_DEVICE_TABLE(of, sun50i_h6_ppu_of_match); 194 + 195 + static struct platform_driver sun50i_h6_ppu_driver = { 196 + .probe = sun50i_h6_ppu_probe, 197 + .driver = { 198 + .name = "sun50i-h6-prcm-ppu", 199 + .of_match_table = sun50i_h6_ppu_of_match, 200 + /* Power domains cannot be removed while they are in use. */ 201 + .suppress_bind_attrs = true, 202 + }, 203 + }; 204 + module_platform_driver(sun50i_h6_ppu_driver); 205 + 206 + MODULE_AUTHOR("Andre Przywara <andre.przywara@arm.com>"); 207 + MODULE_DESCRIPTION("Allwinner H6 PRCM power domain driver"); 208 + MODULE_LICENSE("GPL");
+6 -2
drivers/pmdomain/ti/omap_prm.c
··· 18 18 #include <linux/pm_domain.h> 19 19 #include <linux/reset-controller.h> 20 20 #include <linux/delay.h> 21 - 21 + #if IS_ENABLED(CONFIG_SUSPEND) 22 + #include <linux/suspend.h> 23 + #endif 22 24 #include <linux/platform_data/ti-prm.h> 23 25 24 26 enum omap_prm_domain_mode { ··· 90 88 #define OMAP_PRM_HAS_RSTST BIT(1) 91 89 #define OMAP_PRM_HAS_NO_CLKDM BIT(2) 92 90 #define OMAP_PRM_RET_WHEN_IDLE BIT(3) 91 + #define OMAP_PRM_ON_WHEN_STANDBY BIT(4) 93 92 94 93 #define OMAP_PRM_HAS_RESETS (OMAP_PRM_HAS_RSTCTRL | OMAP_PRM_HAS_RSTST) 95 94 ··· 407 404 .name = "per", .base = 0x44e00c00, 408 405 .pwrstctrl = 0xc, .pwrstst = 0x8, .dmap = &omap_prm_noinact, 409 406 .rstctrl = 0x0, .rstmap = am3_per_rst_map, 410 - .flags = OMAP_PRM_HAS_RSTCTRL, .clkdm_name = "pruss_ocp" 407 + .flags = OMAP_PRM_HAS_RSTCTRL | OMAP_PRM_ON_WHEN_STANDBY, 408 + .clkdm_name = "pruss_ocp", 411 409 }, 412 410 { 413 411 .name = "wkup", .base = 0x44e00d00,
+35
include/dt-bindings/power/mediatek,mt6893-power.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ 2 + /* 3 + * Copyright (c) 2025 Collabora Ltd 4 + * AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> 5 + */ 6 + 7 + #ifndef _DT_BINDINGS_POWER_MT6893_POWER_H 8 + #define _DT_BINDINGS_POWER_MT6893_POWER_H 9 + 10 + #define MT6893_POWER_DOMAIN_CONN 0 11 + #define MT6893_POWER_DOMAIN_MFG0 1 12 + #define MT6893_POWER_DOMAIN_MFG1 2 13 + #define MT6893_POWER_DOMAIN_MFG2 3 14 + #define MT6893_POWER_DOMAIN_MFG3 4 15 + #define MT6893_POWER_DOMAIN_MFG4 5 16 + #define MT6893_POWER_DOMAIN_MFG5 6 17 + #define MT6893_POWER_DOMAIN_MFG6 7 18 + #define MT6893_POWER_DOMAIN_ISP 8 19 + #define MT6893_POWER_DOMAIN_ISP2 9 20 + #define MT6893_POWER_DOMAIN_IPE 10 21 + #define MT6893_POWER_DOMAIN_VDEC0 11 22 + #define MT6893_POWER_DOMAIN_VDEC1 12 23 + #define MT6893_POWER_DOMAIN_VENC0 13 24 + #define MT6893_POWER_DOMAIN_VENC1 14 25 + #define MT6893_POWER_DOMAIN_MDP 15 26 + #define MT6893_POWER_DOMAIN_DISP 16 27 + #define MT6893_POWER_DOMAIN_AUDIO 17 28 + #define MT6893_POWER_DOMAIN_ADSP 18 29 + #define MT6893_POWER_DOMAIN_CAM 19 30 + #define MT6893_POWER_DOMAIN_CAM_RAWA 20 31 + #define MT6893_POWER_DOMAIN_CAM_RAWB 21 32 + #define MT6893_POWER_DOMAIN_CAM_RAWC 22 33 + #define MT6893_POWER_DOMAIN_DP_TX 23 34 + 35 + #endif /* _DT_BINDINGS_POWER_MT6893_POWER_H */
+35
include/dt-bindings/power/rockchip,rk3562-power.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (c) 2022-2024 Rockchip Electronics Co., Ltd. 4 + */ 5 + #ifndef __DT_BINDINGS_POWER_RK3562_POWER_H__ 6 + #define __DT_BINDINGS_POWER_RK3562_POWER_H__ 7 + 8 + /* VD_CORE */ 9 + #define RK3562_PD_CPU_0 0 10 + #define RK3562_PD_CPU_1 1 11 + #define RK3562_PD_CPU_2 2 12 + #define RK3562_PD_CPU_3 3 13 + #define RK3562_PD_CORE_ALIVE 4 14 + 15 + /* VD_PMU */ 16 + #define RK3562_PD_PMU 5 17 + #define RK3562_PD_PMU_ALIVE 6 18 + 19 + /* VD_NPU */ 20 + #define RK3562_PD_NPU 7 21 + 22 + /* VD_GPU */ 23 + #define RK3562_PD_GPU 8 24 + 25 + /* VD_LOGIC */ 26 + #define RK3562_PD_DDR 9 27 + #define RK3562_PD_VEPU 10 28 + #define RK3562_PD_VDPU 11 29 + #define RK3562_PD_VI 12 30 + #define RK3562_PD_VO 13 31 + #define RK3562_PD_RGA 14 32 + #define RK3562_PD_PHP 15 33 + #define RK3562_PD_LOGIC_ALIVE 16 34 + 35 + #endif
+10
include/linux/pm_domain.h
··· 142 142 bool max_off_time_changed; 143 143 ktime_t next_wakeup; 144 144 ktime_t next_hrtimer; 145 + ktime_t last_enter; 146 + bool reflect_residency; 145 147 bool cached_power_down_ok; 146 148 bool cached_power_down_state_idx; 147 149 }; ··· 155 153 s64 residency_ns; 156 154 u64 usage; 157 155 u64 rejected; 156 + u64 above; 157 + u64 below; 158 158 struct fwnode_handle *fwnode; 159 159 u64 idle_time; 160 160 void *data; ··· 289 285 int pm_genpd_init(struct generic_pm_domain *genpd, 290 286 struct dev_power_governor *gov, bool is_off); 291 287 int pm_genpd_remove(struct generic_pm_domain *genpd); 288 + void pm_genpd_inc_rejected(struct generic_pm_domain *genpd, 289 + unsigned int state_idx); 292 290 struct device *dev_to_genpd_dev(struct device *dev); 293 291 int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state); 294 292 int dev_pm_genpd_add_notifier(struct device *dev, struct notifier_block *nb); ··· 341 335 { 342 336 return -EOPNOTSUPP; 343 337 } 338 + 339 + static inline void pm_genpd_inc_rejected(struct generic_pm_domain *genpd, 340 + unsigned int state_idx) 341 + { } 344 342 345 343 static inline struct device *dev_to_genpd_dev(struct device *dev) 346 344 {