Linux Audio

Check our new training course

Loading...
v3.1
  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);
v3.5.6
  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/export.h>
 11#include <linux/init.h>
 12#include <linux/device.h>
 13#include <linux/syscore_ops.h>
 14#include <linux/string.h>
 15
 16#include <asm/leds.h>
 17
 18static void dummy_leds_event(led_event_t evt)
 19{
 20}
 21
 22void (*leds_event)(led_event_t) = dummy_leds_event;
 23
 24struct leds_evt_name {
 25	const char	name[8];
 26	int		on;
 27	int		off;
 28};
 29
 30static 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   },
 35};
 36
 37static ssize_t leds_store(struct device *dev,
 38			struct device_attribute *attr,
 39			const char *buf, size_t size)
 40{
 41	int ret = -EINVAL, len = strcspn(buf, " ");
 42
 43	if (len > 0 && buf[len] == '\0')
 44		len--;
 45
 46	if (strncmp(buf, "claim", len) == 0) {
 47		leds_event(led_claim);
 48		ret = size;
 49	} else if (strncmp(buf, "release", len) == 0) {
 50		leds_event(led_release);
 51		ret = size;
 52	} else {
 53		int i;
 54
 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)
 58				continue;
 59			if (strncmp(buf+len, " on", 3) == 0) {
 60				leds_event(evt_names[i].on);
 61				ret = size;
 62			} else if (strncmp(buf+len, " off", 4) == 0) {
 63				leds_event(evt_names[i].off);
 64				ret = size;
 65			}
 66			break;
 67		}
 68	}
 69	return ret;
 70}
 71
 72static DEVICE_ATTR(event, 0200, NULL, leds_store);
 73
 74static struct bus_type leds_subsys = {
 75	.name		= "leds",
 76	.dev_name	= "leds",
 77};
 78
 79static struct device leds_device = {
 80	.id		= 0,
 81	.bus		= &leds_subsys,
 82};
 83
 84static int leds_suspend(void)
 85{
 86	leds_event(led_stop);
 87	return 0;
 88}
 89
 90static void leds_resume(void)
 91{
 92	leds_event(led_start);
 93}
 94
 95static void leds_shutdown(void)
 96{
 97	leds_event(led_halted);
 98}
 99
100static struct syscore_ops leds_syscore_ops = {
101	.shutdown	= leds_shutdown,
102	.suspend	= leds_suspend,
103	.resume		= leds_resume,
104};
105
106static int __init leds_init(void)
107{
108	int ret;
109	ret = subsys_system_register(&leds_subsys, NULL);
110	if (ret == 0)
111		ret = device_register(&leds_device);
112	if (ret == 0)
113		ret = device_create_file(&leds_device, &dev_attr_event);
114	if (ret == 0)
115		register_syscore_ops(&leds_syscore_ops);
116	return ret;
117}
118
119device_initcall(leds_init);
120
121EXPORT_SYMBOL(leds_event);