static void led_set_software_blink(struct led_classdev *led_cdev, unsigned long delay_on, unsigned long delay_off) { int current_brightness; current_brightness = led_get_brightness(led_cdev); if (current_brightness) led_cdev->blink_brightness = current_brightness; if (!led_cdev->blink_brightness) led_cdev->blink_brightness = led_cdev->max_brightness; if (led_get_trigger_data(led_cdev) && delay_on == led_cdev->blink_delay_on && delay_off == led_cdev->blink_delay_off) return; led_stop_software_blink(led_cdev); led_cdev->blink_delay_on = delay_on; led_cdev->blink_delay_off = delay_off; /* never on - don't blink */ if (!delay_on) return; /* never off - just set to brightness */ if (!delay_off) { led_set_brightness(led_cdev, led_cdev->blink_brightness); return; } mod_timer(&led_cdev->blink_timer, jiffies + 1); }
void led_brightness_set(struct led_classdev *led_cdev, enum led_brightness brightness) { printk(KERN_DEBUG "led_brightness_set: %lu",brightness); led_stop_software_blink(led_cdev); led_cdev->brightness_set(led_cdev, brightness); }
/** * led_classdev_unregister - unregisters a object of led_properties class. * @led_cdev: the led device to unregister * * Unregisters a previously registered via led_classdev_register object. */ void led_classdev_unregister(struct led_classdev *led_cdev) { #ifdef CONFIG_LEDS_TRIGGERS down_write(&led_cdev->trigger_lock); if (led_cdev->trigger) led_trigger_set(led_cdev, NULL); up_write(&led_cdev->trigger_lock); #endif led_cdev->flags |= LED_UNREGISTERING; /* Stop blinking */ led_stop_software_blink(led_cdev); led_set_brightness(led_cdev, LED_OFF); flush_work(&led_cdev->set_brightness_work); device_unregister(led_cdev->dev); down_write(&leds_list_lock); list_del(&led_cdev->node); up_write(&leds_list_lock); mutex_destroy(&led_cdev->led_access); }
static void set_brightness_delayed(struct work_struct *ws) { struct led_classdev *led_cdev = container_of(ws, struct led_classdev, set_brightness_work); led_stop_software_blink(led_cdev); led_set_brightness_async(led_cdev, led_cdev->delayed_set_value); }
static void led_set_software_blink(struct led_classdev *led_cdev, unsigned long delay_on, unsigned long delay_off) { int current_brightness; current_brightness = led_get_brightness(led_cdev); if (current_brightness) led_cdev->blink_brightness = current_brightness; if (!led_cdev->blink_brightness) led_cdev->blink_brightness = led_cdev->max_brightness; //<2012/10/04-Sherman Wei,Removed for bug that missed call->plug USB->unplug USB, LED will not flash/light //printk("[LED]+led_set_software_blink:cur_bri=%d, de_on=%d, de_off=%d;dev_on=%d, dev_off=%d \n",current_brightness,delay_on,delay_off,led_cdev->blink_delay_on, led_cdev->blink_delay_off); #if defined(HAWK35_EP0) || defined(ARIMA_PROJECT_HAWK35) || defined(HAWK35_DTV_EP1) /// Don't return while (delay_on == led_cdev->blink_delay_on) && (delay_off == led_cdev->blink_delay_off) #else if (led_get_trigger_data(led_cdev) && delay_on == led_cdev->blink_delay_on && delay_off == led_cdev->blink_delay_off) return; #endif //printk("[LED]-led_set_software_blink\n"); //>2012/10/04-Sherman Wei led_stop_software_blink(led_cdev); led_cdev->blink_delay_on = delay_on; led_cdev->blink_delay_off = delay_off; /* never on - don't blink */ if (!delay_on) return; /* never off - just set to brightness */ if (!delay_off) { led_set_brightness(led_cdev, led_cdev->blink_brightness); return; } mod_timer(&led_cdev->blink_timer, jiffies + 1); }
/** * led_classdev_unregister - unregisters a object of led_properties class. * @led_cdev: the led device to unregister * * Unregisters a previously registered via led_classdev_register object. */ void led_classdev_unregister(struct led_classdev *led_cdev) { #ifdef CONFIG_LEDS_TRIGGERS down_write(&led_cdev->trigger_lock); if (led_cdev->trigger) led_trigger_set(led_cdev, NULL); up_write(&led_cdev->trigger_lock); #endif cancel_work_sync(&led_cdev->set_brightness_work); /* Stop blinking */ led_stop_software_blink(led_cdev); led_set_brightness(led_cdev, LED_OFF); device_unregister(led_cdev->dev); down_write(&leds_list_lock); list_del(&led_cdev->node); up_write(&leds_list_lock); }
static ssize_t led_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct led_classdev *led_cdev = dev_get_drvdata(dev); unsigned long blink_on = led_cdev->blink_delay_on; unsigned long blink_off = led_cdev->blink_delay_off; int on = simple_strtol(buf, NULL, 10); if (!on) { led_stop_software_blink(led_cdev); led_set_brightness(led_cdev, 0); } else { if (blink_on && blink_off) { led_blink_set(led_cdev, &blink_on, &blink_off); } } return size; }
static void set_brightness_delayed(struct work_struct *ws) { struct led_classdev *led_cdev = container_of(ws, struct led_classdev, set_brightness_work); int ret = 0; if (test_and_clear_bit(LED_BLINK_DISABLE, &led_cdev->work_flags)) { led_cdev->delayed_set_value = LED_OFF; led_stop_software_blink(led_cdev); } ret = __led_set_brightness(led_cdev, led_cdev->delayed_set_value); if (ret == -ENOTSUPP) ret = __led_set_brightness_blocking(led_cdev, led_cdev->delayed_set_value); if (ret < 0 && /* LED HW might have been unplugged, therefore don't warn */ !(ret == -ENODEV && (led_cdev->flags & LED_UNREGISTERING) && (led_cdev->flags & LED_HW_PLUGGABLE))) dev_err(led_cdev->dev, "Setting an LED's brightness failed (%d)\n", ret); }
void led_brightness_set(struct led_classdev *led_cdev, enum led_brightness brightness) { led_stop_software_blink(led_cdev); led_cdev->brightness_set(led_cdev, brightness); }