Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1370867 > unrolled thread
| Started by | Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> |
|---|---|
| First post | 2016-04-04 22:30 +0200 |
| Last post | 2016-04-06 08:20 +0200 |
| Articles | 6 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH 0/5] Extend the LED panic trigger Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> - 2016-04-04 22:30 +0200
[PATCH 5/5] leds: gpio: Support the panic-blink firmware property Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> - 2016-04-04 22:30 +0200
[PATCH 2/5] leds: triggers: Add a led_trigger_event_nosleep API Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> - 2016-04-04 22:30 +0200
Re: [PATCH 2/5] leds: triggers: Add a led_trigger_event_nosleep API Jacek Anaszewski <jacek.anaszewski@gmail.com> - 2016-04-05 23:40 +0200
Re: [PATCH 2/5] leds: triggers: Add a led_trigger_event_nosleep API Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> - 2016-04-06 06:40 +0200
Re: [PATCH 2/5] leds: triggers: Add a led_trigger_event_nosleep API Jacek Anaszewski <jacek.anaszewski@gmail.com> - 2016-04-06 08:20 +0200
| From | Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> |
|---|---|
| Date | 2016-04-04 22:30 +0200 |
| Subject | [PATCH 0/5] Extend the LED panic trigger |
| Message-ID | <rkjih-dT-7@gated-at.bofh.it> |
As per commit 916fe61995 ("leds: trigger: Introduce a kernel panic LED
trigger"), the kernel now supports a new LED trigger to hook on
the panic blink.
However, the only way of using this is to dedicate a LED device
to this function.
To overcome this limitation, the present series introduces the
capability to switch the LED trigger of certain LED devices upon
a kernel panic (using the panic notifier).
The decision of which LEDs should be switched to the panic trigger
is left to each LED device driver. As an example, a devicetree
boolean property is introduced and used in the leds-gpio driver.
Feedback and other ideas on how to implement this are most welcomed.
Ezequiel Garcia (5):
leds: triggers: Allow to switch the trigger to "panic" on a kernel
panic
leds: triggers: Add a led_trigger_event_nosleep API
leds: trigger: panic: Use led_trigger_event_nosleep
devicetree: leds: Introduce "panic-blink" optional property
leds: gpio: Support the panic-blink firmware property
Documentation/devicetree/bindings/leds/common.txt | 2 +
drivers/leds/led-triggers.c | 78 +++++++++++++++++++++--
drivers/leds/leds-gpio.c | 4 ++
drivers/leds/trigger/ledtrig-panic.c | 2 +-
include/linux/leds.h | 6 ++
5 files changed, 87 insertions(+), 5 deletions(-)
--
2.7.0
[toc] | [next] | [standalone]
| From | Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> |
|---|---|
| Date | 2016-04-04 22:30 +0200 |
| Subject | [PATCH 5/5] leds: gpio: Support the panic-blink firmware property |
| Message-ID | <rkjik-dT-37@gated-at.bofh.it> |
| In reply to | #1370867 |
GPIO LEDs are relatively cheap, and so are ideal to blink on
a kernel panic. This commit adds support for the new "panic-blink"
firmware property, allowing to mark a given LED to blink on
a kernel panic.
Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
---
drivers/leds/leds-gpio.c | 4 ++++
include/linux/leds.h | 1 +
2 files changed, 5 insertions(+)
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c
index 61143f55597e..74e35dcaf874 100644
--- a/drivers/leds/leds-gpio.c
+++ b/drivers/leds/leds-gpio.c
@@ -127,6 +127,8 @@ static int create_gpio_led(const struct gpio_led *template,
led_dat->cdev.brightness = state ? LED_FULL : LED_OFF;
if (!template->retain_state_suspended)
led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
+ if (template->panic_blink)
+ led_dat->cdev.flags |= LED_BLINK_AT_PANIC;
ret = gpiod_direction_output(led_dat->gpiod, state);
if (ret < 0)
@@ -200,6 +202,8 @@ static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
if (fwnode_property_present(child, "retain-state-suspended"))
led.retain_state_suspended = 1;
+ if (fwnode_property_present(child, "panic-blink"))
+ led.panic_blink = 1;
ret = create_gpio_led(&led, &priv->leds[priv->num_leds],
dev, NULL);
diff --git a/include/linux/leds.h b/include/linux/leds.h
index d33b230ce66d..e8e99cc5f99e 100644
--- a/include/linux/leds.h
+++ b/include/linux/leds.h
@@ -363,6 +363,7 @@ struct gpio_led {
unsigned gpio;
unsigned active_low : 1;
unsigned retain_state_suspended : 1;
+ unsigned panic_blink : 1;
unsigned default_state : 2;
/* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */
struct gpio_desc *gpiod;
--
2.7.0
[toc] | [prev] | [next] | [standalone]
| From | Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> |
|---|---|
| Date | 2016-04-04 22:30 +0200 |
| Subject | [PATCH 2/5] leds: triggers: Add a led_trigger_event_nosleep API |
| Message-ID | <rkjik-dT-53@gated-at.bofh.it> |
| In reply to | #1370867 |
Now that we can mark any LED (even those in use by delayed blink
triggers) to trigger on a kernel panic, let's introduce a nosleep
led_trigger_event API.
This API is needed to skip the delayed blink path on
led_trigger_event. LEDs that are switched on a kernel panic,
might be in use by a delayed blink trigger.
This will be used by the panic LED trigger.
Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
---
drivers/leds/led-triggers.c | 26 ++++++++++++++++++++++----
include/linux/leds.h | 4 ++++
2 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
index f5c9d7c4d181..00b9d8497777 100644
--- a/drivers/leds/led-triggers.c
+++ b/drivers/leds/led-triggers.c
@@ -307,8 +307,9 @@ EXPORT_SYMBOL_GPL(devm_led_trigger_register);
/* Simple LED Tigger Interface */
-void led_trigger_event(struct led_trigger *trig,
- enum led_brightness brightness)
+static void do_led_trigger_event(struct led_trigger *trig,
+ enum led_brightness brightness,
+ bool nosleep)
{
struct led_classdev *led_cdev;
@@ -316,12 +317,29 @@ void led_trigger_event(struct led_trigger *trig,
return;
read_lock(&trig->leddev_list_lock);
- list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list)
- led_set_brightness(led_cdev, brightness);
+ list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list) {
+ if (nosleep)
+ led_set_brightness_nosleep(led_cdev, brightness);
+ else
+ led_set_brightness(led_cdev, brightness);
+ }
read_unlock(&trig->leddev_list_lock);
}
+
+void led_trigger_event(struct led_trigger *trig,
+ enum led_brightness brightness)
+{
+ do_led_trigger_event(trig, brightness, false);
+}
EXPORT_SYMBOL_GPL(led_trigger_event);
+void led_trigger_event_nosleep(struct led_trigger *trig,
+ enum led_brightness brightness)
+{
+ do_led_trigger_event(trig, brightness, true);
+}
+EXPORT_SYMBOL_GPL(led_trigger_event_nosleep);
+
static void led_trigger_blink_setup(struct led_trigger *trig,
unsigned long *delay_on,
unsigned long *delay_off,
diff --git a/include/linux/leds.h b/include/linux/leds.h
index 7f1428bb1e69..d33b230ce66d 100644
--- a/include/linux/leds.h
+++ b/include/linux/leds.h
@@ -259,6 +259,8 @@ extern void led_trigger_register_simple(const char *name,
extern void led_trigger_unregister_simple(struct led_trigger *trigger);
extern void led_trigger_event(struct led_trigger *trigger,
enum led_brightness event);
+extern void led_trigger_event_nosleep(struct led_trigger *trigger,
+ enum led_brightness event);
extern void led_trigger_blink(struct led_trigger *trigger,
unsigned long *delay_on,
unsigned long *delay_off);
@@ -305,6 +307,8 @@ static inline void led_trigger_register_simple(const char *name,
static inline void led_trigger_unregister_simple(struct led_trigger *trigger) {}
static inline void led_trigger_event(struct led_trigger *trigger,
enum led_brightness event) {}
+static inline void led_trigger_event_nosleep(struct led_trigger *trigger,
+ enum led_brightness event) {}
static inline void led_trigger_blink(struct led_trigger *trigger,
unsigned long *delay_on,
unsigned long *delay_off) {}
--
2.7.0
[toc] | [prev] | [next] | [standalone]
| From | Jacek Anaszewski <jacek.anaszewski@gmail.com> |
|---|---|
| Date | 2016-04-05 23:40 +0200 |
| Subject | Re: [PATCH 2/5] leds: triggers: Add a led_trigger_event_nosleep API |
| Message-ID | <rkGRB-1Og-37@gated-at.bofh.it> |
| In reply to | #1370877 |
Hi Ezequiel,
On 04/04/2016 10:22 PM, Ezequiel Garcia wrote:
> Now that we can mark any LED (even those in use by delayed blink
> triggers) to trigger on a kernel panic, let's introduce a nosleep
> led_trigger_event API.
>
> This API is needed to skip the delayed blink path on
> led_trigger_event. LEDs that are switched on a kernel panic,
> might be in use by a delayed blink trigger.
>
> This will be used by the panic LED trigger.
>
> Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
> ---
> drivers/leds/led-triggers.c | 26 ++++++++++++++++++++++----
> include/linux/leds.h | 4 ++++
> 2 files changed, 26 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
> index f5c9d7c4d181..00b9d8497777 100644
> --- a/drivers/leds/led-triggers.c
> +++ b/drivers/leds/led-triggers.c
> @@ -307,8 +307,9 @@ EXPORT_SYMBOL_GPL(devm_led_trigger_register);
>
> /* Simple LED Tigger Interface */
>
> -void led_trigger_event(struct led_trigger *trig,
> - enum led_brightness brightness)
> +static void do_led_trigger_event(struct led_trigger *trig,
> + enum led_brightness brightness,
> + bool nosleep)
> {
> struct led_classdev *led_cdev;
>
> @@ -316,12 +317,29 @@ void led_trigger_event(struct led_trigger *trig,
> return;
>
> read_lock(&trig->leddev_list_lock);
> - list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list)
> - led_set_brightness(led_cdev, brightness);
led_set_brightness() can gently disable blinking if passed 0 in the
brightness argument. IMHO this patch is not needed then.
> + list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list) {
> + if (nosleep)
> + led_set_brightness_nosleep(led_cdev, brightness);
> + else
> + led_set_brightness(led_cdev, brightness);
> + }
> read_unlock(&trig->leddev_list_lock);
> }
> +
> +void led_trigger_event(struct led_trigger *trig,
> + enum led_brightness brightness)
> +{
> + do_led_trigger_event(trig, brightness, false);
> +}
> EXPORT_SYMBOL_GPL(led_trigger_event);
>
> +void led_trigger_event_nosleep(struct led_trigger *trig,
> + enum led_brightness brightness)
> +{
> + do_led_trigger_event(trig, brightness, true);
> +}
> +EXPORT_SYMBOL_GPL(led_trigger_event_nosleep);
> +
> static void led_trigger_blink_setup(struct led_trigger *trig,
> unsigned long *delay_on,
> unsigned long *delay_off,
> diff --git a/include/linux/leds.h b/include/linux/leds.h
> index 7f1428bb1e69..d33b230ce66d 100644
> --- a/include/linux/leds.h
> +++ b/include/linux/leds.h
> @@ -259,6 +259,8 @@ extern void led_trigger_register_simple(const char *name,
> extern void led_trigger_unregister_simple(struct led_trigger *trigger);
> extern void led_trigger_event(struct led_trigger *trigger,
> enum led_brightness event);
> +extern void led_trigger_event_nosleep(struct led_trigger *trigger,
> + enum led_brightness event);
> extern void led_trigger_blink(struct led_trigger *trigger,
> unsigned long *delay_on,
> unsigned long *delay_off);
> @@ -305,6 +307,8 @@ static inline void led_trigger_register_simple(const char *name,
> static inline void led_trigger_unregister_simple(struct led_trigger *trigger) {}
> static inline void led_trigger_event(struct led_trigger *trigger,
> enum led_brightness event) {}
> +static inline void led_trigger_event_nosleep(struct led_trigger *trigger,
> + enum led_brightness event) {}
> static inline void led_trigger_blink(struct led_trigger *trigger,
> unsigned long *delay_on,
> unsigned long *delay_off) {}
>
--
Best regards,
Jacek Anaszewski
[toc] | [prev] | [next] | [standalone]
| From | Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> |
|---|---|
| Date | 2016-04-06 06:40 +0200 |
| Subject | Re: [PATCH 2/5] leds: triggers: Add a led_trigger_event_nosleep API |
| Message-ID | <rkNq1-6TB-3@gated-at.bofh.it> |
| In reply to | #1371976 |
On 5 April 2016 at 18:36, Jacek Anaszewski <jacek.anaszewski@gmail.com> wrote:
> Hi Ezequiel,
>
>
> On 04/04/2016 10:22 PM, Ezequiel Garcia wrote:
>>
>> Now that we can mark any LED (even those in use by delayed blink
>> triggers) to trigger on a kernel panic, let's introduce a nosleep
>> led_trigger_event API.
>>
>> This API is needed to skip the delayed blink path on
>> led_trigger_event. LEDs that are switched on a kernel panic,
>> might be in use by a delayed blink trigger.
>>
>> This will be used by the panic LED trigger.
>>
>> Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
>> ---
>> drivers/leds/led-triggers.c | 26 ++++++++++++++++++++++----
>> include/linux/leds.h | 4 ++++
>> 2 files changed, 26 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
>> index f5c9d7c4d181..00b9d8497777 100644
>> --- a/drivers/leds/led-triggers.c
>> +++ b/drivers/leds/led-triggers.c
>> @@ -307,8 +307,9 @@ EXPORT_SYMBOL_GPL(devm_led_trigger_register);
>>
>> /* Simple LED Tigger Interface */
>>
>> -void led_trigger_event(struct led_trigger *trig,
>> - enum led_brightness brightness)
>> +static void do_led_trigger_event(struct led_trigger *trig,
>> + enum led_brightness brightness,
>> + bool nosleep)
>> {
>> struct led_classdev *led_cdev;
>>
>> @@ -316,12 +317,29 @@ void led_trigger_event(struct led_trigger *trig,
>> return;
>>
>> read_lock(&trig->leddev_list_lock);
>> - list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list)
>> - led_set_brightness(led_cdev, brightness);
>
>
> led_set_brightness() can gently disable blinking if passed 0 in the
> brightness argument. IMHO this patch is not needed then.
>
>
Yes, but the blinking disable is deferred, and so might never
run (e.g. I'd say it won't run on a non-preemptible kernel).
I think we need this API, or otherwise some way of circumventing
the deferred path on led_set_brightness. For instance, we
could turn off delay_on and delay_off in the panic atomic notifier.
I'm not strongly convinced by any approach, but this API seemed
slightly cleaner.
--
Ezequiel GarcĂa, VanguardiaSur
www.vanguardiasur.com.ar
[toc] | [prev] | [next] | [standalone]
| From | Jacek Anaszewski <jacek.anaszewski@gmail.com> |
|---|---|
| Date | 2016-04-06 08:20 +0200 |
| Subject | Re: [PATCH 2/5] leds: triggers: Add a led_trigger_event_nosleep API |
| Message-ID | <rkOYN-880-3@gated-at.bofh.it> |
| In reply to | #1372178 |
On 04/06/2016 06:38 AM, Ezequiel Garcia wrote:
> On 5 April 2016 at 18:36, Jacek Anaszewski <jacek.anaszewski@gmail.com> wrote:
>> Hi Ezequiel,
>>
>>
>> On 04/04/2016 10:22 PM, Ezequiel Garcia wrote:
>>>
>>> Now that we can mark any LED (even those in use by delayed blink
>>> triggers) to trigger on a kernel panic, let's introduce a nosleep
>>> led_trigger_event API.
>>>
>>> This API is needed to skip the delayed blink path on
>>> led_trigger_event. LEDs that are switched on a kernel panic,
>>> might be in use by a delayed blink trigger.
>>>
>>> This will be used by the panic LED trigger.
>>>
>>> Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
>>> ---
>>> drivers/leds/led-triggers.c | 26 ++++++++++++++++++++++----
>>> include/linux/leds.h | 4 ++++
>>> 2 files changed, 26 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
>>> index f5c9d7c4d181..00b9d8497777 100644
>>> --- a/drivers/leds/led-triggers.c
>>> +++ b/drivers/leds/led-triggers.c
>>> @@ -307,8 +307,9 @@ EXPORT_SYMBOL_GPL(devm_led_trigger_register);
>>>
>>> /* Simple LED Tigger Interface */
>>>
>>> -void led_trigger_event(struct led_trigger *trig,
>>> - enum led_brightness brightness)
>>> +static void do_led_trigger_event(struct led_trigger *trig,
>>> + enum led_brightness brightness,
>>> + bool nosleep)
>>> {
>>> struct led_classdev *led_cdev;
>>>
>>> @@ -316,12 +317,29 @@ void led_trigger_event(struct led_trigger *trig,
>>> return;
>>>
>>> read_lock(&trig->leddev_list_lock);
>>> - list_for_each_entry(led_cdev, &trig->led_cdevs, trig_list)
>>> - led_set_brightness(led_cdev, brightness);
>>
>>
>> led_set_brightness() can gently disable blinking if passed 0 in the
>> brightness argument. IMHO this patch is not needed then.
>>
>>
>
> Yes, but the blinking disable is deferred, and so might never
> run (e.g. I'd say it won't run on a non-preemptible kernel).
>
> I think we need this API, or otherwise some way of circumventing
> the deferred path on led_set_brightness. For instance, we
> could turn off delay_on and delay_off in the panic atomic notifier.
Yes, I prefer the latter, as it requires less changes.
> I'm not strongly convinced by any approach, but this API seemed
> slightly cleaner.
>
--
Best regards,
Jacek Anaszewski
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web