Lines Matching +full:multi +full:- +full:led
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Activity LED trigger
6 * Partially based on Atsushi Nemoto's ledtrig-heartbeat.c.
36 struct led_classdev *led_cdev = activity_data->led_cdev; in led_activity_function()
47 if (test_and_clear_bit(LED_BLINK_BRIGHTNESS_CHANGE, &led_cdev->work_flags)) in led_activity_function()
48 led_cdev->blink_brightness = led_cdev->new_blink_brightness; in led_activity_function()
52 led_set_brightness_nosleep(led_cdev, led_cdev->blink_brightness); in led_activity_function()
74 * down to 16us, ensuring we won't overflow 32-bit computations below in led_activity_function()
78 diff_boot = (curr_boot - activity_data->last_boot) >> 16; in led_activity_function()
79 diff_used = (curr_used - activity_data->last_used) >> 16; in led_activity_function()
80 activity_data->last_boot = curr_boot; in led_activity_function()
81 activity_data->last_used = curr_used; in led_activity_function()
95 * 1 - delta_idle / delta_boot in led_activity_function()
97 * What we want is that when the CPU usage is zero, the LED must blink in led_activity_function()
101 * enough to saturate one core in multi-core systems or 50% in single in led_activity_function()
106 * all cores are saturated. It's important that the LED never stays in in led_activity_function()
111 * - a target CPU usage of min(50%, 100%/#CPU) for a 10% duty cycle in led_activity_function()
113 * - below target : in led_activity_function()
115 * OFF_ms = 90 + (1 - usage/target) * 900 in led_activity_function()
116 * - above target : in led_activity_function()
117 * ON_ms = 10 + (usage-target)/(100%-target) * 80 in led_activity_function()
118 * OFF_ms = 90 - (usage-target)/(100%-target) * 80 in led_activity_function()
125 activity_data->time_left -= 100; in led_activity_function()
126 if (activity_data->time_left <= 0) { in led_activity_function()
127 activity_data->time_left = 0; in led_activity_function()
128 activity_data->state = !activity_data->state; in led_activity_function()
130 (activity_data->state ^ activity_data->invert) ? in led_activity_function()
131 led_cdev->blink_brightness : LED_OFF); in led_activity_function()
137 delay = activity_data->state ? in led_activity_function()
139 990 - 900 * usage / target; /* OFF */ in led_activity_function()
141 delay = activity_data->state ? in led_activity_function()
142 10 + 80 * (usage - target) / (100 - target) : /* ON */ in led_activity_function()
143 90 - 80 * (usage - target) / (100 - target); /* OFF */ in led_activity_function()
146 if (!activity_data->time_left || delay <= activity_data->time_left) in led_activity_function()
147 activity_data->time_left = delay; in led_activity_function()
149 delay = min_t(int, activity_data->time_left, 100); in led_activity_function()
150 mod_timer(&activity_data->timer, jiffies + msecs_to_jiffies(delay)); in led_activity_function()
158 return sprintf(buf, "%u\n", activity_data->invert); in led_invert_show()
173 activity_data->invert = !!state; in led_invert_store()
192 return -ENOMEM; in activity_activate()
196 activity_data->led_cdev = led_cdev; in activity_activate()
197 timer_setup(&activity_data->timer, led_activity_function, 0); in activity_activate()
198 if (!led_cdev->blink_brightness) in activity_activate()
199 led_cdev->blink_brightness = led_cdev->max_brightness; in activity_activate()
200 led_activity_function(&activity_data->timer); in activity_activate()
201 set_bit(LED_BLINK_SW, &led_cdev->work_flags); in activity_activate()
210 del_timer_sync(&activity_data->timer); in activity_deactivate()
212 clear_bit(LED_BLINK_SW, &led_cdev->work_flags); in activity_deactivate()
268 MODULE_DESCRIPTION("Activity LED trigger");