From: Richard Purdie Add an LED trigger for IDE disk activity to the ide-disk driver. Signed-off-by: Richard Purdie Cc: Russell King Cc: Bartlomiej Zolnierkiewicz Signed-off-by: Andrew Morton Index: linux-2.6.16/drivers/ide/ide-disk.c =================================================================== --- linux-2.6.16.orig/drivers/ide/ide-disk.c 2006-03-28 17:22:51.000000000 +0100 +++ linux-2.6.16/drivers/ide/ide-disk.c 2006-03-28 17:25:12.000000000 +0100 @@ -60,6 +60,7 @@ #include #include #include +#include #define _IDE_DISK @@ -316,6 +317,8 @@ return ide_stopped; } + ledtrig_ide_activity(); + pr_debug("%s: %sing: block=%llu, sectors=%lu, buffer=0x%08lx\n", drive->name, rq_data_dir(rq) == READ ? "read" : "writ", (unsigned long long)block, rq->nr_sectors, Index: linux-2.6.16/drivers/leds/ledtrig-ide-disk.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6.16/drivers/leds/ledtrig-ide-disk.c 2006-03-28 17:36:43.000000000 +0100 @@ -0,0 +1,62 @@ +/* + * LED IDE-Disk Activity Trigger + * + * Copyright 2006 Openedhand Ltd. + * + * Author: Richard Purdie + * + * 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 +#include +#include +#include +#include + +static void ledtrig_ide_timerfunc(unsigned long data); + +DEFINE_LED_TRIGGER(ledtrig_ide); +static DEFINE_TIMER(ledtrig_ide_timer, ledtrig_ide_timerfunc, 0, 0); +static int ide_activity; +static int ide_lastactivity; + +void ledtrig_ide_activity(void) +{ + ide_activity++; + if (!timer_pending(&ledtrig_ide_timer)) + mod_timer(&ledtrig_ide_timer, jiffies + msecs_to_jiffies(10)); +} +EXPORT_SYMBOL(ledtrig_ide_activity); + +static void ledtrig_ide_timerfunc(unsigned long data) +{ + if (ide_lastactivity != ide_activity) { + ide_lastactivity = ide_activity; + led_trigger_event(ledtrig_ide, LED_FULL); + mod_timer(&ledtrig_ide_timer, jiffies + msecs_to_jiffies(10)); + } else { + led_trigger_event(ledtrig_ide, LED_OFF); + } +} + +static int __init ledtrig_ide_init(void) +{ + led_trigger_register_simple("ide-disk", &ledtrig_ide); + return 0; +} + +static void __exit ledtrig_ide_exit(void) +{ + led_trigger_unregister_simple(ledtrig_ide); +} + +module_init(ledtrig_ide_init); +module_exit(ledtrig_ide_exit); + +MODULE_AUTHOR("Richard Purdie "); +MODULE_DESCRIPTION("LED IDE Disk Activity Trigger"); +MODULE_LICENSE("GPL"); Index: linux-2.6.16/include/linux/leds.h =================================================================== --- linux-2.6.16.orig/include/linux/leds.h 2006-03-28 17:25:12.000000000 +0100 +++ linux-2.6.16/include/linux/leds.h 2006-03-28 17:25:12.000000000 +0100 @@ -98,4 +98,12 @@ #define led_trigger_event(x, y) do {} while(0) #endif + +/* Trigger specific functions */ +#ifdef CONFIG_LEDS_TRIGGER_IDE_DISK +extern void ledtrig_ide_activity(void); +#else +#define ledtrig_ide_activity() do {} while(0) +#endif + #endif /* __LINUX_LEDS_H_INCLUDED */ Index: linux-2.6.16/drivers/leds/Kconfig =================================================================== --- linux-2.6.16.orig/drivers/leds/Kconfig 2006-03-28 17:25:12.000000000 +0100 +++ linux-2.6.16/drivers/leds/Kconfig 2006-03-28 17:25:12.000000000 +0100 @@ -66,5 +66,12 @@ This allows LEDs to be controlled by a programmable timer via sysfs. If unsure, say Y. +config LEDS_TRIGGER_IDE_DISK + bool "LED Timer Trigger" + depends LEDS_TRIGGERS && BLK_DEV_IDEDISK + help + This allows LEDs to be controlled by IDE disk activity. + If unsure, say Y. + endmenu Index: linux-2.6.16/drivers/leds/Makefile =================================================================== --- linux-2.6.16.orig/drivers/leds/Makefile 2006-03-28 17:25:12.000000000 +0100 +++ linux-2.6.16/drivers/leds/Makefile 2006-03-28 17:28:18.000000000 +0100 @@ -13,3 +13,4 @@ # LED Triggers obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o +obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o \ No newline at end of file