]> git.hungrycats.org Git - linux/commitdiff
[ARM] Provide userspace method for controlling LEDs in ARM machines.
authorRussell King <rmk@flint.arm.linux.org.uk>
Mon, 15 Mar 2004 17:07:21 +0000 (17:07 +0000)
committerRussell King <rmk@flint.arm.linux.org.uk>
Mon, 15 Mar 2004 17:07:21 +0000 (17:07 +0000)
arch/arm/kernel/time.c

index ab22dffbdc5ce8eff0c321dc8ad71bf5ef245029..bfed0f453304f20de2eb288e823483a49ab0dddd 100644 (file)
@@ -143,6 +143,54 @@ static void dummy_leds_event(led_event_t evt)
 
 void (*leds_event)(led_event_t) = dummy_leds_event;
 
+struct leds_evt_name {
+       const char      name[8];
+       int             on;
+       int             off;
+};
+
+static const struct leds_evt_name evt_names[] = {
+       { "amber", led_amber_on, led_amber_off },
+       { "blue",  led_blue_on,  led_blue_off  },
+       { "green", led_green_on, led_green_off },
+       { "red",   led_red_on,   led_red_off   },
+};
+
+static ssize_t leds_store(struct sys_device *dev, const char *buf, size_t size)
+{
+       int ret = -EINVAL, len = strcspn(buf, " ");
+
+       if (len > 0 && buf[len] == '\0')
+               len--;
+
+       if (strncmp(buf, "claim", len) == 0) {
+               leds_event(led_claim);
+               ret = size;
+       } else if (strncmp(buf, "release", len) == 0) {
+               leds_event(led_release);
+               ret = size;
+       } else {
+               int i;
+
+               for (i = 0; i < ARRAY_SIZE(evt_names); i++) {
+                       if (strlen(evt_names[i].name) != len ||
+                           strncmp(buf, evt_names[i].name, len) != 0)
+                               continue;
+                       if (strncmp(buf+len, " on", 3) == 0) {
+                               leds_event(evt_names[i].on);
+                               ret = size;
+                       } else if (strncmp(buf+len, " off", 4) == 0) {
+                               leds_event(evt_names[i].off);
+                               ret = size;
+                       }
+                       break;
+               }
+       }
+       return ret;
+}
+
+static SYSDEV_ATTR(event, 0200, NULL, leds_store);
+
 static int leds_suspend(struct sys_device *dev, u32 state)
 {
        leds_event(led_stop);
@@ -179,6 +227,8 @@ static int __init leds_init(void)
        ret = sysdev_class_register(&leds_sysclass);
        if (ret == 0)
                ret = sysdev_register(&leds_device);
+       if (ret == 0)
+               ret = sysdev_create_file(&leds_device, &attr_event);
        return ret;
 }