Skip to content

Commit

Permalink
leds: leds-ns2: fix locking
Browse files Browse the repository at this point in the history
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: Simon Guinot <sguinot@lacie.com>
Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
  • Loading branch information
Simon Guinot authored and Nicolas Pitre committed Sep 20, 2010
1 parent c4a9058 commit f539dfe
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions drivers/leds/leds-ns2.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ static int ns2_led_get_mode(struct ns2_led_data *led_dat,
int cmd_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);
slow_level = gpio_get_value(led_dat->slow);
Expand All @@ -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;
}
Expand All @@ -104,8 +104,9 @@ static void ns2_led_set_mode(struct ns2_led_data *led_dat,
enum ns2_led_modes mode)
{
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++) {
if (mode == ns2_led_modval[i].mode) {
Expand All @@ -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,
Expand Down

0 comments on commit f539dfe

Please sign in to comment.