Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

leds: core: Move LED core callbacks out of led-class.c

Since the API for controlling LED brightness and blinking is defined in
the LED core, move the related timer and work callbacks to the led-core.c,
and initialize them through a new led_core_init API.

Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
Acked-by: Andrew Lunn <andrew@lunn.ch>
Acked-by: Pavel Machek <pavel@ucw.cz>

+75 -68
+1 -68
drivers/leds/led-class.c
··· 102 102 NULL, 103 103 }; 104 104 105 - static void led_timer_function(unsigned long data) 106 - { 107 - struct led_classdev *led_cdev = (void *)data; 108 - unsigned long brightness; 109 - unsigned long delay; 110 - 111 - if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) { 112 - led_set_brightness_async(led_cdev, LED_OFF); 113 - return; 114 - } 115 - 116 - if (led_cdev->flags & LED_BLINK_ONESHOT_STOP) { 117 - led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP; 118 - return; 119 - } 120 - 121 - brightness = led_get_brightness(led_cdev); 122 - if (!brightness) { 123 - /* Time to switch the LED on. */ 124 - if (led_cdev->delayed_set_value) { 125 - led_cdev->blink_brightness = 126 - led_cdev->delayed_set_value; 127 - led_cdev->delayed_set_value = 0; 128 - } 129 - brightness = led_cdev->blink_brightness; 130 - delay = led_cdev->blink_delay_on; 131 - } else { 132 - /* Store the current brightness value to be able 133 - * to restore it when the delay_off period is over. 134 - */ 135 - led_cdev->blink_brightness = brightness; 136 - brightness = LED_OFF; 137 - delay = led_cdev->blink_delay_off; 138 - } 139 - 140 - led_set_brightness_async(led_cdev, brightness); 141 - 142 - /* Return in next iteration if led is in one-shot mode and we are in 143 - * the final blink state so that the led is toggled each delay_on + 144 - * delay_off milliseconds in worst case. 145 - */ 146 - if (led_cdev->flags & LED_BLINK_ONESHOT) { 147 - if (led_cdev->flags & LED_BLINK_INVERT) { 148 - if (brightness) 149 - led_cdev->flags |= LED_BLINK_ONESHOT_STOP; 150 - } else { 151 - if (!brightness) 152 - led_cdev->flags |= LED_BLINK_ONESHOT_STOP; 153 - } 154 - } 155 - 156 - mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay)); 157 - } 158 - 159 - static void set_brightness_delayed(struct work_struct *ws) 160 - { 161 - struct led_classdev *led_cdev = 162 - container_of(ws, struct led_classdev, set_brightness_work); 163 - 164 - led_stop_software_blink(led_cdev); 165 - 166 - led_set_brightness_async(led_cdev, led_cdev->delayed_set_value); 167 - } 168 - 169 105 /** 170 106 * led_classdev_suspend - suspend an led_classdev. 171 107 * @led_cdev: the led_classdev to suspend. ··· 219 283 220 284 led_update_brightness(led_cdev); 221 285 222 - INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed); 223 - 224 - setup_timer(&led_cdev->blink_timer, led_timer_function, 225 - (unsigned long)led_cdev); 286 + led_init_core(led_cdev); 226 287 227 288 #ifdef CONFIG_LEDS_TRIGGERS 228 289 led_trigger_set_default(led_cdev);
+73
drivers/leds/led-core.c
··· 25 25 LIST_HEAD(leds_list); 26 26 EXPORT_SYMBOL_GPL(leds_list); 27 27 28 + static void led_timer_function(unsigned long data) 29 + { 30 + struct led_classdev *led_cdev = (void *)data; 31 + unsigned long brightness; 32 + unsigned long delay; 33 + 34 + if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) { 35 + led_set_brightness_async(led_cdev, LED_OFF); 36 + return; 37 + } 38 + 39 + if (led_cdev->flags & LED_BLINK_ONESHOT_STOP) { 40 + led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP; 41 + return; 42 + } 43 + 44 + brightness = led_get_brightness(led_cdev); 45 + if (!brightness) { 46 + /* Time to switch the LED on. */ 47 + if (led_cdev->delayed_set_value) { 48 + led_cdev->blink_brightness = 49 + led_cdev->delayed_set_value; 50 + led_cdev->delayed_set_value = 0; 51 + } 52 + brightness = led_cdev->blink_brightness; 53 + delay = led_cdev->blink_delay_on; 54 + } else { 55 + /* Store the current brightness value to be able 56 + * to restore it when the delay_off period is over. 57 + */ 58 + led_cdev->blink_brightness = brightness; 59 + brightness = LED_OFF; 60 + delay = led_cdev->blink_delay_off; 61 + } 62 + 63 + led_set_brightness_async(led_cdev, brightness); 64 + 65 + /* Return in next iteration if led is in one-shot mode and we are in 66 + * the final blink state so that the led is toggled each delay_on + 67 + * delay_off milliseconds in worst case. 68 + */ 69 + if (led_cdev->flags & LED_BLINK_ONESHOT) { 70 + if (led_cdev->flags & LED_BLINK_INVERT) { 71 + if (brightness) 72 + led_cdev->flags |= LED_BLINK_ONESHOT_STOP; 73 + } else { 74 + if (!brightness) 75 + led_cdev->flags |= LED_BLINK_ONESHOT_STOP; 76 + } 77 + } 78 + 79 + mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay)); 80 + } 81 + 82 + static void set_brightness_delayed(struct work_struct *ws) 83 + { 84 + struct led_classdev *led_cdev = 85 + container_of(ws, struct led_classdev, set_brightness_work); 86 + 87 + led_stop_software_blink(led_cdev); 88 + 89 + led_set_brightness_async(led_cdev, led_cdev->delayed_set_value); 90 + } 91 + 28 92 static void led_set_software_blink(struct led_classdev *led_cdev, 29 93 unsigned long delay_on, 30 94 unsigned long delay_off) ··· 135 71 136 72 led_set_software_blink(led_cdev, *delay_on, *delay_off); 137 73 } 74 + 75 + void led_init_core(struct led_classdev *led_cdev) 76 + { 77 + INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed); 78 + 79 + setup_timer(&led_cdev->blink_timer, led_timer_function, 80 + (unsigned long)led_cdev); 81 + } 82 + EXPORT_SYMBOL_GPL(led_init_core); 138 83 139 84 void led_blink_set(struct led_classdev *led_cdev, 140 85 unsigned long *delay_on,
+1
drivers/leds/leds.h
··· 44 44 return led_cdev->brightness; 45 45 } 46 46 47 + void led_init_core(struct led_classdev *led_cdev); 47 48 void led_stop_software_blink(struct led_classdev *led_cdev); 48 49 49 50 extern struct rw_semaphore leds_list_lock;