[PATCH] leds: trigger/tty: Add knob to blink only for tx or only for rx

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The newly introduced "triggerevent" attribute allows to restrict
blinking to TX or RX only.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx>
---
 .../ABI/testing/sysfs-class-led-trigger-tty   |  9 +++
 drivers/leds/trigger/ledtrig-tty.c            | 60 ++++++++++++++++++-
 2 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-class-led-trigger-tty b/Documentation/ABI/testing/sysfs-class-led-trigger-tty
index 2bf6b24e781b..27532f685b0d 100644
--- a/Documentation/ABI/testing/sysfs-class-led-trigger-tty
+++ b/Documentation/ABI/testing/sysfs-class-led-trigger-tty
@@ -4,3 +4,12 @@ KernelVersion:	5.10
 Contact:	linux-leds@xxxxxxxxxxxxxxx
 Description:
 		Specifies the tty device name of the triggering tty
+
+What:		/sys/class/leds/<led>/triggerevent
+Date:		Feb 2022
+KernelVersion:	5.18
+Contact:	linux-leds@xxxxxxxxxxxxxxx
+Description:
+		Can contain "tx', "rx" (to only blink on transfers
+		in the specified direction) or "both" (to blink for
+		both directions.)
diff --git a/drivers/leds/trigger/ledtrig-tty.c b/drivers/leds/trigger/ledtrig-tty.c
index f62db7e520b5..f87877ca48d4 100644
--- a/drivers/leds/trigger/ledtrig-tty.c
+++ b/drivers/leds/trigger/ledtrig-tty.c
@@ -14,6 +14,7 @@ struct ledtrig_tty_data {
 	const char *ttyname;
 	struct tty_struct *tty;
 	int rx, tx;
+	bool handle_rx, handle_tx;
 };
 
 static void ledtrig_tty_restart(struct ledtrig_tty_data *trigger_data)
@@ -76,6 +77,57 @@ static ssize_t ttyname_store(struct device *dev,
 }
 static DEVICE_ATTR_RW(ttyname);
 
+static ssize_t triggerevent_show(struct device *dev,
+				 struct device_attribute *attr, char *buf)
+{
+	struct ledtrig_tty_data *trigger_data = led_trigger_get_drvdata(dev);
+	ssize_t len = 0;
+
+	mutex_lock(&trigger_data->mutex);
+
+	if (trigger_data->handle_tx && trigger_data->handle_rx)
+		len = sprintf(buf, "both\n");
+	else if (trigger_data->handle_tx)
+		len = sprintf(buf, "tx\n");
+	else
+		len = sprintf(buf, "rx\n");
+
+	mutex_unlock(&trigger_data->mutex);
+
+	return len;
+}
+
+static ssize_t triggerevent_store(struct device *dev,
+				  struct device_attribute *attr,
+				  const char *buf, size_t size)
+{
+	struct ledtrig_tty_data *trigger_data = led_trigger_get_drvdata(dev);
+	ssize_t ret = size;
+
+	if (size > 0 && buf[size - 1] == '\n')
+		size -= 1;
+
+	mutex_lock(&trigger_data->mutex);
+
+	if (!strncmp(buf, "both", size)) {
+		trigger_data->handle_tx = true;
+		trigger_data->handle_rx = true;
+	} else if (!strncmp(buf, "tx", size)) {
+		trigger_data->handle_tx = true;
+		trigger_data->handle_rx = false;
+	} else if (!strncmp(buf, "rx", size)) {
+		trigger_data->handle_tx = false;
+		trigger_data->handle_rx = true;
+	} else {
+		ret = -EINVAL;
+	}
+
+	mutex_unlock(&trigger_data->mutex);
+
+	return ret;
+}
+static DEVICE_ATTR_RW(triggerevent);
+
 static void ledtrig_tty_work(struct work_struct *work)
 {
 	struct ledtrig_tty_data *trigger_data =
@@ -120,8 +172,8 @@ static void ledtrig_tty_work(struct work_struct *work)
 		return;
 	}
 
-	if (icount.rx != trigger_data->rx ||
-	    icount.tx != trigger_data->tx) {
+	if ((icount.rx != trigger_data->rx && trigger_data->handle_rx) ||
+	    (icount.tx != trigger_data->tx && trigger_data->handle_tx)) {
 		led_set_brightness_sync(trigger_data->led_cdev, LED_ON);
 
 		trigger_data->rx = icount.rx;
@@ -137,6 +189,7 @@ static void ledtrig_tty_work(struct work_struct *work)
 
 static struct attribute *ledtrig_tty_attrs[] = {
 	&dev_attr_ttyname.attr,
+	&dev_attr_triggerevent.attr,
 	NULL
 };
 ATTRIBUTE_GROUPS(ledtrig_tty);
@@ -155,6 +208,9 @@ static int ledtrig_tty_activate(struct led_classdev *led_cdev)
 	trigger_data->led_cdev = led_cdev;
 	mutex_init(&trigger_data->mutex);
 
+	trigger_data->handle_tx = true;
+	trigger_data->handle_rx = true;
+
 	return 0;
 }
 
-- 
2.34.1




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux