Loading...
Note: File does not exist in v6.8.
1/*
2 * LED support code, ripped out of arch/arm/kernel/time.c
3 *
4 * Copyright (C) 1994-2001 Russell King
5 *
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.
9 */
10#include <linux/module.h>
11#include <linux/init.h>
12#include <linux/sysdev.h>
13#include <linux/syscore_ops.h>
14
15#include <asm/leds.h>
16
17static void dummy_leds_event(led_event_t evt)
18{
19}
20
21void (*leds_event)(led_event_t) = dummy_leds_event;
22
23struct leds_evt_name {
24 const char name[8];
25 int on;
26 int off;
27};
28
29static const struct leds_evt_name evt_names[] = {
30 { "amber", led_amber_on, led_amber_off },
31 { "blue", led_blue_on, led_blue_off },
32 { "green", led_green_on, led_green_off },
33 { "red", led_red_on, led_red_off },
34};
35
36static ssize_t leds_store(struct sys_device *dev,
37 struct sysdev_attribute *attr,
38 const char *buf, size_t size)
39{
40 int ret = -EINVAL, len = strcspn(buf, " ");
41
42 if (len > 0 && buf[len] == '\0')
43 len--;
44
45 if (strncmp(buf, "claim", len) == 0) {
46 leds_event(led_claim);
47 ret = size;
48 } else if (strncmp(buf, "release", len) == 0) {
49 leds_event(led_release);
50 ret = size;
51 } else {
52 int i;
53
54 for (i = 0; i < ARRAY_SIZE(evt_names); i++) {
55 if (strlen(evt_names[i].name) != len ||
56 strncmp(buf, evt_names[i].name, len) != 0)
57 continue;
58 if (strncmp(buf+len, " on", 3) == 0) {
59 leds_event(evt_names[i].on);
60 ret = size;
61 } else if (strncmp(buf+len, " off", 4) == 0) {
62 leds_event(evt_names[i].off);
63 ret = size;
64 }
65 break;
66 }
67 }
68 return ret;
69}
70
71static SYSDEV_ATTR(event, 0200, NULL, leds_store);
72
73static struct sysdev_class leds_sysclass = {
74 .name = "leds",
75};
76
77static struct sys_device leds_device = {
78 .id = 0,
79 .cls = &leds_sysclass,
80};
81
82static int leds_suspend(void)
83{
84 leds_event(led_stop);
85 return 0;
86}
87
88static void leds_resume(void)
89{
90 leds_event(led_start);
91}
92
93static void leds_shutdown(void)
94{
95 leds_event(led_halted);
96}
97
98static struct syscore_ops leds_syscore_ops = {
99 .shutdown = leds_shutdown,
100 .suspend = leds_suspend,
101 .resume = leds_resume,
102};
103
104static int __init leds_init(void)
105{
106 int ret;
107 ret = sysdev_class_register(&leds_sysclass);
108 if (ret == 0)
109 ret = sysdev_register(&leds_device);
110 if (ret == 0)
111 ret = sysdev_create_file(&leds_device, &attr_event);
112 if (ret == 0)
113 register_syscore_ops(&leds_syscore_ops);
114 return ret;
115}
116
117device_initcall(leds_init);
118
119EXPORT_SYMBOL(leds_event);