[PATCH] Update the IDE led trigger to generic disk activity diff --git a/drivers/leds/ledtrig-disk.c b/drivers/leds/ledtrig-disk.c new file mode 100644 index 0000000..fb5e1f5 --- /dev/null +++ b/drivers/leds/ledtrig-disk.c @@ -0,0 +1,64 @@ +/* + * LED 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 +#include + +static void ledtrig_disk_timerfunc(unsigned long data); + +DEFINE_LED_TRIGGER(ledtrig_disk); +static DEFINE_TIMER(ledtrig_disk_timer, ledtrig_disk_timerfunc, 0, 0); +static int disk_activity; +static int disk_lastactivity; + +void ledtrig_disk_activity(void) +{ + disk_activity++; + if (!timer_pending(&ledtrig_disk_timer)) + mod_timer(&ledtrig_disk_timer, jiffies + msecs_to_jiffies(10)); +} +EXPORT_SYMBOL(ledtrig_disk_activity); + +static void ledtrig_disk_timerfunc(unsigned long data) +{ + if (disk_lastactivity != disk_activity) { + disk_lastactivity = disk_activity; + /* INT_MAX will set each LED to its maximum brightness */ + led_trigger_event(ledtrig_disk, INT_MAX); + mod_timer(&ledtrig_disk_timer, jiffies + msecs_to_jiffies(10)); + } else { + led_trigger_event(ledtrig_disk, LED_OFF); + } +} + +static int __init ledtrig_disk_init(void) +{ + led_trigger_register_simple("disk-activity", &ledtrig_disk); + return 0; +} + +static void __exit ledtrig_disk_exit(void) +{ + led_trigger_unregister_simple(ledtrig_disk); +} + +module_init(ledtrig_disk_init); +module_exit(ledtrig_disk_exit); + +MODULE_AUTHOR("Richard Purdie "); +MODULE_DESCRIPTION("LED IDE Disk Activity Trigger"); +MODULE_LICENSE("GPL"); diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig index f8b394a..cff5d4e 100644 --- a/arch/powerpc/configs/pmac32_defconfig +++ b/arch/powerpc/configs/pmac32_defconfig @@ -180,7 +180,7 @@ CONFIG_ADB=y CONFIG_ADB_CUDA=y CONFIG_ADB_PMU=y CONFIG_ADB_PMU_LED=y -CONFIG_ADB_PMU_LED_IDE=y +CONFIG_ADB_PMU_LED_DISK=y CONFIG_PMAC_APM_EMU=m CONFIG_PMAC_MEDIABAY=y CONFIG_PMAC_BACKLIGHT=y diff --git a/arch/powerpc/configs/ppc6xx_defconfig b/arch/powerpc/configs/ppc6xx_defconfig index c47f2be..afd3ac7 100644 --- a/arch/powerpc/configs/ppc6xx_defconfig +++ b/arch/powerpc/configs/ppc6xx_defconfig @@ -471,7 +471,7 @@ CONFIG_ADB=y CONFIG_ADB_CUDA=y CONFIG_ADB_PMU=y CONFIG_ADB_PMU_LED=y -CONFIG_ADB_PMU_LED_IDE=y +CONFIG_ADB_PMU_LED_DISK=y CONFIG_PMAC_APM_EMU=y CONFIG_PMAC_MEDIABAY=y CONFIG_PMAC_BACKLIGHT=y diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index cd20cf1..5f3b5be 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -66,6 +66,7 @@ #include #include #include +#include #include #include "libata.h" @@ -4844,6 +4845,9 @@ static void ata_verify_xfer(struct ata_queued_cmd *qc) void ata_qc_complete(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; + + /* Trigger the LED (if available) */ + ledtrig_disk_activity(); /* XXX: New EH and old EH use different mechanisms to * synchronize EH with regular execution path. diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 16f69be..196a6d6 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -186,7 +186,7 @@ static ide_startstop_t ide_do_rw_disk(ide_drive_t *drive, struct request *rq, BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED); BUG_ON(rq->cmd_type != REQ_TYPE_FS); - ledtrig_ide_activity(); + ledtrig_disk_activity(); pr_debug("%s: %sing: block=%llu, sectors=%u, buffer=0x%08lx\n", drive->name, rq_data_dir(rq) == READ ? "read" : "writ", diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 8f1ccfe..14c78ca 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -432,12 +432,12 @@ config LEDS_TRIGGER_TIMER If unsure, say Y. -config LEDS_TRIGGER_IDE_DISK - bool "LED IDE Disk Trigger" - depends on IDE_GD_ATA +config LEDS_TRIGGER_DISK + bool "LED Disk Trigger" + depends on IDE_GD_ATA || ATA depends on LEDS_TRIGGERS help - This allows LEDs to be controlled by IDE disk activity. + This allows LEDs to be controlled by disk activity. If unsure, say Y. config LEDS_TRIGGER_HEARTBEAT diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index df48868..8a2c740 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -52,7 +52,7 @@ obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o # LED Triggers obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o -obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o +obj-$(CONFIG_LEDS_TRIGGER_DISK) += ledtrig-disk.o obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) += ledtrig-backlight.o obj-$(CONFIG_LEDS_TRIGGER_GPIO) += ledtrig-gpio.o diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index fa51af1..d766848 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig @@ -96,18 +96,17 @@ config ADB_PMU_LED Support the front LED on Power/iBooks as a generic LED that can be triggered by any of the supported triggers. To get the behaviour of the old CONFIG_BLK_DEV_IDE_PMAC_BLINK, select this - and the ide-disk LED trigger and configure appropriately through - sysfs. + and the disk LED trigger and configure appropriately through sysfs. -config ADB_PMU_LED_IDE - bool "Use front LED as IDE LED by default" +config ADB_PMU_LED_DISK + bool "Use front LED as a DISK LED by default" depends on ADB_PMU_LED depends on LEDS_CLASS select LEDS_TRIGGERS - select LEDS_TRIGGER_IDE_DISK + select LEDS_TRIGGER_DISK help - This option makes the front LED default to the IDE trigger - so that it blinks on IDE activity. + This option makes the front LED default to the disk trigger + so that it blinks on disk activity. config PMAC_SMU bool "Support for SMU based PowerMacs" diff --git a/drivers/macintosh/via-pmu-led.c b/drivers/macintosh/via-pmu-led.c index 19c3718..ae067ab 100644 --- a/drivers/macintosh/via-pmu-led.c +++ b/drivers/macintosh/via-pmu-led.c @@ -73,8 +73,8 @@ static void pmu_led_set(struct led_classdev *led_cdev, static struct led_classdev pmu_led = { .name = "pmu-led::front", -#ifdef CONFIG_ADB_PMU_LED_IDE - .default_trigger = "ide-disk", +#ifdef CONFIG_ADB_PMU_LED_DISK + .default_trigger = "disk-activity", #endif .brightness_set = pmu_led_set, }; diff --git a/include/linux/leds.h b/include/linux/leds.h index 23f20fd..5e1310c 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h @@ -161,10 +161,10 @@ extern void led_trigger_blink(struct led_trigger *trigger, #endif /* Trigger specific functions */ -#ifdef CONFIG_LEDS_TRIGGER_IDE_DISK -extern void ledtrig_ide_activity(void); +#ifdef CONFIG_LEDS_TRIGGER_DISK +extern void ledtrig_disk_activity(void); #else -#define ledtrig_ide_activity() do {} while(0) +#define ledtrig_disk_activity() do {} while(0) #endif /* -- 1.9.1