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

leds: ns2: Remove work queue

Now the core implements the work queue, remove it from the drivers,
and switch to using brightness_set_blocking op.

Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
Tested-by: Simon Guinot <simon.guinot@sequanux.org>

+13 -18
+13 -18
drivers/leds/leds-ns2.c
··· 45 45 unsigned cmd; 46 46 unsigned slow; 47 47 bool can_sleep; 48 - int mode_index; 49 48 unsigned char sata; /* True when SATA mode active. */ 50 49 rwlock_t rw_lock; /* Lock GPIOs. */ 51 - struct work_struct work; 52 50 int num_modes; 53 51 struct ns2_led_modval *modval; 54 52 }; 55 - 56 - static void ns2_led_work(struct work_struct *work) 57 - { 58 - struct ns2_led_data *led_dat = 59 - container_of(work, struct ns2_led_data, work); 60 - int i = led_dat->mode_index; 61 - 62 - gpio_set_value_cansleep(led_dat->cmd, led_dat->modval[i].cmd_level); 63 - gpio_set_value_cansleep(led_dat->slow, led_dat->modval[i].slow_level); 64 - } 65 53 66 54 static int ns2_led_get_mode(struct ns2_led_data *led_dat, 67 55 enum ns2_led_modes *mode) ··· 100 112 goto exit_unlock; 101 113 } 102 114 103 - led_dat->mode_index = i; 104 - schedule_work(&led_dat->work); 115 + gpio_set_value_cansleep(led_dat->cmd, led_dat->modval[i].cmd_level); 116 + gpio_set_value_cansleep(led_dat->slow, led_dat->modval[i].slow_level); 105 117 106 118 exit_unlock: 107 119 write_unlock_irqrestore(&led_dat->rw_lock, flags); ··· 122 134 mode = NS_V2_LED_ON; 123 135 124 136 ns2_led_set_mode(led_dat, mode); 137 + } 138 + 139 + static int ns2_led_set_blocking(struct led_classdev *led_cdev, 140 + enum led_brightness value) 141 + { 142 + ns2_led_set(led_cdev, value); 143 + return 0; 125 144 } 126 145 127 146 static ssize_t ns2_led_sata_store(struct device *dev, ··· 214 219 led_dat->cdev.name = template->name; 215 220 led_dat->cdev.default_trigger = template->default_trigger; 216 221 led_dat->cdev.blink_set = NULL; 217 - led_dat->cdev.brightness_set = ns2_led_set; 218 222 led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; 219 223 led_dat->cdev.groups = ns2_led_groups; 220 224 led_dat->cmd = template->cmd; 221 225 led_dat->slow = template->slow; 222 226 led_dat->can_sleep = gpio_cansleep(led_dat->cmd) | 223 227 gpio_cansleep(led_dat->slow); 228 + if (led_dat->can_sleep) 229 + led_dat->cdev.brightness_set_blocking = ns2_led_set_blocking; 230 + else 231 + led_dat->cdev.brightness_set = ns2_led_set; 224 232 led_dat->modval = template->modval; 225 233 led_dat->num_modes = template->num_modes; 226 234 ··· 236 238 led_dat->cdev.brightness = 237 239 (mode == NS_V2_LED_OFF) ? LED_OFF : LED_FULL; 238 240 239 - INIT_WORK(&led_dat->work, ns2_led_work); 240 - 241 241 ret = led_classdev_register(&pdev->dev, &led_dat->cdev); 242 242 if (ret < 0) 243 243 return ret; ··· 246 250 static void delete_ns2_led(struct ns2_led_data *led_dat) 247 251 { 248 252 led_classdev_unregister(&led_dat->cdev); 249 - cancel_work_sync(&led_dat->work); 250 253 } 251 254 252 255 #ifdef CONFIG_OF_GPIO