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

leds: Change led_trigger_blink[_oneshot]() delay parameters to pass-by-value

led_blink_set[_oneshot]()'s delay_on and delay_off function parameters
are pass by reference, so that hw-blink implementations can report
back the actual achieved delays when the values have been rounded
to something the hw supports.

This is really only interesting for the sysfs API / the timer trigger.
Other triggers don't really care about this and none of the callers of
led_trigger_blink[_oneshot]() do anything with the returned delay values.

Change the led_trigger_blink[_oneshot]() delay parameters to pass-by-value,
there are 2 reasons for this:

1. led_cdev->blink_set() may sleep, while led_trigger_blink() may not.
So on hw where led_cdev->blink_set() sleeps the call needs to be deferred
to a workqueue, in which case the actual achieved delays are unknown
(this is a preparation patch for the deferring).

2. Since the callers don't care about the actual achieved delays, allowing
callers to directly pass a value leads to simpler code for most callers.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
Tested-by: Yauhen Kharuzhy <jekhor@gmail.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Acked-by: Florian Westphal <fw@strlen.de>
Link: https://lore.kernel.org/r/20230510162234.291439-2-hdegoede@redhat.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

Hans de Goede and committed by
Lee Jones
e298d8a3 d9ff8a8e

+29 -50
+8 -8
drivers/leds/led-triggers.c
··· 393 393 EXPORT_SYMBOL_GPL(led_trigger_event); 394 394 395 395 static void led_trigger_blink_setup(struct led_trigger *trig, 396 - unsigned long *delay_on, 397 - unsigned long *delay_off, 396 + unsigned long delay_on, 397 + unsigned long delay_off, 398 398 int oneshot, 399 399 int invert) 400 400 { ··· 406 406 rcu_read_lock(); 407 407 list_for_each_entry_rcu(led_cdev, &trig->led_cdevs, trig_list) { 408 408 if (oneshot) 409 - led_blink_set_oneshot(led_cdev, delay_on, delay_off, 409 + led_blink_set_oneshot(led_cdev, &delay_on, &delay_off, 410 410 invert); 411 411 else 412 - led_blink_set(led_cdev, delay_on, delay_off); 412 + led_blink_set(led_cdev, &delay_on, &delay_off); 413 413 } 414 414 rcu_read_unlock(); 415 415 } 416 416 417 417 void led_trigger_blink(struct led_trigger *trig, 418 - unsigned long *delay_on, 419 - unsigned long *delay_off) 418 + unsigned long delay_on, 419 + unsigned long delay_off) 420 420 { 421 421 led_trigger_blink_setup(trig, delay_on, delay_off, 0, 0); 422 422 } 423 423 EXPORT_SYMBOL_GPL(led_trigger_blink); 424 424 425 425 void led_trigger_blink_oneshot(struct led_trigger *trig, 426 - unsigned long *delay_on, 427 - unsigned long *delay_off, 426 + unsigned long delay_on, 427 + unsigned long delay_off, 428 428 int invert) 429 429 { 430 430 led_trigger_blink_setup(trig, delay_on, delay_off, 1, invert);
+3 -6
drivers/leds/trigger/ledtrig-disk.c
··· 19 19 20 20 void ledtrig_disk_activity(bool write) 21 21 { 22 - unsigned long blink_delay = BLINK_DELAY; 23 - 24 - led_trigger_blink_oneshot(ledtrig_disk, 25 - &blink_delay, &blink_delay, 0); 22 + led_trigger_blink_oneshot(ledtrig_disk, BLINK_DELAY, BLINK_DELAY, 0); 26 23 if (write) 27 24 led_trigger_blink_oneshot(ledtrig_disk_write, 28 - &blink_delay, &blink_delay, 0); 25 + BLINK_DELAY, BLINK_DELAY, 0); 29 26 else 30 27 led_trigger_blink_oneshot(ledtrig_disk_read, 31 - &blink_delay, &blink_delay, 0); 28 + BLINK_DELAY, BLINK_DELAY, 0); 32 29 } 33 30 EXPORT_SYMBOL(ledtrig_disk_activity); 34 31
+2 -6
drivers/leds/trigger/ledtrig-mtd.c
··· 22 22 23 23 void ledtrig_mtd_activity(void) 24 24 { 25 - unsigned long blink_delay = BLINK_DELAY; 26 - 27 - led_trigger_blink_oneshot(ledtrig_mtd, 28 - &blink_delay, &blink_delay, 0); 29 - led_trigger_blink_oneshot(ledtrig_nand, 30 - &blink_delay, &blink_delay, 0); 25 + led_trigger_blink_oneshot(ledtrig_mtd, BLINK_DELAY, BLINK_DELAY, 0); 26 + led_trigger_blink_oneshot(ledtrig_nand, BLINK_DELAY, BLINK_DELAY, 0); 31 27 } 32 28 EXPORT_SYMBOL(ledtrig_mtd_activity); 33 29
+2 -6
drivers/net/arcnet/arcnet.c
··· 196 196 void arcnet_led_event(struct net_device *dev, enum arcnet_led_event event) 197 197 { 198 198 struct arcnet_local *lp = netdev_priv(dev); 199 - unsigned long led_delay = 350; 200 - unsigned long tx_delay = 50; 201 199 202 200 switch (event) { 203 201 case ARCNET_LED_EVENT_RECON: 204 - led_trigger_blink_oneshot(lp->recon_led_trig, 205 - &led_delay, &led_delay, 0); 202 + led_trigger_blink_oneshot(lp->recon_led_trig, 350, 350, 0); 206 203 break; 207 204 case ARCNET_LED_EVENT_OPEN: 208 205 led_trigger_event(lp->tx_led_trig, LED_OFF); ··· 210 213 led_trigger_event(lp->recon_led_trig, LED_OFF); 211 214 break; 212 215 case ARCNET_LED_EVENT_TX: 213 - led_trigger_blink_oneshot(lp->tx_led_trig, 214 - &tx_delay, &tx_delay, 0); 216 + led_trigger_blink_oneshot(lp->tx_led_trig, 50, 50, 0); 215 217 break; 216 218 } 217 219 }
+1 -4
drivers/power/supply/power_supply_leds.c
··· 22 22 static void power_supply_update_bat_leds(struct power_supply *psy) 23 23 { 24 24 union power_supply_propval status; 25 - unsigned long delay_on = 0; 26 - unsigned long delay_off = 0; 27 25 28 26 if (power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, &status)) 29 27 return; ··· 40 42 led_trigger_event(psy->charging_full_trig, LED_FULL); 41 43 led_trigger_event(psy->charging_trig, LED_FULL); 42 44 led_trigger_event(psy->full_trig, LED_OFF); 43 - led_trigger_blink(psy->charging_blink_full_solid_trig, 44 - &delay_on, &delay_off); 45 + led_trigger_blink(psy->charging_blink_full_solid_trig, 0, 0); 45 46 break; 46 47 default: 47 48 led_trigger_event(psy->charging_full_trig, LED_OFF);
+1 -3
drivers/usb/common/led.c
··· 14 14 15 15 #define BLINK_DELAY 30 16 16 17 - static unsigned long usb_blink_delay = BLINK_DELAY; 18 - 19 17 DEFINE_LED_TRIGGER(ledtrig_usb_gadget); 20 18 DEFINE_LED_TRIGGER(ledtrig_usb_host); 21 19 ··· 30 32 break; 31 33 } 32 34 /* led_trigger_blink_oneshot() handles trig == NULL gracefully */ 33 - led_trigger_blink_oneshot(trig, &usb_blink_delay, &usb_blink_delay, 0); 35 + led_trigger_blink_oneshot(trig, BLINK_DELAY, BLINK_DELAY, 0); 34 36 } 35 37 EXPORT_SYMBOL_GPL(usb_led_activity); 36 38
+8 -8
include/linux/leds.h
··· 433 433 struct led_trigger **trigger); 434 434 void led_trigger_unregister_simple(struct led_trigger *trigger); 435 435 void led_trigger_event(struct led_trigger *trigger, enum led_brightness event); 436 - void led_trigger_blink(struct led_trigger *trigger, unsigned long *delay_on, 437 - unsigned long *delay_off); 436 + void led_trigger_blink(struct led_trigger *trigger, unsigned long delay_on, 437 + unsigned long delay_off); 438 438 void led_trigger_blink_oneshot(struct led_trigger *trigger, 439 - unsigned long *delay_on, 440 - unsigned long *delay_off, 439 + unsigned long delay_on, 440 + unsigned long delay_off, 441 441 int invert); 442 442 void led_trigger_set_default(struct led_classdev *led_cdev); 443 443 int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger); ··· 487 487 static inline void led_trigger_event(struct led_trigger *trigger, 488 488 enum led_brightness event) {} 489 489 static inline void led_trigger_blink(struct led_trigger *trigger, 490 - unsigned long *delay_on, 491 - unsigned long *delay_off) {} 490 + unsigned long delay_on, 491 + unsigned long delay_off) {} 492 492 static inline void led_trigger_blink_oneshot(struct led_trigger *trigger, 493 - unsigned long *delay_on, 494 - unsigned long *delay_off, 493 + unsigned long delay_on, 494 + unsigned long delay_off, 495 495 int invert) {} 496 496 static inline void led_trigger_set_default(struct led_classdev *led_cdev) {} 497 497 static inline int led_trigger_set(struct led_classdev *led_cdev,
+1 -1
net/mac80211/led.c
··· 282 282 } 283 283 } 284 284 285 - led_trigger_blink(&local->tpt_led, &on, &off); 285 + led_trigger_blink(&local->tpt_led, on, off); 286 286 } 287 287 288 288 const char *
+2 -6
net/mac80211/led.h
··· 13 13 static inline void ieee80211_led_rx(struct ieee80211_local *local) 14 14 { 15 15 #ifdef CONFIG_MAC80211_LEDS 16 - unsigned long led_delay = MAC80211_BLINK_DELAY; 17 - 18 16 if (!atomic_read(&local->rx_led_active)) 19 17 return; 20 - led_trigger_blink_oneshot(&local->rx_led, &led_delay, &led_delay, 0); 18 + led_trigger_blink_oneshot(&local->rx_led, MAC80211_BLINK_DELAY, MAC80211_BLINK_DELAY, 0); 21 19 #endif 22 20 } 23 21 24 22 static inline void ieee80211_led_tx(struct ieee80211_local *local) 25 23 { 26 24 #ifdef CONFIG_MAC80211_LEDS 27 - unsigned long led_delay = MAC80211_BLINK_DELAY; 28 - 29 25 if (!atomic_read(&local->tx_led_active)) 30 26 return; 31 - led_trigger_blink_oneshot(&local->tx_led, &led_delay, &led_delay, 0); 27 + led_trigger_blink_oneshot(&local->tx_led, MAC80211_BLINK_DELAY, MAC80211_BLINK_DELAY, 0); 32 28 #endif 33 29 } 34 30
+1 -2
net/netfilter/xt_LED.c
··· 43 43 { 44 44 const struct xt_led_info *ledinfo = par->targinfo; 45 45 struct xt_led_info_internal *ledinternal = ledinfo->internal_data; 46 - unsigned long led_delay = XT_LED_BLINK_DELAY; 47 46 48 47 /* 49 48 * If "always blink" is enabled, and there's still some time until the ··· 51 52 if ((ledinfo->delay > 0) && ledinfo->always_blink && 52 53 timer_pending(&ledinternal->timer)) 53 54 led_trigger_blink_oneshot(&ledinternal->netfilter_led_trigger, 54 - &led_delay, &led_delay, 1); 55 + XT_LED_BLINK_DELAY, XT_LED_BLINK_DELAY, 1); 55 56 else 56 57 led_trigger_event(&ledinternal->netfilter_led_trigger, LED_FULL); 57 58