* [PATCH v2] leds/trigger/cpu: Add LED trigger for all CPUs aggregated
@ 2017-02-09 23:07 Paulo Costa
2017-02-10 21:25 ` Pavel Machek
2017-02-12 20:45 ` Jacek Anaszewski
0 siblings, 2 replies; 4+ messages in thread
From: Paulo Costa @ 2017-02-09 23:07 UTC (permalink / raw)
To: linux-leds, Pavel Machek, Richard Purdie; +Cc: Paulo Costa
Currently there is one CPU led trigger per cpu ('cpu0', 'cpu1', ...)
This patch adds a new trigger, 'cpu', with brightness proportional to
the number of active CPUs.
If multiple brightness levels aren't supported on the LED,
it effectively indicates if there is any CPU active.
This is particularly useful on tiny linux boards with more CPU cores than LED pins.
Signed-off-by: Paulo Costa <me@paulo.costa.nom.br>
CC: Pavel Machek <pavel@ucw.cz>
---
v2:
* Fix concurrency issues during initialization
* Round up the division
---
drivers/leds/trigger/ledtrig-cpu.c | 33 +++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
diff --git a/drivers/leds/trigger/ledtrig-cpu.c b/drivers/leds/trigger/ledtrig-cpu.c
index 22f0634..06ec733 100644
--- a/drivers/leds/trigger/ledtrig-cpu.c
+++ b/drivers/leds/trigger/ledtrig-cpu.c
@@ -31,12 +31,16 @@
#define MAX_NAME_LEN 8
struct led_trigger_cpu {
+ bool is_active;
char name[MAX_NAME_LEN];
struct led_trigger *_trig;
};
static DEFINE_PER_CPU(struct led_trigger_cpu, cpu_trig);
+static struct led_trigger *trig_cpu_all;
+static atomic_t num_active_cpus = ATOMIC_INIT(0);
+
/**
* ledtrig_cpu - emit a CPU event as a trigger
* @evt: CPU event to be emitted
@@ -47,26 +51,46 @@ static DEFINE_PER_CPU(struct led_trigger_cpu, cpu_trig);
void ledtrig_cpu(enum cpu_led_event ledevt)
{
struct led_trigger_cpu *trig = this_cpu_ptr(&cpu_trig);
+ bool is_active = trig->is_active;
/* Locate the correct CPU LED */
switch (ledevt) {
case CPU_LED_IDLE_END:
case CPU_LED_START:
/* Will turn the LED on, max brightness */
- led_trigger_event(trig->_trig, LED_FULL);
+ is_active = true;
break;
case CPU_LED_IDLE_START:
case CPU_LED_STOP:
case CPU_LED_HALTED:
/* Will turn the LED off */
- led_trigger_event(trig->_trig, LED_OFF);
+ is_active = false;
break;
default:
/* Will leave the LED as it is */
break;
}
+
+ if (is_active != trig->is_active) {
+ unsigned int active_cpus;
+ unsigned int total_cpus;
+
+ /* Update trigger state */
+ trig->is_active = is_active;
+ atomic_add(is_active ? 1 : -1, &num_active_cpus);
+ active_cpus = atomic_read(&num_active_cpus);
+ total_cpus = num_present_cpus();
+
+ led_trigger_event(trig->_trig,
+ is_active ? LED_FULL : LED_OFF);
+
+
+ led_trigger_event(trig_cpu_all,
+ DIV_ROUND_UP(LED_FULL * active_cpus, total_cpus));
+
+ }
}
EXPORT_SYMBOL(ledtrig_cpu);
@@ -113,6 +137,11 @@ static int __init ledtrig_cpu_init(void)
BUILD_BUG_ON(CONFIG_NR_CPUS > 9999);
/*
+ * Registering a trigger for all CPUs.
+ */
+ led_trigger_register_simple("cpu", &trig_cpu_all);
+
+ /*
* Registering CPU led trigger for each CPU core here
* ignores CPU hotplug, but after this CPU hotplug works
* fine with this trigger.
--
2.9.3
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v2] leds/trigger/cpu: Add LED trigger for all CPUs aggregated
2017-02-09 23:07 [PATCH v2] leds/trigger/cpu: Add LED trigger for all CPUs aggregated Paulo Costa
@ 2017-02-10 21:25 ` Pavel Machek
2017-02-12 20:45 ` Jacek Anaszewski
1 sibling, 0 replies; 4+ messages in thread
From: Pavel Machek @ 2017-02-10 21:25 UTC (permalink / raw)
To: Paulo Costa; +Cc: linux-leds, Richard Purdie
[-- Attachment #1: Type: text/plain, Size: 680 bytes --]
On Thu 2017-02-09 21:07:35, Paulo Costa wrote:
> Currently there is one CPU led trigger per cpu ('cpu0', 'cpu1', ...)
>
> This patch adds a new trigger, 'cpu', with brightness proportional to
> the number of active CPUs.
>
> If multiple brightness levels aren't supported on the LED,
> it effectively indicates if there is any CPU active.
>
> This is particularly useful on tiny linux boards with more CPU cores than LED pins.
>
> Signed-off-by: Paulo Costa <me@paulo.costa.nom.br>
Acked-by: Pavel Machek <pavel@ucw.cz>
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH v2] leds/trigger/cpu: Add LED trigger for all CPUs aggregated
2017-02-09 23:07 [PATCH v2] leds/trigger/cpu: Add LED trigger for all CPUs aggregated Paulo Costa
2017-02-10 21:25 ` Pavel Machek
@ 2017-02-12 20:45 ` Jacek Anaszewski
2017-02-13 0:49 ` Paulo Costa
1 sibling, 1 reply; 4+ messages in thread
From: Jacek Anaszewski @ 2017-02-12 20:45 UTC (permalink / raw)
To: Paulo Costa, linux-leds, Pavel Machek, Richard Purdie
Hi Paulo,
Thanks for the patch,
Pavel - thanks for the review.
Patch applied to the for-4.12 branch of linux-leds.git.
Best regards,
Jacek Anaszewski
On 02/10/2017 12:07 AM, Paulo Costa wrote:
> Currently there is one CPU led trigger per cpu ('cpu0', 'cpu1', ...)
>
> This patch adds a new trigger, 'cpu', with brightness proportional to
> the number of active CPUs.
>
> If multiple brightness levels aren't supported on the LED,
> it effectively indicates if there is any CPU active.
>
> This is particularly useful on tiny linux boards with more CPU cores than LED pins.
>
> Signed-off-by: Paulo Costa <me@paulo.costa.nom.br>
> CC: Pavel Machek <pavel@ucw.cz>
> ---
> v2:
> * Fix concurrency issues during initialization
> * Round up the division
> ---
> drivers/leds/trigger/ledtrig-cpu.c | 33 +++++++++++++++++++++++++++++++--
> 1 file changed, 31 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/leds/trigger/ledtrig-cpu.c b/drivers/leds/trigger/ledtrig-cpu.c
> index 22f0634..06ec733 100644
> --- a/drivers/leds/trigger/ledtrig-cpu.c
> +++ b/drivers/leds/trigger/ledtrig-cpu.c
> @@ -31,12 +31,16 @@
> #define MAX_NAME_LEN 8
>
> struct led_trigger_cpu {
> + bool is_active;
> char name[MAX_NAME_LEN];
> struct led_trigger *_trig;
> };
>
> static DEFINE_PER_CPU(struct led_trigger_cpu, cpu_trig);
>
> +static struct led_trigger *trig_cpu_all;
> +static atomic_t num_active_cpus = ATOMIC_INIT(0);
> +
> /**
> * ledtrig_cpu - emit a CPU event as a trigger
> * @evt: CPU event to be emitted
> @@ -47,26 +51,46 @@ static DEFINE_PER_CPU(struct led_trigger_cpu, cpu_trig);
> void ledtrig_cpu(enum cpu_led_event ledevt)
> {
> struct led_trigger_cpu *trig = this_cpu_ptr(&cpu_trig);
> + bool is_active = trig->is_active;
>
> /* Locate the correct CPU LED */
> switch (ledevt) {
> case CPU_LED_IDLE_END:
> case CPU_LED_START:
> /* Will turn the LED on, max brightness */
> - led_trigger_event(trig->_trig, LED_FULL);
> + is_active = true;
> break;
>
> case CPU_LED_IDLE_START:
> case CPU_LED_STOP:
> case CPU_LED_HALTED:
> /* Will turn the LED off */
> - led_trigger_event(trig->_trig, LED_OFF);
> + is_active = false;
> break;
>
> default:
> /* Will leave the LED as it is */
> break;
> }
> +
> + if (is_active != trig->is_active) {
> + unsigned int active_cpus;
> + unsigned int total_cpus;
> +
> + /* Update trigger state */
> + trig->is_active = is_active;
> + atomic_add(is_active ? 1 : -1, &num_active_cpus);
> + active_cpus = atomic_read(&num_active_cpus);
> + total_cpus = num_present_cpus();
> +
> + led_trigger_event(trig->_trig,
> + is_active ? LED_FULL : LED_OFF);
> +
> +
> + led_trigger_event(trig_cpu_all,
> + DIV_ROUND_UP(LED_FULL * active_cpus, total_cpus));
> +
> + }
> }
> EXPORT_SYMBOL(ledtrig_cpu);
>
> @@ -113,6 +137,11 @@ static int __init ledtrig_cpu_init(void)
> BUILD_BUG_ON(CONFIG_NR_CPUS > 9999);
>
> /*
> + * Registering a trigger for all CPUs.
> + */
> + led_trigger_register_simple("cpu", &trig_cpu_all);
> +
> + /*
> * Registering CPU led trigger for each CPU core here
> * ignores CPU hotplug, but after this CPU hotplug works
> * fine with this trigger.
>
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH v2] leds/trigger/cpu: Add LED trigger for all CPUs aggregated
2017-02-12 20:45 ` Jacek Anaszewski
@ 2017-02-13 0:49 ` Paulo Costa
0 siblings, 0 replies; 4+ messages in thread
From: Paulo Costa @ 2017-02-13 0:49 UTC (permalink / raw)
To: Jacek Anaszewski; +Cc: linux-leds, Pavel Machek, Richard Purdie
Thank you, Pavel and Jacek
2017-02-12 18:45 GMT-02:00 Jacek Anaszewski <jacek.anaszewski@gmail.com>:
> Hi Paulo,
>
> Thanks for the patch,
> Pavel - thanks for the review.
>
> Patch applied to the for-4.12 branch of linux-leds.git.
>
> Best regards,
> Jacek Anaszewski
>
> On 02/10/2017 12:07 AM, Paulo Costa wrote:
>> Currently there is one CPU led trigger per cpu ('cpu0', 'cpu1', ...)
>>
>> This patch adds a new trigger, 'cpu', with brightness proportional to
>> the number of active CPUs.
>>
>> If multiple brightness levels aren't supported on the LED,
>> it effectively indicates if there is any CPU active.
>>
>> This is particularly useful on tiny linux boards with more CPU cores than LED pins.
>>
>> Signed-off-by: Paulo Costa <me@paulo.costa.nom.br>
>> CC: Pavel Machek <pavel@ucw.cz>
>> ---
>> v2:
>> * Fix concurrency issues during initialization
>> * Round up the division
>> ---
>> drivers/leds/trigger/ledtrig-cpu.c | 33 +++++++++++++++++++++++++++++++--
>> 1 file changed, 31 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/leds/trigger/ledtrig-cpu.c b/drivers/leds/trigger/ledtrig-cpu.c
>> index 22f0634..06ec733 100644
>> --- a/drivers/leds/trigger/ledtrig-cpu.c
>> +++ b/drivers/leds/trigger/ledtrig-cpu.c
>> @@ -31,12 +31,16 @@
>> #define MAX_NAME_LEN 8
>>
>> struct led_trigger_cpu {
>> + bool is_active;
>> char name[MAX_NAME_LEN];
>> struct led_trigger *_trig;
>> };
>>
>> static DEFINE_PER_CPU(struct led_trigger_cpu, cpu_trig);
>>
>> +static struct led_trigger *trig_cpu_all;
>> +static atomic_t num_active_cpus = ATOMIC_INIT(0);
>> +
>> /**
>> * ledtrig_cpu - emit a CPU event as a trigger
>> * @evt: CPU event to be emitted
>> @@ -47,26 +51,46 @@ static DEFINE_PER_CPU(struct led_trigger_cpu, cpu_trig);
>> void ledtrig_cpu(enum cpu_led_event ledevt)
>> {
>> struct led_trigger_cpu *trig = this_cpu_ptr(&cpu_trig);
>> + bool is_active = trig->is_active;
>>
>> /* Locate the correct CPU LED */
>> switch (ledevt) {
>> case CPU_LED_IDLE_END:
>> case CPU_LED_START:
>> /* Will turn the LED on, max brightness */
>> - led_trigger_event(trig->_trig, LED_FULL);
>> + is_active = true;
>> break;
>>
>> case CPU_LED_IDLE_START:
>> case CPU_LED_STOP:
>> case CPU_LED_HALTED:
>> /* Will turn the LED off */
>> - led_trigger_event(trig->_trig, LED_OFF);
>> + is_active = false;
>> break;
>>
>> default:
>> /* Will leave the LED as it is */
>> break;
>> }
>> +
>> + if (is_active != trig->is_active) {
>> + unsigned int active_cpus;
>> + unsigned int total_cpus;
>> +
>> + /* Update trigger state */
>> + trig->is_active = is_active;
>> + atomic_add(is_active ? 1 : -1, &num_active_cpus);
>> + active_cpus = atomic_read(&num_active_cpus);
>> + total_cpus = num_present_cpus();
>> +
>> + led_trigger_event(trig->_trig,
>> + is_active ? LED_FULL : LED_OFF);
>> +
>> +
>> + led_trigger_event(trig_cpu_all,
>> + DIV_ROUND_UP(LED_FULL * active_cpus, total_cpus));
>> +
>> + }
>> }
>> EXPORT_SYMBOL(ledtrig_cpu);
>>
>> @@ -113,6 +137,11 @@ static int __init ledtrig_cpu_init(void)
>> BUILD_BUG_ON(CONFIG_NR_CPUS > 9999);
>>
>> /*
>> + * Registering a trigger for all CPUs.
>> + */
>> + led_trigger_register_simple("cpu", &trig_cpu_all);
>> +
>> + /*
>> * Registering CPU led trigger for each CPU core here
>> * ignores CPU hotplug, but after this CPU hotplug works
>> * fine with this trigger.
>>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-02-13 0:49 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-09 23:07 [PATCH v2] leds/trigger/cpu: Add LED trigger for all CPUs aggregated Paulo Costa
2017-02-10 21:25 ` Pavel Machek
2017-02-12 20:45 ` Jacek Anaszewski
2017-02-13 0:49 ` Paulo Costa
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox