static DEFINE_PER_CPU_READ_MOSTLY(struct psci_cpuidle_data, psci_cpuidle_data);
 static DEFINE_PER_CPU(struct psci_cpuidle_domain_state, psci_domain_state);
 static bool psci_cpuidle_use_syscore;
-static bool psci_cpuidle_use_cpuhp;
 
 void psci_set_domain_state(struct generic_pm_domain *pd, unsigned int state_idx,
                           u32 state)
 {
        struct device *pd_dev = __this_cpu_read(psci_cpuidle_data.dev);
 
-       if (pd_dev)
-               pm_runtime_get_sync(pd_dev);
+       if (pd_dev) {
+               if (!IS_ENABLED(CONFIG_PREEMPT_RT))
+                       pm_runtime_get_sync(pd_dev);
+               else
+                       dev_pm_genpd_resume(pd_dev);
+       }
 
        return 0;
 }
        struct device *pd_dev = __this_cpu_read(psci_cpuidle_data.dev);
 
        if (pd_dev) {
-               pm_runtime_put_sync(pd_dev);
+               if (!IS_ENABLED(CONFIG_PREEMPT_RT))
+                       pm_runtime_put_sync(pd_dev);
+               else
+                       dev_pm_genpd_suspend(pd_dev);
+
                /* Clear domain state to start fresh at next online. */
                psci_clear_domain_state();
        }
 {
        int err;
 
-       if (!psci_cpuidle_use_cpuhp)
-               return;
-
        err = cpuhp_setup_state_nocalls(CPUHP_AP_CPU_PM_STARTING,
                                        "cpuidle/psci:online",
                                        psci_idle_cpuhp_up,
         * s2ram and s2idle.
         */
        drv->states[state_count - 1].enter_s2idle = psci_enter_s2idle_domain_idle_state;
-       if (!IS_ENABLED(CONFIG_PREEMPT_RT)) {
+       if (!IS_ENABLED(CONFIG_PREEMPT_RT))
                drv->states[state_count - 1].enter = psci_enter_domain_idle_state;
-               psci_cpuidle_use_cpuhp = true;
-       }
 
        return 0;
 }
 
        dt_idle_detach_cpu(data->dev);
        psci_cpuidle_use_syscore = false;
-       psci_cpuidle_use_cpuhp = false;
 }
 
 static int psci_idle_init_cpu(struct device *dev, int cpu)