static void led_timer_function(unsigned long data) { struct led_classdev *led_cdev = (struct led_classdev *) data; struct timer_trig_data *timer_data = led_cdev->trigger_data; unsigned long brightness; unsigned long delay; if (!timer_data->delay_on || !timer_data->delay_off) { led_set_brightness(led_cdev, LED_OFF); return; } brightness = led_get_brightness(led_cdev); if (!brightness) { /* Time to switch the LED on. */ brightness = timer_data->brightness_on; delay = timer_data->delay_on; } else { /* Store the current brightness value to be able * to restore it when the delay_off period is over. */ timer_data->brightness_on = brightness; brightness = LED_OFF; delay = timer_data->delay_off; } led_set_brightness(led_cdev, brightness); #if (CONFIG_RTC_LEDTRIG_TIMER==1) led_rtc_set_alarm(led_cdev, delay); #elif (CONFIG_RTC_LEDTRIG_TIMER==2) hrtimer_start(&timer_data->hrtimer, ns_to_ktime((u64)delay*1000*1000), HRTIMER_MODE_REL); #else mod_timer(&timer_data->timer, jiffies + msecs_to_jiffies(delay)); #endif }
static void led_timer_function(unsigned long data) { struct led_classdev *led_cdev = (struct led_classdev *) data; struct notification_trig_data *timer_data = led_cdev->trigger_data; unsigned long brightness; unsigned long delay; if (!timer_data->delay_on || !timer_data->delay_off || !timer_data->blink_cnt) { led_set_brightness(led_cdev, LED_OFF); return; } brightness = led_get_brightness(led_cdev); if (!brightness) { /* Time to switch the LED on. */ brightness = timer_data->brightness_on; delay = timer_data->delay_on; } else { /* Store the current brightness value to be able * to restore it when the delay_off period is over. */ timer_data->brightness_on = brightness; brightness = LED_OFF; delay = timer_data->delay_off; if(timer_data->blink_cnt <= ++timer_data->current_blink_cnt) { timer_data->current_blink_cnt = 0; delay+=timer_data->off_duration; } } led_set_brightness(led_cdev, brightness); led_rtc_set_alarm(led_cdev, delay); }