On 16/11/15 21:33, Álvaro Fernández Rojas wrote: > Still wrong, you are setting the led value after unlocking the spinlock. I have to unlock it because bcm6328_led_set() locks that spinlock. > El 16/11/2015 a las 21:24, Simon Arlott escribió: >> When ensuring a consistent initial LED state in bcm6328_led (as they may >> be blinking instead of on/off), the LED register is set using an inverted >> copy of bcm6328_led_set(). To avoid further errors relating to active low >> handling, call this function directly instead. >> >> As bcm6328_led_set() acquires the same spinlock again when updating the >> register, it is called after unlocking. >> >> Signed-off-by: Simon Arlott <simon@xxxxxxxxxxx> >> --- >> drivers/leds/leds-bcm6328.c | 8 ++------ >> 1 file changed, 2 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/leds/leds-bcm6328.c b/drivers/leds/leds-bcm6328.c >> index c7ea5c6..95d0cf9 100644 >> --- a/drivers/leds/leds-bcm6328.c >> +++ b/drivers/leds/leds-bcm6328.c >> @@ -314,14 +314,10 @@ static int bcm6328_led(struct device *dev, struct device_node *nc, u32 reg, >> } else { >> led->cdev.brightness = LED_OFF; >> } >> - >> - if ((led->active_low && led->cdev.brightness == LED_FULL) || >> - (!led->active_low && led->cdev.brightness == LED_OFF)) >> - bcm6328_led_mode(led, BCM6328_LED_MODE_ON); >> - else >> - bcm6328_led_mode(led, BCM6328_LED_MODE_OFF); >> spin_unlock_irqrestore(lock, flags); >> >> + bcm6328_led_set(&led->cdev, led->cdev.brightness); >> + >> led->cdev.brightness_set = bcm6328_led_set; >> led->cdev.blink_set = bcm6328_blink_set; >> > -- Simon Arlott -- To unsubscribe from this list: send the line "unsubscribe linux-leds" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html