]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
leds: trigger: netdev: init mode if hw control already active
authorChristian Marangi <ansuelsmth@gmail.com>
Mon, 29 May 2023 16:32:40 +0000 (18:32 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 May 2023 08:42:09 +0000 (09:42 +0100)
On netdev trigger activation, hw control may be already active by
default. If this is the case and a device is actually provided by
hw_control_get_device(), init the already active mode and set the
bool to hw_control bool to true to reflect the already set mode in the
trigger_data.

Co-developed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/leds/trigger/ledtrig-netdev.c

index 0f3c2ace408d1541e81bcfb163504099d1072ebd..e8bb9d0f85c06949b7d3edaf8c5967d5dfeea64f 100644 (file)
@@ -454,6 +454,8 @@ static void netdev_trig_work(struct work_struct *work)
 static int netdev_trig_activate(struct led_classdev *led_cdev)
 {
        struct led_netdev_data *trigger_data;
+       unsigned long mode;
+       struct device *dev;
        int rc;
 
        trigger_data = kzalloc(sizeof(struct led_netdev_data), GFP_KERNEL);
@@ -475,6 +477,21 @@ static int netdev_trig_activate(struct led_classdev *led_cdev)
        atomic_set(&trigger_data->interval, msecs_to_jiffies(NETDEV_LED_DEFAULT_INTERVAL));
        trigger_data->last_activity = 0;
 
+       /* Check if hw control is active by default on the LED.
+        * Init already enabled mode in hw control.
+        */
+       if (supports_hw_control(led_cdev) &&
+           !led_cdev->hw_control_get(led_cdev, &mode)) {
+               dev = led_cdev->hw_control_get_device(led_cdev);
+               if (dev) {
+                       const char *name = dev_name(dev);
+
+                       set_device_name(trigger_data, name, strlen(name));
+                       trigger_data->hw_control = true;
+                       trigger_data->mode = mode;
+               }
+       }
+
        led_set_trigger_data(led_cdev, trigger_data);
 
        rc = register_netdevice_notifier(&trigger_data->notifier);