@@ -41,10 +41,49 @@ static void run_cpu(void *unused)
pm_runtime_get_noresume(cpu_dev);
}
+static int cpu_online_notifier(struct notifier_block *n,
+ unsigned long action, void *hcpu)
+{
+ int cpu = (unsigned long)hcpu;
+ struct device *dev = get_cpu_device(cpu);
+
+ switch (action) {
+ case CPU_STARTING:
+ case CPU_STARTING_FROZEN:
+ /*
+ * Attach the cpu to its domain if the cpu is coming up
+ * for the first time.
+ * Called from the cpu that is coming up.
+ */
+ pm_runtime_set_active(dev);
+ pm_runtime_get_noresume(dev);
+ break;
+
+ default:
+ return NOTIFY_DONE;
+ }
+
+ return NOTIFY_OK;
+}
+
+static struct notifier_block hotplug_notifier = {
+ .notifier_call = cpu_online_notifier,
+};
+
static int arm_domain_cpu_init(void)
{
int cpuid, ret = 0;
+ /*
+ * Register for hotplug notifier, because not all CPUs
+ * may be online at this time. Also, hotplug entry path is not
+ * the same as warm boot. So the reference counting would have
+ * to be adjusted here accordingly.
+ * Register early, incase, a core comes online,
+ * while we are executing this.
+ */
+ register_cpu_notifier(&hotplug_notifier);
+
/* Find any CPU nodes with a phandle to this power domain */
for_each_possible_cpu(cpuid) {
struct device *cpu_dev;
Ensure that the CPU device usage count is incremented for a CPU that just came online. CPUs coming online do not follow the same code path as CPUs warm booting back to CPUIdle. Register for hotplug notifier and ensure the reference count is incremented correctly. Signed-off-by: Lina Iyer <lina.iyer@linaro.org> --- arch/arm/kernel/domains.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+)