From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: Pavel Machek <pavel@ucw.cz>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-leds@vger.kernel.org, kernel@pengutronix.de
Subject: [PATCH] leds: trigger/tty: Add knob to blink only for tx or only for rx
Date: Thu, 24 Feb 2022 16:56:55 +0100 [thread overview]
Message-ID: <20220224155655.702255-1-u.kleine-koenig@pengutronix.de> (raw)
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
next reply other threads:[~2022-02-24 15:57 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-24 15:56 Uwe Kleine-König [this message]
2022-02-25 9:32 ` [PATCH] leds: trigger/tty: Add knob to blink only for tx or only for rx 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220224155655.702255-1-u.kleine-koenig@pengutronix.de \
--to=u.kleine-koenig@pengutronix.de \
--cc=gregkh@linuxfoundation.org \
--cc=kernel@pengutronix.de \
--cc=linux-leds@vger.kernel.org \
--cc=pavel@ucw.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).