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

leds: core: Drivers shouldn't enforce SYNC/ASYNC brightness setting

This patch removes SET_BRIGHTNESS_ASYNC and SET_BRIGHTNESS_SYNC flags.
led_set_brightness() now calls led_set_brightness_nosleep() instead of
choosing between sync and async op basing on the flags defined by the
driver.

From now on, if a user wants to make sure that brightness will be set
synchronously, they have to use led_set_brightness_sync() API. It is now
being made publicly available since it has become apparent that it is
a caller who should decide whether brightness is to be set in
a synchronous or an asynchronous way.

Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>

+35 -35
-4
drivers/leds/led-class-flash.c
··· 316 316 if (ret < 0) 317 317 return ret; 318 318 319 - /* Setting a torch brightness needs to have immediate effect */ 320 - led_cdev->flags &= ~SET_BRIGHTNESS_ASYNC; 321 - led_cdev->flags |= SET_BRIGHTNESS_SYNC; 322 - 323 319 return 0; 324 320 } 325 321 EXPORT_SYMBOL_GPL(led_classdev_flash_register);
-2
drivers/leds/led-class.c
··· 215 215 if (!led_cdev->max_brightness) 216 216 led_cdev->max_brightness = LED_FULL; 217 217 218 - led_cdev->flags |= SET_BRIGHTNESS_ASYNC; 219 - 220 218 led_update_brightness(led_cdev); 221 219 222 220 led_init_core(led_cdev);
+19 -13
drivers/leds/led-core.c
··· 205 205 void led_set_brightness(struct led_classdev *led_cdev, 206 206 enum led_brightness brightness) 207 207 { 208 - int ret = 0; 209 - 210 208 /* 211 209 * In case blinking is on delay brightness setting 212 210 * until the next timer tick. ··· 225 227 return; 226 228 } 227 229 228 - if (led_cdev->flags & SET_BRIGHTNESS_ASYNC) { 229 - led_set_brightness_nosleep(led_cdev, brightness); 230 - return; 231 - } else if (led_cdev->flags & SET_BRIGHTNESS_SYNC) 232 - ret = led_set_brightness_sync(led_cdev, brightness); 233 - else 234 - ret = -EINVAL; 235 - 236 - if (ret < 0) 237 - dev_dbg(led_cdev->dev, "Setting LED brightness failed (%d)\n", 238 - ret); 230 + led_set_brightness_nosleep(led_cdev, brightness); 239 231 } 240 232 EXPORT_SYMBOL_GPL(led_set_brightness); 241 233 ··· 255 267 led_set_brightness_nopm(led_cdev, led_cdev->brightness); 256 268 } 257 269 EXPORT_SYMBOL_GPL(led_set_brightness_nosleep); 270 + 271 + int led_set_brightness_sync(struct led_classdev *led_cdev, 272 + enum led_brightness value) 273 + { 274 + if (led_cdev->blink_delay_on || led_cdev->blink_delay_off) 275 + return -EBUSY; 276 + 277 + led_cdev->brightness = min(value, led_cdev->max_brightness); 278 + 279 + if (led_cdev->flags & LED_SUSPENDED) 280 + return 0; 281 + 282 + if (led_cdev->brightness_set_blocking) 283 + return led_cdev->brightness_set_blocking(led_cdev, 284 + led_cdev->brightness); 285 + return -ENOTSUPP; 286 + } 287 + EXPORT_SYMBOL_GPL(led_set_brightness_sync); 258 288 259 289 int led_update_brightness(struct led_classdev *led_cdev) 260 290 {
-13
drivers/leds/leds.h
··· 16 16 #include <linux/rwsem.h> 17 17 #include <linux/leds.h> 18 18 19 - static inline int led_set_brightness_sync(struct led_classdev *led_cdev, 20 - enum led_brightness value) 21 - { 22 - int ret = 0; 23 - 24 - led_cdev->brightness = min(value, led_cdev->max_brightness); 25 - 26 - if (!(led_cdev->flags & LED_SUSPENDED)) 27 - ret = led_cdev->brightness_set_blocking(led_cdev, 28 - led_cdev->brightness); 29 - return ret; 30 - } 31 - 32 19 static inline int led_get_brightness(struct led_classdev *led_cdev) 33 20 { 34 21 return led_cdev->brightness;
+16 -3
include/linux/leds.h
··· 47 47 #define LED_BLINK_BRIGHTNESS_CHANGE (1 << 20) 48 48 #define LED_BLINK_DISABLE (1 << 21) 49 49 #define LED_SYSFS_DISABLE (1 << 22) 50 - #define SET_BRIGHTNESS_ASYNC (1 << 23) 51 - #define SET_BRIGHTNESS_SYNC (1 << 24) 52 - #define LED_DEV_CAP_FLASH (1 << 25) 50 + #define LED_DEV_CAP_FLASH (1 << 23) 53 51 54 52 /* Set LED brightness level */ 55 53 /* Must not sleep, use a workqueue if needed */ ··· 160 162 */ 161 163 extern void led_set_brightness(struct led_classdev *led_cdev, 162 164 enum led_brightness brightness); 165 + 166 + /** 167 + * led_set_brightness_sync - set LED brightness synchronously 168 + * @led_cdev: the LED to set 169 + * @brightness: the brightness to set it to 170 + * 171 + * Set an LED's brightness immediately. This function will block 172 + * the caller for the time required for accessing device registers, 173 + * and it can sleep. 174 + * 175 + * Returns: 0 on success or negative error value on failure 176 + */ 177 + extern int led_set_brightness_sync(struct led_classdev *led_cdev, 178 + enum led_brightness value); 179 + 163 180 /** 164 181 * led_update_brightness - update LED brightness 165 182 * @led_cdev: the LED to query