all_cpu_data[cpunum] = cpu;
 
-               cpu->epp_default = -EINVAL;
-               cpu->epp_powersave = -EINVAL;
-       }
+               cpu->cpu = cpunum;
 
-       cpu = all_cpu_data[cpunum];
+               cpu->epp_default = -EINVAL;
 
-       cpu->cpu = cpunum;
+               if (hwp_active) {
+                       const struct x86_cpu_id *id;
 
-       if (hwp_active) {
-               const struct x86_cpu_id *id;
+                       intel_pstate_hwp_enable(cpu);
 
-               intel_pstate_hwp_enable(cpu);
-               cpu->epp_policy = 0;
-
-               id = x86_match_cpu(intel_pstate_hwp_boost_ids);
-               if (id && intel_pstate_acpi_pm_profile_server())
-                       hwp_boost = true;
+                       id = x86_match_cpu(intel_pstate_hwp_boost_ids);
+                       if (id && intel_pstate_acpi_pm_profile_server())
+                               hwp_boost = true;
+               }
+       } else if (hwp_active) {
+               /*
+                * Re-enable HWP in case this happens after a resume from ACPI
+                * S3 if the CPU was offline during the whole system/resume
+                * cycle.
+                */
+               intel_pstate_hwp_reenable(cpu);
        }
 
+       cpu->epp_powersave = -EINVAL;
+       cpu->epp_policy = 0;
+
        intel_pstate_get_cpu_pstates(cpu);
 
        pr_debug("controlling: cpu %d\n", cpunum);
        }
        put_online_cpus();
 
-       if (intel_pstate_driver == &intel_pstate)
-               intel_pstate_sysfs_hide_hwp_dynamic_boost();
-
        intel_pstate_driver = NULL;
 }
 
        return 0;
 }
 
-static int intel_pstate_unregister_driver(void)
-{
-       cpufreq_unregister_driver(intel_pstate_driver);
-       intel_pstate_driver_cleanup();
-
-       return 0;
-}
-
 static ssize_t intel_pstate_show_status(char *buf)
 {
        if (!intel_pstate_driver)
 
 static int intel_pstate_update_status(const char *buf, size_t size)
 {
-       int ret;
-
        if (size == 3 && !strncmp(buf, "off", size)) {
                if (!intel_pstate_driver)
                        return -EINVAL;
                if (hwp_active)
                        return -EBUSY;
 
-               return intel_pstate_unregister_driver();
+               cpufreq_unregister_driver(intel_pstate_driver);
+               intel_pstate_driver_cleanup();
        }
 
        if (size == 6 && !strncmp(buf, "active", size)) {
                        if (intel_pstate_driver == &intel_pstate)
                                return 0;
 
-                       ret = intel_pstate_unregister_driver();
-                       if (ret)
-                               return ret;
+                       cpufreq_unregister_driver(intel_pstate_driver);
                }
 
                return intel_pstate_register_driver(&intel_pstate);
                        if (intel_pstate_driver == &intel_cpufreq)
                                return 0;
 
-                       ret = intel_pstate_unregister_driver();
-                       if (ret)
-                               return ret;
+                       cpufreq_unregister_driver(intel_pstate_driver);
+                       intel_pstate_sysfs_hide_hwp_dynamic_boost();
                }
 
                return intel_pstate_register_driver(&intel_cpufreq);