Skip to content

Commit c629c97

Browse files
Marek Vasutlag-linaro
authored andcommitted
leds: trigger: netdev: Configure LED blink interval for HW offload
In case a PHY LED implements .blink_set callback to set LED blink interval, call it even if .hw_control is already set, as that LED blink interval likely controls the blink rate of that HW offloaded LED. For PHY LEDs, that can be their activity blinking interval. The software blinking is not affected by this change. With this change, the LED interval setting looks something like this: $ echo netdev > /sys/class/leds/led:green:lan/trigger $ echo 1 > /sys/class/leds/led:green:lan/brightness $ echo 250 > /sys/class/leds/led:green:lan/interval Signed-off-by: Marek Vasut <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Lee Jones <[email protected]>
1 parent 2014c95 commit c629c97

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

drivers/leds/trigger/ledtrig-netdev.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ struct led_netdev_data {
6868
unsigned int last_activity;
6969

7070
unsigned long mode;
71+
unsigned long blink_delay;
7172
int link_speed;
7273
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported_link_modes);
7374
u8 duplex;
@@ -86,6 +87,10 @@ static void set_baseline_state(struct led_netdev_data *trigger_data)
8687
/* Already validated, hw control is possible with the requested mode */
8788
if (trigger_data->hw_control) {
8889
led_cdev->hw_control_set(led_cdev, trigger_data->mode);
90+
if (led_cdev->blink_set) {
91+
led_cdev->blink_set(led_cdev, &trigger_data->blink_delay,
92+
&trigger_data->blink_delay);
93+
}
8994

9095
return;
9196
}
@@ -454,10 +459,11 @@ static ssize_t interval_store(struct device *dev,
454459
size_t size)
455460
{
456461
struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev);
462+
struct led_classdev *led_cdev = trigger_data->led_cdev;
457463
unsigned long value;
458464
int ret;
459465

460-
if (trigger_data->hw_control)
466+
if (trigger_data->hw_control && !led_cdev->blink_set)
461467
return -EINVAL;
462468

463469
ret = kstrtoul(buf, 0, &value);
@@ -466,9 +472,13 @@ static ssize_t interval_store(struct device *dev,
466472

467473
/* impose some basic bounds on the timer interval */
468474
if (value >= 5 && value <= 10000) {
469-
cancel_delayed_work_sync(&trigger_data->work);
475+
if (trigger_data->hw_control) {
476+
trigger_data->blink_delay = value;
477+
} else {
478+
cancel_delayed_work_sync(&trigger_data->work);
470479

471-
atomic_set(&trigger_data->interval, msecs_to_jiffies(value));
480+
atomic_set(&trigger_data->interval, msecs_to_jiffies(value));
481+
}
472482
set_baseline_state(trigger_data); /* resets timer */
473483
}
474484

0 commit comments

Comments
 (0)