Hi! It seems quite clear: static int timer_trig_activate(struct led_classdev *led_cdev) { printk("timer_trig_activate\n"); if (led_cdev->flags & LED_INIT_DEFAULT_TRIGGER) { led_blink_set(led_cdev, &led_cdev->blink_delay_on, &led_cdev->blink_delay_off); printk("timer_trig_activate done\n"); return 0; } static void timer_trig_deactivate(struct led_classdev *led_cdev) { printk("timer_trig_deactivate\n"); /* Stop blinking */ led_set_brightness(led_cdev, LED_OFF); printk("timer_trig_deactivate done\n"); } We get timer_trig_deactivate() immediately followed by timer_trig_activate(). set_brightness goes to workqueue because it would block. That means that blink_set() happens before set_brightness... Pavel [ 16.194141] e1000e 0000:02:00.0 eth1: 10/100 speed: disabling TSO [ 145.887931] timer_trig_activate [ 145.888011] LED set 0 to 2 [ 145.888879] LED set 0 to 2... 0 [ 145.888893] timer_trig_activate done [ 149.977138] timer_trig_deactivate [ 149.977169] timer_trig_deactivate done [ 149.977479] timer_trig_activate [ 149.977497] LED set 0 to 2 [ 149.978281] LED set 0 to 2... 0 [ 149.978295] timer_trig_activate done [ 149.978415] LED set 0 to 0 [ 149.979851] LED set 0 to 0... 0 [ 184.839252] timer_trig_deactivate [ 184.839282] timer_trig_deactivate done [ 184.839319] timer_trig_activate [ 184.839337] LED set 0 to 2 [ 184.839907] LED set 0 to 0 [ 184.840369] LED set 0 to 2... 0 [ 184.840383] timer_trig_activate done [ 184.843318] LED set 0 to 0... 0 root@amd:/sys/class/leds/tpacpi::power# diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c index e3da7c0..ca1f69b 100644 --- a/drivers/leds/led-core.c +++ b/drivers/leds/led-core.c @@ -166,6 +166,7 @@ static void led_blink_setup(struct led_classdev *led_cdev, { if (!test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) && led_cdev->blink_set && + /* This can sleep */ !led_cdev->blink_set(led_cdev, delay_on, delay_off)) return; diff --git a/drivers/leds/trigger/ledtrig-timer.c b/drivers/leds/trigger/ledtrig-timer.c index ca898c1..0b061bb5 100644 --- a/drivers/leds/trigger/ledtrig-timer.c +++ b/drivers/leds/trigger/ledtrig-timer.c @@ -104,6 +104,7 @@ static void pattern_init(struct led_classdev *led_cdev) static int timer_trig_activate(struct led_classdev *led_cdev) { + printk("timer_trig_activate\n"); if (led_cdev->flags & LED_INIT_DEFAULT_TRIGGER) { pattern_init(led_cdev); /* @@ -115,14 +116,18 @@ static int timer_trig_activate(struct led_classdev *led_cdev) led_blink_set(led_cdev, &led_cdev->blink_delay_on, &led_cdev->blink_delay_off); + printk("timer_trig_activate done\n"); return 0; } static void timer_trig_deactivate(struct led_classdev *led_cdev) { + printk("timer_trig_deactivate\n"); /* Stop blinking */ led_set_brightness(led_cdev, LED_OFF); + + printk("timer_trig_deactivate done\n"); } static struct led_trigger timer_led_trigger = { diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index 3a4402a..b3fa9c9 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -363,11 +363,11 @@ int mmc_of_parse_voltage(struct device_node *np, u32 *mask) int num_ranges, i; voltage_ranges = of_get_property(np, "voltage-ranges", &num_ranges); - num_ranges = num_ranges / sizeof(*voltage_ranges) / 2; if (!voltage_ranges) { pr_debug("%pOF: voltage-ranges unspecified\n", np); return 0; } + num_ranges = num_ranges / sizeof(*voltage_ranges) / 2; if (!num_ranges) { pr_err("%pOF: voltage-ranges empty\n", np); return -EINVAL; diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 57d9ae9..3ec6636 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -5867,6 +5867,8 @@ static int led_set_status(const unsigned int led, int rc = 0; + printk("LED set %d to %d\n", led, ledstatus); + switch (led_supported) { case TPACPI_LED_570: /* 570 */ @@ -5876,7 +5878,7 @@ static int led_set_status(const unsigned int led, return -EPERM; if (!acpi_evalf(led_handle, NULL, NULL, "vdd", (1 << led), led_sled_arg1[ledstatus])) - rc = -EIO; + return -EIO; break; case TPACPI_LED_OLD: /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20 */ @@ -5900,12 +5902,14 @@ static int led_set_status(const unsigned int led, return -EPERM; if (!acpi_evalf(led_handle, NULL, NULL, "vdd", led, led_led_arg1[ledstatus])) - rc = -EIO; + return -EIO; break; default: - rc = -ENXIO; + return -ENXIO; } + printk("LED set %d to %d... %d\n", led, ledstatus, rc); + if (!rc) tpacpi_led_state_cache[led] = ledstatus; -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Attachment:
signature.asc
Description: Digital signature