0a4b309f41
Backport initial LEDs hw control support. Currently this is limited to only rx/tx and link events for the netdev trigger but the API got accepted and the additional modes are working on and will be backported later. Refresh every patch and add the additional config flag for QCA8K new LEDs support. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
107 lines
3.1 KiB
Diff
107 lines
3.1 KiB
Diff
From d1b9e1391ab2dc80e9db87fe8b2de015c651e4c9 Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Wed, 19 Apr 2023 23:07:43 +0200
|
|
Subject: [PATCH 5/5] leds: trigger: netdev: Use mutex instead of spinlocks
|
|
|
|
Some LEDs may require to sleep while doing some operation like setting
|
|
brightness and other cleanup.
|
|
|
|
For this reason, using a spinlock will cause a sleep under spinlock
|
|
warning.
|
|
|
|
It should be safe to convert this to a sleepable lock since:
|
|
- sysfs read/write can sleep
|
|
- netdev_trig_work is a work queue and can sleep
|
|
- netdev _trig_notify can sleep
|
|
|
|
The spinlock was used when brightness didn't support sleeping, but this
|
|
changed and now it supported with brightness_set_blocking().
|
|
|
|
Convert to mutex lock to permit sleeping using brightness_set_blocking().
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
|
|
Signed-off-by: Lee Jones <lee@kernel.org>
|
|
Link: https://lore.kernel.org/r/20230419210743.3594-6-ansuelsmth@gmail.com
|
|
---
|
|
drivers/leds/trigger/ledtrig-netdev.c | 18 +++++++++---------
|
|
1 file changed, 9 insertions(+), 9 deletions(-)
|
|
|
|
--- a/drivers/leds/trigger/ledtrig-netdev.c
|
|
+++ b/drivers/leds/trigger/ledtrig-netdev.c
|
|
@@ -20,7 +20,7 @@
|
|
#include <linux/list.h>
|
|
#include <linux/module.h>
|
|
#include <linux/netdevice.h>
|
|
-#include <linux/spinlock.h>
|
|
+#include <linux/mutex.h>
|
|
#include <linux/timer.h>
|
|
#include "../leds.h"
|
|
|
|
@@ -37,7 +37,7 @@
|
|
*/
|
|
|
|
struct led_netdev_data {
|
|
- spinlock_t lock;
|
|
+ struct mutex lock;
|
|
|
|
struct delayed_work work;
|
|
struct notifier_block notifier;
|
|
@@ -97,9 +97,9 @@ static ssize_t device_name_show(struct d
|
|
struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev);
|
|
ssize_t len;
|
|
|
|
- spin_lock_bh(&trigger_data->lock);
|
|
+ mutex_lock(&trigger_data->lock);
|
|
len = sprintf(buf, "%s\n", trigger_data->device_name);
|
|
- spin_unlock_bh(&trigger_data->lock);
|
|
+ mutex_unlock(&trigger_data->lock);
|
|
|
|
return len;
|
|
}
|
|
@@ -115,7 +115,7 @@ static ssize_t device_name_store(struct
|
|
|
|
cancel_delayed_work_sync(&trigger_data->work);
|
|
|
|
- spin_lock_bh(&trigger_data->lock);
|
|
+ mutex_lock(&trigger_data->lock);
|
|
|
|
if (trigger_data->net_dev) {
|
|
dev_put(trigger_data->net_dev);
|
|
@@ -138,7 +138,7 @@ static ssize_t device_name_store(struct
|
|
trigger_data->last_activity = 0;
|
|
|
|
set_baseline_state(trigger_data);
|
|
- spin_unlock_bh(&trigger_data->lock);
|
|
+ mutex_unlock(&trigger_data->lock);
|
|
|
|
return size;
|
|
}
|
|
@@ -279,7 +279,7 @@ static int netdev_trig_notify(struct not
|
|
|
|
cancel_delayed_work_sync(&trigger_data->work);
|
|
|
|
- spin_lock_bh(&trigger_data->lock);
|
|
+ mutex_lock(&trigger_data->lock);
|
|
|
|
trigger_data->carrier_link_up = false;
|
|
switch (evt) {
|
|
@@ -304,7 +304,7 @@ static int netdev_trig_notify(struct not
|
|
|
|
set_baseline_state(trigger_data);
|
|
|
|
- spin_unlock_bh(&trigger_data->lock);
|
|
+ mutex_unlock(&trigger_data->lock);
|
|
|
|
return NOTIFY_DONE;
|
|
}
|
|
@@ -365,7 +365,7 @@ static int netdev_trig_activate(struct l
|
|
if (!trigger_data)
|
|
return -ENOMEM;
|
|
|
|
- spin_lock_init(&trigger_data->lock);
|
|
+ mutex_init(&trigger_data->lock);
|
|
|
|
trigger_data->notifier.notifier_call = netdev_trig_notify;
|
|
trigger_data->notifier.priority = 10;
|