2 * LED support code, ripped out of arch/arm/kernel/time.c
4 * Copyright (C) 1994-2001 Russell King
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 #include <linux/export.h>
11 #include <linux/init.h>
12 #include <linux/sysdev.h>
13 #include <linux/syscore_ops.h>
14 #include <linux/string.h>
18 static void dummy_leds_event(led_event_t evt
)
22 void (*leds_event
)(led_event_t
) = dummy_leds_event
;
24 struct leds_evt_name
{
30 static const struct leds_evt_name evt_names
[] = {
31 { "amber", led_amber_on
, led_amber_off
},
32 { "blue", led_blue_on
, led_blue_off
},
33 { "green", led_green_on
, led_green_off
},
34 { "red", led_red_on
, led_red_off
},
37 static ssize_t
leds_store(struct sys_device
*dev
,
38 struct sysdev_attribute
*attr
,
39 const char *buf
, size_t size
)
41 int ret
= -EINVAL
, len
= strcspn(buf
, " ");
43 if (len
> 0 && buf
[len
] == '\0')
46 if (strncmp(buf
, "claim", len
) == 0) {
47 leds_event(led_claim
);
49 } else if (strncmp(buf
, "release", len
) == 0) {
50 leds_event(led_release
);
55 for (i
= 0; i
< ARRAY_SIZE(evt_names
); i
++) {
56 if (strlen(evt_names
[i
].name
) != len
||
57 strncmp(buf
, evt_names
[i
].name
, len
) != 0)
59 if (strncmp(buf
+len
, " on", 3) == 0) {
60 leds_event(evt_names
[i
].on
);
62 } else if (strncmp(buf
+len
, " off", 4) == 0) {
63 leds_event(evt_names
[i
].off
);
72 static SYSDEV_ATTR(event
, 0200, NULL
, leds_store
);
74 static struct sysdev_class leds_sysclass
= {
78 static struct sys_device leds_device
= {
80 .cls
= &leds_sysclass
,
83 static int leds_suspend(void)
89 static void leds_resume(void)
91 leds_event(led_start
);
94 static void leds_shutdown(void)
96 leds_event(led_halted
);
99 static struct syscore_ops leds_syscore_ops
= {
100 .shutdown
= leds_shutdown
,
101 .suspend
= leds_suspend
,
102 .resume
= leds_resume
,
105 static int __init
leds_init(void)
108 ret
= sysdev_class_register(&leds_sysclass
);
110 ret
= sysdev_register(&leds_device
);
112 ret
= sysdev_create_file(&leds_device
, &attr_event
);
114 register_syscore_ops(&leds_syscore_ops
);
118 device_initcall(leds_init
);
120 EXPORT_SYMBOL(leds_event
);