diff --git a/drivers/leds/trigger/ledtrig-tty.c b/drivers/leds/trigger/ledtrig-tty.c
index 8ae0d2d284af..6a96439a7e55 100644
--- a/drivers/leds/trigger/ledtrig-tty.c
+++ b/drivers/leds/trigger/ledtrig-tty.c
@@ -16,6 +16,24 @@ struct ledtrig_tty_data {
const char *ttyname;
struct tty_struct *tty;
int rx, tx;
+ unsigned long mode;
Why is mode "unsigned long" when the tty layer treats it as an int? And
really, this should be set to an explit size, u32 perhaps? Or am I
confused as to exactly what this is?
+};
+
+enum led_trigger_tty_state {
+ TTY_LED_BLINK,
+ TTY_LED_ENABLE,
+ TTY_LED_DISABLE,
+};
+
+enum led_trigger_tty_modes {
+ TRIGGER_TTY_RX = 0,
+ TRIGGER_TTY_TX,
+ TRIGGER_TTY_CTS,
+ TRIGGER_TTY_DSR,
+ TRIGGER_TTY_CAR,
+ TRIGGER_TTY_RNG,
+ /* Keep last */
+ __TRIGGER_TTY_MAX,
};
Oh wait, is "mode" this? If so, why not define it as an enum? Or if
not, I'm totally confused as to what is going on here, sorry.
static void ledtrig_tty_restart(struct ledtrig_tty_data *trigger_data)
@@ -78,13 +96,106 @@ static ssize_t ttyname_store(struct device *dev,
}
static DEVICE_ATTR_RW(ttyname);
+static ssize_t ledtrig_tty_attr_show(struct device *dev, char *buf,
+ enum led_trigger_tty_modes attr)
+{
+ struct ledtrig_tty_data *trigger_data = led_trigger_get_drvdata(dev);
+ int bit;
+
+ switch (attr) {
+ case TRIGGER_TTY_RX:
+ case TRIGGER_TTY_TX:
+ case TRIGGER_TTY_CTS:
+ case TRIGGER_TTY_DSR:
+ case TRIGGER_TTY_CAR:
+ case TRIGGER_TTY_RNG:
+ bit = attr;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return sprintf(buf, "%u\n", test_bit(bit, &trigger_data->mode));
sysfs_emit() for all new sysfs attributes please.
+}
+
+static ssize_t ledtrig_tty_attr_store(struct device *dev, const char *buf,
+ size_t size, enum led_trigger_tty_modes attr)
+{
+ struct ledtrig_tty_data *trigger_data = led_trigger_get_drvdata(dev);
+ unsigned long state;
+ int ret;
+ int bit;
+
+ ret = kstrtoul(buf, 0, &state);
+ if (ret)
+ return ret;
+
+ switch (attr) {
+ case TRIGGER_TTY_RX:
+ case TRIGGER_TTY_TX:
+ case TRIGGER_TTY_CTS:
+ case TRIGGER_TTY_DSR:
+ case TRIGGER_TTY_CAR:
+ case TRIGGER_TTY_RNG:
+ bit = attr;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (state)
+ set_bit(bit, &trigger_data->mode);
+ else
+ clear_bit(bit, &trigger_data->mode);
I think your test of "state" here is wrong, if you write in "40000" you
are treating it as "1", which I don't think you want, right?