diff options
| author | Rod Whitby <rod@whitby.id.au> | 2006-03-20 11:15:36 +0000 |
|---|---|---|
| committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2006-03-20 11:15:36 +0000 |
| commit | d4c4a2f42b0f7e3404865cfad6cfb2cc90c24d64 (patch) | |
| tree | ae760e74dfd76c8d8066c25c8d0ce408b71dbfcc | |
| parent | 86629673742ddb672f54f224a85d668aee7955c7 (diff) | |
ixp4xx-kernel: Updated patchset from CVS kernel repo and tweaked for 2.6.16-final
5 files changed, 479 insertions, 452 deletions
diff --git a/packages/linux/ixp4xx-kernel/2.6.16/15-jffs2-endian-config.patch b/packages/linux/ixp4xx-kernel/2.6.16/15-jffs2-endian-config.patch index 0dcbdaeadd..893353ef4f 100644 --- a/packages/linux/ixp4xx-kernel/2.6.16/15-jffs2-endian-config.patch +++ b/packages/linux/ixp4xx-kernel/2.6.16/15-jffs2-endian-config.patch @@ -9,6 +9,7 @@ executables) independent of the endianness of the processor (ARM processors can be switched to either endianness at run-time). Signed-off-by: Rod Whitby <rod@whitby.id.au> +Signed-off-by: Alessandro Zummo <a.zummo@towertech.it> fs/Kconfig | 25 +++++++++++++++++++++++++ fs/jffs2/nodelist.h | 8 +++----- diff --git a/packages/linux/ixp4xx-kernel/2.6.16/92-nas100d-maclist.patch b/packages/linux/ixp4xx-kernel/2.6.16/92-nas100d-maclist.patch index 4c89a4bcce..c10a77354b 100644 --- a/packages/linux/ixp4xx-kernel/2.6.16/92-nas100d-maclist.patch +++ b/packages/linux/ixp4xx-kernel/2.6.16/92-nas100d-maclist.patch @@ -14,7 +14,7 @@ NAS 100d device. For more information on this platform, --- linux-nslu2.orig/arch/arm/mach-ixp4xx/nas100d-setup.c 2006-02-06 20:37:01.000000000 +0100 +++ linux-nslu2/arch/arm/mach-ixp4xx/nas100d-setup.c 2006-02-06 22:35:26.000000000 +0100 -@@ -15,11 +15,14 @@ +@@ -15,12 +15,15 @@ #include <linux/kernel.h> #include <linux/serial.h> #include <linux/serial_8250.h> @@ -23,6 +23,7 @@ #include <asm/mach-types.h> #include <asm/mach/arch.h> #include <asm/mach/flash.h> + #include <asm/setup.h> +#include <net/maclist.h> + diff --git a/packages/linux/ixp4xx-kernel/2.6.16/92-nslu2-maclist.patch b/packages/linux/ixp4xx-kernel/2.6.16/92-nslu2-maclist.patch index 298a3d92bb..a280a49e6f 100644 --- a/packages/linux/ixp4xx-kernel/2.6.16/92-nslu2-maclist.patch +++ b/packages/linux/ixp4xx-kernel/2.6.16/92-nslu2-maclist.patch @@ -1,22 +1,9 @@ - arch/arm/mach-ixp4xx/Kconfig | 4 +-- + arch/arm/mach-ixp4xx/Kconfig | 1 arch/arm/mach-ixp4xx/nslu2-setup.c | 39 +++++++++++++++++++++++++++++++++++++ - 2 files changed, 41 insertions(+), 2 deletions(-) + 2 files changed, 40 insertions(+) ---- linux-ixp4xx.orig/arch/arm/mach-ixp4xx/Kconfig 2006-02-23 18:30:58.000000000 +0100 -+++ linux-ixp4xx/arch/arm/mach-ixp4xx/Kconfig 2006-02-23 18:31:00.000000000 +0100 -@@ -11,8 +11,8 @@ comment "IXP4xx Platforms" - # This entry is placed on top because otherwise it would have - # been shown as a submenu. - config MACH_NSLU2 -- bool -- prompt "NSLU2" if !(MACH_IXDP465 || MACH_IXDPG425 || ARCH_IXDP425 || ARCH_ADI_COYOTE || ARCH_AVILA || ARCH_IXCDP1100 || ARCH_PRPMC1100 || MACH_GTWX5715) -+ bool "NSLU2" -+ select MACLIST - help - Say 'Y' here if you want your kernel to support Linksys's - NSLU2 NAS device. For more information on this platform, ---- linux-ixp4xx.orig/arch/arm/mach-ixp4xx/nslu2-setup.c 2006-02-23 18:30:49.000000000 +0100 -+++ linux-ixp4xx/arch/arm/mach-ixp4xx/nslu2-setup.c 2006-02-23 18:31:00.000000000 +0100 +--- linux-ixp4xx.orig/arch/arm/mach-ixp4xx/nslu2-setup.c 2006-03-08 10:33:10.000000000 +0100 ++++ linux-ixp4xx/arch/arm/mach-ixp4xx/nslu2-setup.c 2006-03-08 10:33:14.000000000 +0100 @@ -16,11 +16,14 @@ #include <linux/kernel.h> #include <linux/serial.h> @@ -82,3 +69,13 @@ ixp4xx_sys_init(); nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); +--- linux-ixp4xx.orig/arch/arm/mach-ixp4xx/Kconfig 2006-03-08 10:33:12.000000000 +0100 ++++ linux-ixp4xx/arch/arm/mach-ixp4xx/Kconfig 2006-03-08 10:33:22.000000000 +0100 +@@ -11,6 +11,7 @@ comment "IXP4xx Platforms" + config MACH_NSLU2 + bool + prompt "Linksys NSLU2" ++ select MACLIST + help + Say 'Y' here if you want your kernel to support Linksys's + NSLU2 NAS device. For more information on this platform, diff --git a/packages/linux/ixp4xx-kernel/2.6.16/951-ixp4xx-leds-cpu-activity.patch b/packages/linux/ixp4xx-kernel/2.6.16/951-ixp4xx-leds-cpu-activity.patch index 92b03836d4..6d4c53026c 100644 --- a/packages/linux/ixp4xx-kernel/2.6.16/951-ixp4xx-leds-cpu-activity.patch +++ b/packages/linux/ixp4xx-kernel/2.6.16/951-ixp4xx-leds-cpu-activity.patch @@ -21,9 +21,9 @@ Signed-off-by: John Bowler <jbowler@acm.org> #include <linux/init.h> #include <linux/cpu.h> +#include <linux/leds.h> + #include <linux/elfcore.h> #include <asm/leds.h> - #include <asm/processor.h> @@ -80,6 +81,12 @@ void (*pm_power_off)(void); EXPORT_SYMBOL(pm_power_off); @@ -580,7 +580,7 @@ Signed-off-by: John Bowler <jbowler@acm.org> +MODULE_LICENSE("MIT"); --- linux-ixp4xx.orig/include/linux/leds.h 2006-02-21 00:54:33.000000000 +0100 +++ linux-ixp4xx/include/linux/leds.h 2006-02-21 01:03:33.000000000 +0100 -@@ -95,3 +95,12 @@ void led_trigger_event(struct led_trigge +@@ -102,4 +102,13 @@ void led_trigger_event(struct led_trigge #define led_trigger_event(x, y) do {} while(0) #endif @@ -593,3 +593,4 @@ Signed-off-by: John Bowler <jbowler@acm.org> + * the arch core to be able to use LEDS_TRIGGER_CPU_ACTIVITY + */ +extern void (*leds_idle)(int is_idle); + #endif /* __LINUX_LEDS_H_INCLUDED */ diff --git a/packages/linux/ixp4xx-kernel/2.6.16/leds-class.patch b/packages/linux/ixp4xx-kernel/2.6.16/leds-class.patch index 4eaab3070e..c0146b6fe4 100644 --- a/packages/linux/ixp4xx-kernel/2.6.16/leds-class.patch +++ b/packages/linux/ixp4xx-kernel/2.6.16/leds-class.patch @@ -1,35 +1,63 @@ -Add the foundations of a new LEDs subsystem. This patch adds a class -which presents LED devices within sysfs and allows their brightness to -be controlled. -Signed-off-by: Richard Purdie <rpurdie@rpsys.net> +From: Richard Purdie <rpurdie@rpsys.net> + +Add the foundations of a new LEDs subsystem. This patch adds a class which +presents LED devices within sysfs and allows their brightness to be +controlled. +Signed-off-by: Richard Purdie <rpurdie@rpsys.net> +Cc: Russell King <rmk@arm.linux.org.uk> +Cc: Greg KH <greg@kroah.com> +Signed-off-by: Andrew Morton <akpm@osdl.org> --- + arch/arm/Kconfig | 2 - arch/arm/mach-pxa/corgi.c | 10 + - arch/arm/mach-pxa/spitz.c | 10 + + arch/arm/mach-pxa/corgi.c | 9 + + arch/arm/mach-pxa/spitz.c | 9 + arch/arm/mach-pxa/tosa.c | 9 + drivers/Kconfig | 2 drivers/Makefile | 1 - drivers/ide/ide-disk.c | 17 ++ + drivers/ide/ide-disk.c | 22 +++ drivers/leds/Kconfig | 70 +++++++++++ drivers/leds/Makefile | 15 ++ - drivers/leds/led-class.c | 164 +++++++++++++++++++++++++++ - drivers/leds/led-core.c | 24 ++++ - drivers/leds/led-triggers.c | 236 ++++++++++++++++++++++++++++++++++++++++ + drivers/leds/led-class.c | 174 +++++++++++++++++++++++++++++ + drivers/leds/led-core.c | 25 ++++ + drivers/leds/led-triggers.c | 239 ++++++++++++++++++++++++++++++++++++++++ drivers/leds/leds-corgi.c | 121 ++++++++++++++++++++ - drivers/leds/leds-ixp4xx-gpio.c | 209 +++++++++++++++++++++++++++++++++++ - drivers/leds/leds-locomo.c | 91 +++++++++++++++ - drivers/leds/leds-spitz.c | 125 +++++++++++++++++++++ - drivers/leds/leds-tosa.c | 123 ++++++++++++++++++++ - drivers/leds/leds.h | 36 ++++++ - drivers/leds/ledtrig-timer.c | 205 ++++++++++++++++++++++++++++++++++ + drivers/leds/leds-ixp4xx-gpio.c | 215 +++++++++++++++++++++++++++++++++++ + drivers/leds/leds-locomo.c | 95 +++++++++++++++ + drivers/leds/leds-spitz.c | 125 ++++++++++++++++++++ + drivers/leds/leds-tosa.c | 131 +++++++++++++++++++++ + drivers/leds/leds.h | 45 +++++++ + drivers/leds/ledtrig-timer.c | 174 +++++++++++++++++++++++++++++ drivers/mtd/nand/nand_base.c | 26 ++++ - include/linux/leds.h | 97 ++++++++++++++++ - 21 files changed, 1590 insertions(+), 3 deletions(-) + include/linux/leds.h | 105 +++++++++++++++++ + 21 files changed, 1610 insertions(+), 4 deletions(-) +--- linux-ixp4xx.orig/arch/arm/Kconfig 2006-03-07 22:57:47.000000000 +0100 ++++ linux-ixp4xx/arch/arm/Kconfig 2006-03-07 22:59:04.000000000 +0100 +@@ -807,6 +807,8 @@ source "drivers/misc/Kconfig" + + source "drivers/mfd/Kconfig" + ++source "drivers/leds/Kconfig" ++ + source "drivers/media/Kconfig" + + source "drivers/video/Kconfig" +--- linux-ixp4xx.orig/drivers/Kconfig 2006-03-07 22:57:47.000000000 +0100 ++++ linux-ixp4xx/drivers/Kconfig 2006-03-07 22:59:04.000000000 +0100 +@@ -64,6 +64,8 @@ source "drivers/usb/Kconfig" + + source "drivers/mmc/Kconfig" + ++source "drivers/leds/Kconfig" ++ + source "drivers/infiniband/Kconfig" + + source "drivers/sn/Kconfig" --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-ixp4xx/drivers/leds/Kconfig 2006-02-23 18:17:40.000000000 +0100 ++++ linux-ixp4xx/drivers/leds/Kconfig 2006-03-07 22:59:04.000000000 +0100 @@ -0,0 +1,70 @@ + +menu "LED devices" @@ -102,197 +130,8 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> +endmenu + --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-ixp4xx/drivers/leds/Makefile 2006-02-23 18:17:40.000000000 +0100 -@@ -0,0 +1,15 @@ -+ -+# LED Core -+obj-$(CONFIG_NEW_LEDS) += led-core.o -+obj-$(CONFIG_LEDS_CLASS) += led-class.o -+obj-$(CONFIG_LEDS_TRIGGERS) += led-triggers.o -+ -+# LED Platform Drivers -+obj-$(CONFIG_LEDS_CORGI) += leds-corgi.o -+obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o -+obj-$(CONFIG_LEDS_SPITZ) += leds-spitz.o -+obj-$(CONFIG_LEDS_IXP4XX) += leds-ixp4xx-gpio.o -+obj-$(CONFIG_LEDS_TOSA) += leds-tosa.o -+ -+# LED Triggers -+obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-ixp4xx/include/linux/leds.h 2006-02-23 18:17:40.000000000 +0100 -@@ -0,0 +1,97 @@ -+/* -+ * Driver model for leds and led triggers -+ * -+ * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu> -+ * Copyright (C) 2005 Richard Purdie <rpurdie@openedhand.com> -+ * -+ * 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. -+ * -+ */ -+ -+struct device; -+struct class_device; -+/* -+ * LED Core -+ */ -+ -+enum led_brightness { -+ LED_OFF = 0, -+ LED_HALF = 127, -+ LED_FULL = 255, -+}; -+ -+struct led_classdev { -+ const char *name; -+ int brightness; -+ int flags; -+#define LED_SUSPENDED (1 << 0) -+ -+ /* A function to set the brightness of the led */ -+ void (*brightness_set)(struct led_classdev *led_cdev, enum led_brightness brightness); -+ -+ struct class_device *class_dev; -+ /* LED Device linked list */ -+ struct list_head node; -+ -+ /* Trigger data */ -+ char *default_trigger; -+#ifdef CONFIG_LEDS_TRIGGERS -+ struct led_trigger *trigger; -+ struct list_head trig_list; -+ void *trigger_data; -+#endif -+ -+ /* This protects the data in this structure */ -+ rwlock_t lock; -+}; -+ -+extern int led_classdev_register(struct device *parent, struct led_classdev *led_cdev); -+extern void led_classdev_unregister(struct led_classdev *led_cdev); -+extern void led_classdev_suspend(struct led_classdev *led_cdev); -+extern void led_classdev_resume(struct led_classdev *led_cdev); -+ -+ -+/* -+ * LED Triggers -+ */ -+#ifdef CONFIG_LEDS_TRIGGERS -+ -+#define TRIG_NAME_MAX 50 -+ -+struct led_trigger { -+ /* Trigger Properties */ -+ const char *name; -+ void (*activate)(struct led_classdev *led_cdev); -+ void (*deactivate)(struct led_classdev *led_cdev); -+ -+ /* LEDs under control by this trigger (for simple triggers) */ -+ rwlock_t leddev_list_lock; -+ struct list_head led_cdevs; -+ -+ /* Link to next registered trigger */ -+ struct list_head next_trig; -+}; -+ -+/* Registration functions for complex triggers */ -+int led_trigger_register(struct led_trigger *trigger); -+void led_trigger_unregister(struct led_trigger *trigger); -+ -+/* Registration functions for simple triggers */ -+#define INIT_LED_TRIGGER(x) static struct led_trigger *x; -+#define INIT_LED_TRIGGER_GLOBAL(x) struct led_trigger *x; -+void led_trigger_register_simple(const char *name, struct led_trigger **trigger); -+void led_trigger_unregister_simple(struct led_trigger *trigger); -+void led_trigger_event(struct led_trigger *trigger, enum led_brightness event); -+ -+#else -+ -+/* Triggers aren't active - null macros */ -+#define INIT_LED_TRIGGER(x) -+#define INIT_LED_TRIGGER_GLOBAL(x) -+#define led_trigger_register_simple(x, y) do {} while(0) -+#define led_trigger_unregister_simple(x) do {} while(0) -+#define led_trigger_event(x, y) do {} while(0) -+ -+#endif ---- linux-ixp4xx.orig/arch/arm/Kconfig 2006-02-23 18:13:35.000000000 +0100 -+++ linux-ixp4xx/arch/arm/Kconfig 2006-02-23 18:17:40.000000000 +0100 -@@ -807,6 +807,8 @@ source "drivers/misc/Kconfig" - - source "drivers/mfd/Kconfig" - -+source "drivers/leds/Kconfig" -+ - source "drivers/media/Kconfig" - - source "drivers/video/Kconfig" ---- linux-ixp4xx.orig/drivers/Makefile 2006-02-23 18:13:35.000000000 +0100 -+++ linux-ixp4xx/drivers/Makefile 2006-02-23 18:17:40.000000000 +0100 -@@ -68,6 +68,7 @@ obj-$(CONFIG_MCA) += mca/ - obj-$(CONFIG_EISA) += eisa/ - obj-$(CONFIG_CPU_FREQ) += cpufreq/ - obj-$(CONFIG_MMC) += mmc/ -+obj-$(CONFIG_NEW_LEDS) += leds/ - obj-$(CONFIG_INFINIBAND) += infiniband/ - obj-$(CONFIG_SGI_SN) += sn/ - obj-y += firmware/ ---- linux-ixp4xx.orig/drivers/Kconfig 2006-02-23 18:13:35.000000000 +0100 -+++ linux-ixp4xx/drivers/Kconfig 2006-02-23 18:17:40.000000000 +0100 -@@ -64,6 +64,8 @@ source "drivers/usb/Kconfig" - - source "drivers/mmc/Kconfig" - -+source "drivers/leds/Kconfig" -+ - source "drivers/infiniband/Kconfig" - - source "drivers/sn/Kconfig" ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-ixp4xx/drivers/leds/leds.h 2006-02-23 18:17:40.000000000 +0100 -@@ -0,0 +1,36 @@ -+/* -+ * LED Core -+ * -+ * Copyright 2005 Openedhand Ltd. -+ * -+ * Author: Richard Purdie <rpurdie@openedhand.com> -+ * -+ * 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. -+ * -+ */ -+ -+/* led_cdev->lock must be held as write */ -+static inline void led_set_brightness(struct led_classdev *led_cdev, enum led_brightness value) -+{ -+ if (value > LED_FULL) -+ value = LED_FULL; -+ led_cdev->brightness = value; -+ if (!(led_cdev->flags & LED_SUSPENDED)) -+ led_cdev->brightness_set(led_cdev, value); -+} -+ -+extern rwlock_t leds_list_lock; -+extern struct list_head leds_list; -+ -+#ifdef CONFIG_LEDS_TRIGGERS -+void led_trigger_set_default(struct led_classdev *led_cdev); -+void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger); -+#else -+#define led_trigger_set_default(x) do {} while(0) -+#define led_trigger_set(x, y) do {} while(0) -+#endif -+ -+ssize_t led_trigger_store(struct class_device *dev, const char *buf, size_t count); -+ssize_t led_trigger_show(struct class_device *dev, char *buf); ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-ixp4xx/drivers/leds/led-class.c 2006-02-23 18:17:40.000000000 +0100 -@@ -0,0 +1,164 @@ ++++ linux-ixp4xx/drivers/leds/led-class.c 2006-03-07 22:59:04.000000000 +0100 +@@ -0,0 +1,174 @@ +/* + * LED Class Core + * @@ -321,7 +160,7 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + +static ssize_t led_brightness_show(struct class_device *dev, char *buf) +{ -+ struct led_classdev *led_cdev = dev->class_data; ++ struct led_classdev *led_cdev = class_get_devdata(dev); + ssize_t ret = 0; + + /* no lock needed for this */ @@ -331,13 +170,14 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + return ret; +} + -+static ssize_t led_brightness_store(struct class_device *dev, const char *buf, size_t size) ++static ssize_t led_brightness_store(struct class_device *dev, ++ const char *buf, size_t size) +{ -+ struct led_classdev *led_cdev = dev->class_data; ++ struct led_classdev *led_cdev = class_get_devdata(dev); + ssize_t ret = -EINVAL; + char *after; -+ + unsigned long state = simple_strtoul(buf, &after, 10); ++ + if (after - buf > 0) { + ret = after - buf; + write_lock(&led_cdev->lock); @@ -348,8 +188,8 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + return ret; +} + -+static CLASS_DEVICE_ATTR(brightness, 0644, led_brightness_show, led_brightness_store); -+ ++static CLASS_DEVICE_ATTR(brightness, 0644, led_brightness_show, ++ led_brightness_store); +#ifdef CONFIG_LEDS_TRIGGERS +static CLASS_DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store); +#endif @@ -365,6 +205,7 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + led_cdev->brightness_set(led_cdev, 0); + write_unlock(&led_cdev->lock); +} ++EXPORT_SYMBOL_GPL(led_classdev_suspend); + +/** + * led_classdev_resume - resume an led_classdev. @@ -377,6 +218,7 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + led_cdev->brightness_set(led_cdev, led_cdev->brightness); + write_unlock(&led_cdev->lock); +} ++EXPORT_SYMBOL_GPL(led_classdev_resume); + +/** + * led_classdev_register - register a new object of led_classdev class. @@ -385,30 +227,38 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + */ +int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) +{ -+ led_cdev->class_dev = class_device_create(leds_class, NULL, 0, parent, "%s", led_cdev->name); ++ led_cdev->class_dev = class_device_create(leds_class, NULL, 0, ++ parent, "%s", led_cdev->name); + if (unlikely(IS_ERR(led_cdev->class_dev))) + return PTR_ERR(led_cdev->class_dev); + + rwlock_init(&led_cdev->lock); -+ led_cdev->class_dev->class_data = led_cdev; ++ class_set_devdata(led_cdev->class_dev, led_cdev); + + /* register the attributes */ -+ class_device_create_file(led_cdev->class_dev, &class_device_attr_brightness); -+#ifdef CONFIG_LEDS_TRIGGERS -+ class_device_create_file(led_cdev->class_dev, &class_device_attr_trigger); -+#endif ++ class_device_create_file(led_cdev->class_dev, ++ &class_device_attr_brightness); + + /* add to the list of leds */ + write_lock(&leds_list_lock); + list_add_tail(&led_cdev->node, &leds_list); + write_unlock(&leds_list_lock); + ++#ifdef CONFIG_LEDS_TRIGGERS ++ rwlock_init(&led_cdev->trigger_lock); ++ + led_trigger_set_default(led_cdev); + -+ printk(KERN_INFO "Registered led device: %s\n", led_cdev->class_dev->class_id); ++ class_device_create_file(led_cdev->class_dev, ++ &class_device_attr_trigger); ++#endif ++ ++ printk(KERN_INFO "Registered led device: %s\n", ++ led_cdev->class_dev->class_id); + + return 0; +} ++EXPORT_SYMBOL_GPL(led_classdev_register); + +/** + * led_classdev_unregister - unregisters a object of led_properties class. @@ -418,13 +268,16 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + */ +void led_classdev_unregister(struct led_classdev *led_cdev) +{ -+ class_device_remove_file(led_cdev->class_dev, &class_device_attr_brightness); ++ class_device_remove_file(led_cdev->class_dev, ++ &class_device_attr_brightness); +#ifdef CONFIG_LEDS_TRIGGERS -+ class_device_remove_file(led_cdev->class_dev, &class_device_attr_trigger); -+#endif -+ ++ class_device_remove_file(led_cdev->class_dev, ++ &class_device_attr_trigger); ++ write_lock(&led_cdev->trigger_lock); + if (led_cdev->trigger) + led_trigger_set(led_cdev, NULL); ++ write_unlock(&led_cdev->trigger_lock); ++#endif + + class_device_unregister(led_cdev->class_dev); + @@ -432,10 +285,6 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + list_del(&led_cdev->node); + write_unlock(&leds_list_lock); +} -+ -+EXPORT_SYMBOL_GPL(led_classdev_suspend); -+EXPORT_SYMBOL_GPL(led_classdev_resume); -+EXPORT_SYMBOL_GPL(led_classdev_register); +EXPORT_SYMBOL_GPL(led_classdev_unregister); + +static int __init leds_init(void) @@ -458,8 +307,8 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("LED Class Interface"); --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-ixp4xx/drivers/leds/led-core.c 2006-02-23 18:17:40.000000000 +0100 -@@ -0,0 +1,24 @@ ++++ linux-ixp4xx/drivers/leds/led-core.c 2006-03-07 22:59:04.000000000 +0100 +@@ -0,0 +1,25 @@ +/* + * LED Class Core + * @@ -484,9 +333,194 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> +LIST_HEAD(leds_list); + +EXPORT_SYMBOL_GPL(leds_list); ++EXPORT_SYMBOL_GPL(leds_list_lock); +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-ixp4xx/drivers/leds/leds.h 2006-03-07 22:59:04.000000000 +0100 +@@ -0,0 +1,45 @@ ++/* ++ * LED Core ++ * ++ * Copyright 2005 Openedhand Ltd. ++ * ++ * Author: Richard Purdie <rpurdie@openedhand.com> ++ * ++ * 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. ++ * ++ */ ++#ifndef __LEDS_H_INCLUDED ++#define __LEDS_H_INCLUDED ++ ++#include <linux/leds.h> ++ ++/* led_cdev->lock must be held as write */ ++static inline void led_set_brightness(struct led_classdev *led_cdev, ++ enum led_brightness value) ++{ ++ if (value > LED_FULL) ++ value = LED_FULL; ++ led_cdev->brightness = value; ++ if (!(led_cdev->flags & LED_SUSPENDED)) ++ led_cdev->brightness_set(led_cdev, value); ++} ++ ++extern rwlock_t leds_list_lock; ++extern struct list_head leds_list; ++ ++#ifdef CONFIG_LEDS_TRIGGERS ++void led_trigger_set_default(struct led_classdev *led_cdev); ++void led_trigger_set(struct led_classdev *led_cdev, ++ struct led_trigger *trigger); ++#else ++#define led_trigger_set_default(x) do {} while(0) ++#define led_trigger_set(x, y) do {} while(0) ++#endif ++ ++ssize_t led_trigger_store(struct class_device *dev, const char *buf, ++ size_t count); ++ssize_t led_trigger_show(struct class_device *dev, char *buf); ++ ++#endif /* __LEDS_H_INCLUDED */ +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-ixp4xx/drivers/leds/Makefile 2006-03-07 22:59:04.000000000 +0100 +@@ -0,0 +1,15 @@ ++ ++# LED Core ++obj-$(CONFIG_NEW_LEDS) += led-core.o ++obj-$(CONFIG_LEDS_CLASS) += led-class.o ++obj-$(CONFIG_LEDS_TRIGGERS) += led-triggers.o ++ ++# LED Platform Drivers ++obj-$(CONFIG_LEDS_CORGI) += leds-corgi.o ++obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o ++obj-$(CONFIG_LEDS_SPITZ) += leds-spitz.o ++obj-$(CONFIG_LEDS_IXP4XX) += leds-ixp4xx-gpio.o ++obj-$(CONFIG_LEDS_TOSA) += leds-tosa.o ++ ++# LED Triggers ++obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o +--- linux-ixp4xx.orig/drivers/Makefile 2006-03-07 22:57:47.000000000 +0100 ++++ linux-ixp4xx/drivers/Makefile 2006-03-07 22:59:04.000000000 +0100 +@@ -68,6 +68,7 @@ obj-$(CONFIG_MCA) += mca/ + obj-$(CONFIG_EISA) += eisa/ + obj-$(CONFIG_CPU_FREQ) += cpufreq/ + obj-$(CONFIG_MMC) += mmc/ ++obj-$(CONFIG_NEW_LEDS) += leds/ + obj-$(CONFIG_INFINIBAND) += infiniband/ + obj-$(CONFIG_SGI_SN) += sn/ + obj-y += firmware/ --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-ixp4xx/drivers/leds/led-triggers.c 2006-02-23 18:17:40.000000000 +0100 -@@ -0,0 +1,236 @@ ++++ linux-ixp4xx/include/linux/leds.h 2006-03-07 22:59:04.000000000 +0100 +@@ -0,0 +1,105 @@ ++/* ++ * Driver model for leds and led triggers ++ * ++ * Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu> ++ * Copyright (C) 2005 Richard Purdie <rpurdie@openedhand.com> ++ * ++ * 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. ++ * ++ */ ++#ifndef __LINUX_LEDS_H_INCLUDED ++#define __LINUX_LEDS_H_INCLUDED ++ ++struct device; ++struct class_device; ++/* ++ * LED Core ++ */ ++ ++enum led_brightness { ++ LED_OFF = 0, ++ LED_HALF = 127, ++ LED_FULL = 255, ++}; ++ ++struct led_classdev { ++ const char *name; ++ int brightness; ++ int flags; ++#define LED_SUSPENDED (1 << 0) ++ ++ /* A function to set the brightness of the led */ ++ void (*brightness_set)(struct led_classdev *led_cdev, ++ enum led_brightness brightness); ++ ++ struct class_device *class_dev; ++ /* LED Device linked list */ ++ struct list_head node; ++ ++ /* Protects the LED properties data above */ ++ rwlock_t lock; ++ ++ /* Trigger data */ ++ char *default_trigger; ++#ifdef CONFIG_LEDS_TRIGGERS ++ rwlock_t trigger_lock; ++ /* Protects the trigger data below */ ++ ++ struct led_trigger *trigger; ++ struct list_head trig_list; ++ void *trigger_data; ++#endif ++}; ++ ++extern int led_classdev_register(struct device *parent, ++ struct led_classdev *led_cdev); ++extern void led_classdev_unregister(struct led_classdev *led_cdev); ++extern void led_classdev_suspend(struct led_classdev *led_cdev); ++extern void led_classdev_resume(struct led_classdev *led_cdev); ++ ++/* ++ * LED Triggers ++ */ ++#ifdef CONFIG_LEDS_TRIGGERS ++ ++#define TRIG_NAME_MAX 50 ++ ++struct led_trigger { ++ /* Trigger Properties */ ++ const char *name; ++ void (*activate)(struct led_classdev *led_cdev); ++ void (*deactivate)(struct led_classdev *led_cdev); ++ ++ /* LEDs under control by this trigger (for simple triggers) */ ++ rwlock_t leddev_list_lock; ++ struct list_head led_cdevs; ++ ++ /* Link to next registered trigger */ ++ struct list_head next_trig; ++}; ++ ++/* Registration functions for complex triggers */ ++int led_trigger_register(struct led_trigger *trigger); ++void led_trigger_unregister(struct led_trigger *trigger); ++ ++/* Registration functions for simple triggers */ ++#define DEFINE_LED_TRIGGER(x) static struct led_trigger *x; ++#define DEFINE_LED_TRIGGER_GLOBAL(x) struct led_trigger *x; ++void led_trigger_register_simple(const char *name, ++ struct led_trigger **trigger); ++void led_trigger_unregister_simple(struct led_trigger *trigger); ++void led_trigger_event(struct led_trigger *trigger, enum led_brightness event); ++ ++#else ++ ++/* Triggers aren't active - null macros */ ++#define DEFINE_LED_TRIGGER(x) ++#define DEFINE_LED_TRIGGER_GLOBAL(x) ++#define led_trigger_register_simple(x, y) do {} while(0) ++#define led_trigger_unregister_simple(x) do {} while(0) ++#define led_trigger_event(x, y) do {} while(0) ++ ++#endif ++#endif /* __LINUX_LEDS_H_INCLUDED */ +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-ixp4xx/drivers/leds/led-triggers.c 2006-03-07 22:59:04.000000000 +0100 +@@ -0,0 +1,239 @@ +/* + * LED Triggers Core + * @@ -512,12 +546,16 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> +#include <linux/leds.h> +#include "leds.h" + ++/* ++ * Nests outside led_cdev->lock and led_cdev->trigger_lock ++ */ +static rwlock_t triggers_list_lock = RW_LOCK_UNLOCKED; +static LIST_HEAD(trigger_list); + -+ssize_t led_trigger_store(struct class_device *dev, const char *buf, size_t count) ++ssize_t led_trigger_store(struct class_device *dev, const char *buf, ++ size_t count) +{ -+ struct led_classdev *led_cdev = dev->class_data; ++ struct led_classdev *led_cdev = class_get_devdata(dev); + char trigger_name[TRIG_NAME_MAX]; + struct led_trigger *trig; + size_t len; @@ -530,18 +568,18 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + trigger_name[len - 1] = '\0'; + + if (!strcmp(trigger_name, "none")) { -+ write_lock(&led_cdev->lock); ++ write_lock(&led_cdev->trigger_lock); + led_trigger_set(led_cdev, NULL); -+ write_unlock(&led_cdev->lock); ++ write_unlock(&led_cdev->trigger_lock); + return count; + } + + read_lock(&triggers_list_lock); + list_for_each_entry(trig, &trigger_list, next_trig) { + if (!strcmp(trigger_name, trig->name)) { -+ write_lock(&led_cdev->lock); ++ write_lock(&led_cdev->trigger_lock); + led_trigger_set(led_cdev, trig); -+ write_unlock(&led_cdev->lock); ++ write_unlock(&led_cdev->trigger_lock); + + read_unlock(&triggers_list_lock); + return count; @@ -555,32 +593,34 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + +ssize_t led_trigger_show(struct class_device *dev, char *buf) +{ -+ struct led_classdev *led_cdev = dev->class_data; ++ struct led_classdev *led_cdev = class_get_devdata(dev); + struct led_trigger *trig; + int len = 0; + -+ read_lock(&led_cdev->lock); ++ read_lock(&triggers_list_lock); ++ read_lock(&led_cdev->trigger_lock); + + if (!led_cdev->trigger) + len += sprintf(buf+len, "[none] "); + else + len += sprintf(buf+len, "none "); + -+ read_lock(&triggers_list_lock); + list_for_each_entry(trig, &trigger_list, next_trig) { -+ if (led_cdev->trigger && !strcmp(led_cdev->trigger->name, trig->name)) ++ if (led_cdev->trigger && !strcmp(led_cdev->trigger->name, ++ trig->name)) + len += sprintf(buf+len, "[%s] ", trig->name); + else + len += sprintf(buf+len, "%s ", trig->name); + } ++ read_unlock(&led_cdev->trigger_lock); + read_unlock(&triggers_list_lock); -+ read_unlock(&led_cdev->lock); + + len += sprintf(len+buf, "\n"); + return len; +} + -+void led_trigger_event(struct led_trigger *trigger, enum led_brightness brightness) ++void led_trigger_event(struct led_trigger *trigger, ++ enum led_brightness brightness) +{ + struct list_head *entry; + @@ -599,7 +639,7 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + read_unlock(&trigger->leddev_list_lock); +} + -+/* Caller must ensure led_cdev->lock held for write */ ++/* Caller must ensure led_cdev->trigger_lock held */ +void led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger) +{ + /* Remove any existing trigger */ @@ -609,7 +649,6 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + write_unlock(&led_cdev->trigger->leddev_list_lock); + if (led_cdev->trigger->deactivate) + led_cdev->trigger->deactivate(led_cdev); -+ + } + if (trigger) { + write_lock(&trigger->leddev_list_lock); @@ -628,14 +667,14 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + if (!led_cdev->default_trigger) + return; + -+ write_lock(&led_cdev->lock); + read_lock(&triggers_list_lock); ++ write_lock(&led_cdev->trigger_lock); + list_for_each_entry(trig, &trigger_list, next_trig) { + if (!strcmp(led_cdev->default_trigger, trig->name)) + led_trigger_set(led_cdev, trig); + } ++ write_unlock(&led_cdev->trigger_lock); + read_unlock(&triggers_list_lock); -+ write_unlock(&led_cdev->lock); +} + +int led_trigger_register(struct led_trigger *trigger) @@ -647,26 +686,26 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + + /* Add to the list of led triggers */ + write_lock(&triggers_list_lock); -+ list_add_tail(&trigger->next_trig, &trigger_list); ++ list_add_tail(&trigger->next_trig, &trigger_list); + write_unlock(&triggers_list_lock); + + /* Register with any LEDs that have this as a default trigger */ -+ read_lock(&leds_list); ++ read_lock(&leds_list_lock); + list_for_each_entry(led_cdev, &leds_list, node) { -+ write_lock(&led_cdev->lock); ++ write_lock(&led_cdev->trigger_lock); + if (!led_cdev->trigger && led_cdev->default_trigger && -+ !strcmp(led_cdev->default_trigger, trigger->name)) ++ !strcmp(led_cdev->default_trigger, trigger->name)) + led_trigger_set(led_cdev, trigger); -+ write_unlock(&led_cdev->lock); ++ write_unlock(&led_cdev->trigger_lock); + } -+ read_unlock(&leds_list); ++ read_unlock(&leds_list_lock); + + return 0; +} + +void led_trigger_register_simple(const char *name, struct led_trigger **tp) +{ -+ struct led_trigger *trigger; ++ struct led_trigger *trigger; + + trigger = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); + @@ -677,25 +716,24 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + *tp = trigger; +} + -+ +void led_trigger_unregister(struct led_trigger *trigger) +{ + struct led_classdev *led_cdev; + + /* Remove from the list of led triggers */ + write_lock(&triggers_list_lock); -+ list_del(&trigger->next_trig); ++ list_del(&trigger->next_trig); + write_unlock(&triggers_list_lock); + + /* Remove anyone actively using this trigger */ -+ read_lock(&leds_list); ++ read_lock(&leds_list_lock); + list_for_each_entry(led_cdev, &leds_list, node) { -+ write_lock(&led_cdev->lock); ++ write_lock(&led_cdev->trigger_lock); + if (led_cdev->trigger == trigger) + led_trigger_set(led_cdev, NULL); -+ write_unlock(&led_cdev->lock); ++ write_unlock(&led_cdev->trigger_lock); + } -+ read_unlock(&leds_list); ++ read_unlock(&leds_list_lock); +} + +void led_trigger_unregister_simple(struct led_trigger *trigger) @@ -722,10 +760,9 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> +MODULE_AUTHOR("Richard Purdie"); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("LED Triggers Core"); -+ --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-ixp4xx/drivers/leds/ledtrig-timer.c 2006-02-23 18:17:40.000000000 +0100 -@@ -0,0 +1,205 @@ ++++ linux-ixp4xx/drivers/leds/ledtrig-timer.c 2006-03-07 22:59:04.000000000 +0100 +@@ -0,0 +1,174 @@ +/* + * LED Kernel Timer Trigger + * @@ -752,10 +789,8 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> +#include "leds.h" + +struct timer_trig_data { -+ unsigned long duty; /* duty cycle, as a percentage */ -+ unsigned long frequency; /* frequency of blinking, in Hz */ -+ unsigned long delay_on; /* milliseconds on */ -+ unsigned long delay_off; /* milliseconds off */ ++ unsigned long delay_on; /* milliseconds on */ ++ unsigned long delay_off; /* milliseconds off */ + struct timer_list timer; +}; + @@ -766,9 +801,8 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + unsigned long brightness = LED_OFF; + unsigned long delay = timer_data->delay_off; + -+ write_lock(&led_cdev->lock); -+ -+ if (!timer_data->frequency) { ++ if (!timer_data->delay_on || !timer_data->delay_off) { ++ write_lock(&led_cdev->lock); + led_set_brightness(led_cdev, LED_OFF); + write_unlock(&led_cdev->lock); + return; @@ -779,104 +813,73 @@ Signed-off-by: Richard Purdie <rpurdie@rpsys.net> + delay = timer_data->delay_on; + } + ++ write_lock(&led_cdev->lock); + led_set_brightness(led_cdev, brightness); ++ write_unlock(&led_cdev->lock); + + mod_timer(&timer_data->timer |
