From 911a359de96d5e9d24f50c74a48c6f3cf061539a Mon Sep 17 00:00:00 2001 From: Richard Cochran Date: Wed, 13 Jul 2016 17:16:45 +0000 Subject: leds/trigger/cpu: Convert to hotplug state machine This is a straightforward conversion. We place this callback last in the list so that the LED illuminates only after a successful bring up sequence. ( NOTE: The patch adds a FIXME question about the callback used, this question should probably be revisited later on.) Signed-off-by: Richard Cochran Signed-off-by: Anna-Maria Gleixner Reviewed-by: Sebastian Andrzej Siewior Acked-by: Jacek Anaszewski Cc: Linus Torvalds Cc: Linus Walleij Cc: Paul Gortmaker Cc: Peter Zijlstra Cc: Richard Purdie Cc: Thomas Gleixner Cc: linux-leds@vger.kernel.org Cc: rt@linutronix.de Link: http://lkml.kernel.org/r/20160713153336.465496902@linutronix.de Signed-off-by: Ingo Molnar --- drivers/leds/trigger/ledtrig-cpu.c | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) (limited to 'drivers/leds') diff --git a/drivers/leds/trigger/ledtrig-cpu.c b/drivers/leds/trigger/ledtrig-cpu.c index 938467fb82be..4a6a182d0a88 100644 --- a/drivers/leds/trigger/ledtrig-cpu.c +++ b/drivers/leds/trigger/ledtrig-cpu.c @@ -92,25 +92,17 @@ static struct syscore_ops ledtrig_cpu_syscore_ops = { .resume = ledtrig_cpu_syscore_resume, }; -static int ledtrig_cpu_notify(struct notifier_block *self, - unsigned long action, void *hcpu) +static int ledtrig_starting_cpu(unsigned int cpu) { - switch (action & ~CPU_TASKS_FROZEN) { - case CPU_STARTING: - ledtrig_cpu(CPU_LED_START); - break; - case CPU_DYING: - ledtrig_cpu(CPU_LED_STOP); - break; - } - - return NOTIFY_OK; + ledtrig_cpu(CPU_LED_START); + return 0; } - -static struct notifier_block ledtrig_cpu_nb = { - .notifier_call = ledtrig_cpu_notify, -}; +static int ledtrig_dying_cpu(unsigned int cpu) +{ + ledtrig_cpu(CPU_LED_STOP); + return 0; +} static int __init ledtrig_cpu_init(void) { @@ -133,7 +125,13 @@ static int __init ledtrig_cpu_init(void) } register_syscore_ops(&ledtrig_cpu_syscore_ops); - register_cpu_notifier(&ledtrig_cpu_nb); + + /* + * FIXME: Why needs this to happen in the interrupt disabled + * low level bringup phase of a cpu? + */ + cpuhp_setup_state(CPUHP_AP_LEDTRIG_STARTING, "AP_LEDTRIG_STARTING", + ledtrig_starting_cpu, ledtrig_dying_cpu); pr_info("ledtrig-cpu: registered to indicate activity on CPUs\n"); -- cgit v1.2.3 From cd894f149732a06ba4b2ccdc4cb86edf7ff68620 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Wed, 20 Jul 2016 17:24:55 +0200 Subject: leds/trigger/cpu: Move from CPU_STARTING to ONLINE level There is no need the ledtriger to be called *that* early in the hotplug process (+ with disabled interrupts). As explained by Jacek Anaszewski [0] there is no need for it. Therefore this patch moves it to the ONLINE/PREPARE_DOWN level using the dynamic registration for the id. [0] https://lkml.kernel.org/r/578C92BC.2070603@samsung.com Signed-off-by: Sebastian Andrzej Siewior Acked-by: Jacek Anaszewski Acked-by: Linus Walleij Cc: Peter Zijlstra Cc: Paul Gortmaker Cc: Richard Purdie Cc: rt@linutronix.de Cc: Linus Torvalds Cc: linux-leds@vger.kernel.org Link: http://lkml.kernel.org/r/1469028295-14702-1-git-send-email-bigeasy@linutronix.de Signed-off-by: Thomas Gleixner --- drivers/leds/trigger/ledtrig-cpu.c | 16 ++++++++-------- include/linux/cpuhotplug.h | 1 - 2 files changed, 8 insertions(+), 9 deletions(-) (limited to 'drivers/leds') diff --git a/drivers/leds/trigger/ledtrig-cpu.c b/drivers/leds/trigger/ledtrig-cpu.c index 4a6a182d0a88..22f0634dd3fa 100644 --- a/drivers/leds/trigger/ledtrig-cpu.c +++ b/drivers/leds/trigger/ledtrig-cpu.c @@ -92,13 +92,13 @@ static struct syscore_ops ledtrig_cpu_syscore_ops = { .resume = ledtrig_cpu_syscore_resume, }; -static int ledtrig_starting_cpu(unsigned int cpu) +static int ledtrig_online_cpu(unsigned int cpu) { ledtrig_cpu(CPU_LED_START); return 0; } -static int ledtrig_dying_cpu(unsigned int cpu) +static int ledtrig_prepare_down_cpu(unsigned int cpu) { ledtrig_cpu(CPU_LED_STOP); return 0; @@ -107,6 +107,7 @@ static int ledtrig_dying_cpu(unsigned int cpu) static int __init ledtrig_cpu_init(void) { int cpu; + int ret; /* Supports up to 9999 cpu cores */ BUILD_BUG_ON(CONFIG_NR_CPUS > 9999); @@ -126,12 +127,11 @@ static int __init ledtrig_cpu_init(void) register_syscore_ops(&ledtrig_cpu_syscore_ops); - /* - * FIXME: Why needs this to happen in the interrupt disabled - * low level bringup phase of a cpu? - */ - cpuhp_setup_state(CPUHP_AP_LEDTRIG_STARTING, "AP_LEDTRIG_STARTING", - ledtrig_starting_cpu, ledtrig_dying_cpu); + ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "AP_LEDTRIG_STARTING", + ledtrig_online_cpu, ledtrig_prepare_down_cpu); + if (ret < 0) + pr_err("CPU hotplug notifier for ledtrig-cpu could not be registered: %d\n", + ret); pr_info("ledtrig-cpu: registered to indicate activity on CPUs\n"); diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index 5015f463d314..6d405db6fb12 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -66,7 +66,6 @@ enum cpuhp_state { CPUHP_AP_ARM_CORESIGHT_STARTING, CPUHP_AP_ARM_CORESIGHT4_STARTING, CPUHP_AP_ARM64_ISNDEP_STARTING, - CPUHP_AP_LEDTRIG_STARTING, CPUHP_AP_SMPCFD_DYING, CPUHP_AP_X86_TBOOT_DYING, CPUHP_AP_NOTIFY_STARTING, -- cgit v1.2.3