diff options
author | Todd Doucet <todd.doucet@timesys.com> | 2010-02-03 17:06:33 -0500 |
---|---|---|
committer | Todd Doucet <todd.doucet@timesys.com> | 2010-02-03 17:06:33 -0500 |
commit | ff238a4df84428befc55d49f58864dfc47ff853d (patch) | |
tree | 8796b828b396f5b7ed017904ff77b614dbf38677 /drivers/leds/ledtrig-dim.c | |
parent | 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 (diff) |
Kernel as received from Digi for their Wi-Mx51 SoC running on their
CCWMX51JS carrier board.
Diffstat (limited to 'drivers/leds/ledtrig-dim.c')
-rw-r--r-- | drivers/leds/ledtrig-dim.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/drivers/leds/ledtrig-dim.c b/drivers/leds/ledtrig-dim.c new file mode 100644 index 000000000000..04dbaf66a49e --- /dev/null +++ b/drivers/leds/ledtrig-dim.c @@ -0,0 +1,95 @@ +/* + * LED Dim Trigger + * + * Copyright (C) 2008 Bill Gatliff <bgat <at> billgatliff.com> + * + * "Dims" an LED based on system load. Derived from Atsushi Nemoto's + * ledtrig-heartbeat.c. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/timer.h> +#include <linux/sched.h> +#include <linux/leds.h> + +#include "leds.h" + +struct dim_trig_data { + struct timer_list timer; +}; + + +static void +led_dim_function(unsigned long data) +{ + struct led_classdev *led_cdev = (struct led_classdev *)data; + struct dim_trig_data *dim_data = led_cdev->trigger_data; + unsigned int brightness; + + brightness = ((LED_FULL - LED_OFF) * avenrun[0]) / EXP_1; + if (brightness > LED_FULL) + brightness = LED_FULL; + + led_set_brightness(led_cdev, brightness); + mod_timer(&dim_data->timer, jiffies + msecs_to_jiffies(500)); +} + + +static void +dim_trig_activate(struct led_classdev *led_cdev) +{ + struct dim_trig_data *dim_data; + + dim_data = kzalloc(sizeof(*dim_data), GFP_KERNEL); + if (!dim_data) + return; + + led_cdev->trigger_data = dim_data; + setup_timer(&dim_data->timer, + led_dim_function, (unsigned long)led_cdev); + led_dim_function(dim_data->timer.data); +} + + +static void +dim_trig_deactivate(struct led_classdev *led_cdev) +{ + struct dim_trig_data *dim_data = led_cdev->trigger_data; + + if (dim_data) { + del_timer_sync(&dim_data->timer); + kfree(dim_data); + } +} + + +static struct led_trigger dim_led_trigger = { + .name = "dim", + .activate = dim_trig_activate, + .deactivate = dim_trig_deactivate, +}; + + +static int __init dim_trig_init(void) +{ + return led_trigger_register(&dim_led_trigger); +} +module_init(dim_trig_init); + + +static void __exit dim_trig_exit(void) +{ + led_trigger_unregister(&dim_led_trigger); +} +module_exit(dim_trig_exit); + + +MODULE_AUTHOR("Bill Gatliff <bgat <at> billgatliff.com>"); +MODULE_DESCRIPTION("Dim LED trigger"); +MODULE_LICENSE("GPL"); |