Commit f539dfed authored by Simon Guinot's avatar Simon Guinot Committed by Nicolas Pitre

leds: leds-ns2: fix locking

This patch replace all the lock functions with the irq safe variant.
The ns2_led_{set,get}_mode() functions must be safe in all context.

For example, the trigger timer call led_set_brightness() in a softirq
context.
Signed-off-by: default avatarSimon Guinot <sguinot@lacie.com>
Signed-off-by: default avatarNicolas Pitre <nico@fluxnic.net>
parent c4a90588
...@@ -81,7 +81,7 @@ static int ns2_led_get_mode(struct ns2_led_data *led_dat, ...@@ -81,7 +81,7 @@ static int ns2_led_get_mode(struct ns2_led_data *led_dat,
int cmd_level; int cmd_level;
int slow_level; int slow_level;
read_lock(&led_dat->rw_lock); read_lock_irq(&led_dat->rw_lock);
cmd_level = gpio_get_value(led_dat->cmd); cmd_level = gpio_get_value(led_dat->cmd);
slow_level = gpio_get_value(led_dat->slow); slow_level = gpio_get_value(led_dat->slow);
...@@ -95,7 +95,7 @@ static int ns2_led_get_mode(struct ns2_led_data *led_dat, ...@@ -95,7 +95,7 @@ static int ns2_led_get_mode(struct ns2_led_data *led_dat,
} }
} }
read_unlock(&led_dat->rw_lock); read_unlock_irq(&led_dat->rw_lock);
return ret; return ret;
} }
...@@ -104,8 +104,9 @@ static void ns2_led_set_mode(struct ns2_led_data *led_dat, ...@@ -104,8 +104,9 @@ static void ns2_led_set_mode(struct ns2_led_data *led_dat,
enum ns2_led_modes mode) enum ns2_led_modes mode)
{ {
int i; int i;
unsigned long flags;
write_lock(&led_dat->rw_lock); write_lock_irqsave(&led_dat->rw_lock, flags);
for (i = 0; i < ARRAY_SIZE(ns2_led_modval); i++) { for (i = 0; i < ARRAY_SIZE(ns2_led_modval); i++) {
if (mode == ns2_led_modval[i].mode) { if (mode == ns2_led_modval[i].mode) {
...@@ -116,7 +117,7 @@ static void ns2_led_set_mode(struct ns2_led_data *led_dat, ...@@ -116,7 +117,7 @@ static void ns2_led_set_mode(struct ns2_led_data *led_dat,
} }
} }
write_unlock(&led_dat->rw_lock); write_unlock_irqrestore(&led_dat->rw_lock, flags);
} }
static void ns2_led_set(struct led_classdev *led_cdev, static void ns2_led_set(struct led_classdev *led_cdev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment