linux-leds.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] leds: trigger/tty: Add knob to blink only for tx or only for rx
@ 2022-02-24 15:56 Uwe Kleine-König
  2022-02-25  9:32 ` Alexander Dahl
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Uwe Kleine-König @ 2022-02-24 15:56 UTC (permalink / raw)
  To: Pavel Machek; +Cc: Greg Kroah-Hartman, linux-leds, kernel

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

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
 .../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@vger.kernel.org
 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@vger.kernel.org
+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


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-02-23 20:00 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-02-24 15:56 [PATCH] leds: trigger/tty: Add knob to blink only for tx or only for rx Uwe Kleine-König
2022-02-25  9:32 ` Alexander Dahl
2022-02-25  9:46   ` Uwe Kleine-König
2022-04-20 16:29 ` Uwe Kleine-König
2022-05-04 17:23   ` Pavel Machek
2023-02-23 15:17 ` Alexander Dahl
2023-02-23 20:00   ` Pavel Machek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).