diff -urN kernel26/arch/arm/Kconfig kernel26_h4000/arch/arm/Kconfig
--- kernel26/arch/arm/Kconfig	2004-02-28 18:48:03.000000000 -0700
+++ kernel26_h4000/arch/arm/Kconfig	2004-05-08 10:04:36.000000000 -0600
@@ -569,7 +569,7 @@
 
 config LEDS
 	bool "Timer and CPU usage LEDs"
-	depends on ARCH_NETWINDER || ARCH_EBSA110 || ARCH_EBSA285 || ARCH_FTVPCI || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_CDB89712 || ARCH_P720T
+	depends on ARCH_NETWINDER || ARCH_EBSA110 || ARCH_EBSA285 || ARCH_FTVPCI || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_CDB89712 || ARCH_P720T || ARCH_H1900 || MACH_H4000
 	help
 	  If you say Y here, the LEDs on your machine will be used
 	  to provide useful information about your current system status.
@@ -582,8 +582,8 @@
 	  system, but the driver will do nothing.
 
 config LEDS_TIMER
-	bool "Timer LED" if LEDS && (ARCH_NETWINDER || ARCH_EBSA285 || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_P720T)
-	depends on ARCH_NETWINDER || ARCH_EBSA110 || ARCH_EBSA285 || ARCH_FTVPCI || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_CDB89712 || ARCH_P720T
+	bool "Timer LED" if LEDS && (ARCH_NETWINDER || ARCH_EBSA285 || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_P720T || ARCH_H1900 || MACH_H4000)
+	depends on ARCH_NETWINDER || ARCH_EBSA110 || ARCH_EBSA285 || ARCH_FTVPCI || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_CDB89712 || ARCH_P720T || ARCH_H1900 || MACH_H4000
 	default y if ARCH_EBSA110
 	help
 	  If you say Y here, one of the system LEDs (the green one on the
@@ -598,7 +598,7 @@
 
 config LEDS_CPU
 	bool "CPU usage LED"
-	depends on LEDS && (ARCH_NETWINDER || ARCH_EBSA285 || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_P720T)
+	depends on LEDS && (ARCH_NETWINDER || ARCH_EBSA285 || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_P720T || ARCH_H1900 || MACH_H4000)
 	help
 	  If you say Y here, the red LED will be used to give a good real
 	  time indication of CPU usage, by lighting whenever the idle task
diff -urN kernel26/arch/arm/mach-pxa/leds-asic3.c kernel26_h4000/arch/arm/mach-pxa/leds-asic3.c
--- kernel26/arch/arm/mach-pxa/leds-asic3.c	1969-12-31 17:00:00.000000000 -0700
+++ kernel26_h4000/arch/arm/mach-pxa/leds-asic3.c	2004-05-08 14:09:31.671493208 -0600
@@ -0,0 +1,161 @@
+/*
+ * linux/arch/arm/mach-pxa/leds-asic3.c
+ * 
+ * Based upon `cd linux-2.6.5; find . | grep led`
+ * 
+ * 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/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include <asm/hardware/ipaq-asic3.h>
+
+#include "leds.h"
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+/* mabey move the folowing defines to hardware/ipaq-asic3.h */
+#define ASIC3_RED_LED   1
+#define ASIC3_GREEN_LED 2
+#define ASIC3_VIRT 0xf8000000
+
+#define ASIC3_RED_SOLID \
+        IPAQ_ASIC3_LED_PeriodTime(ASIC3_VIRT, 0) = 0x1; \
+        IPAQ_ASIC3_LED_DutyTime(ASIC3_VIRT,   0) = 0x2; \
+        IPAQ_ASIC3_LED_TimeBase(ASIC3_VIRT,   0) = 0x16
+#define ASIC3_GREEN_SOLID \
+        IPAQ_ASIC3_LED_PeriodTime(ASIC3_VIRT, 1) = 0x1; \
+        IPAQ_ASIC3_LED_DutyTime(ASIC3_VIRT,   1) = 0x2; \
+        IPAQ_ASIC3_LED_TimeBase(ASIC3_VIRT,   1) = 0x16
+
+#define ASIC3_RED_LED_ON \
+        IPAQ_ASIC3_GPIO_OFFSET(ASIC3_VIRT,u16,C,AltFunction) |= 1;
+#define ASIC3_GREEN_LED_ON \
+        IPAQ_ASIC3_GPIO_OFFSET(ASIC3_VIRT,u16,C,AltFunction) |= 2;
+
+#define ASIC3_RED_LED_OFF \
+        IPAQ_ASIC3_GPIO_OFFSET(ASIC3_VIRT,u16,C,AltFunction) &= ~1;
+#define ASIC3_GREEN_LED_OFF \
+        IPAQ_ASIC3_GPIO_OFFSET(ASIC3_VIRT,u16,C,AltFunction) &= ~2;
+
+static unsigned int led_state;
+static unsigned int hw_led_state;
+
+
+void asic3_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+
+	switch (evt) {
+	case led_start:
+                ASIC3_GREEN_SOLID;                
+                ASIC3_RED_SOLID;
+		hw_led_state = ASIC3_GREEN_LED | ASIC3_RED_LED;
+		led_state = LED_STATE_ENABLED;
+		break;
+
+	case led_stop:
+		led_state &= ~LED_STATE_ENABLED;
+		break;
+
+	case led_claim:
+		led_state |= LED_STATE_CLAIMED;
+		hw_led_state = ASIC3_GREEN_LED | ASIC3_RED_LED;
+		break;
+
+	case led_release:
+		led_state &= ~LED_STATE_CLAIMED;
+		hw_led_state = ASIC3_GREEN_LED | ASIC3_RED_LED;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state ^= ASIC3_GREEN_LED;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state |= ASIC3_RED_LED;
+		break;
+
+	case led_idle_end:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state &= ~ASIC3_RED_LED;
+		break;
+#endif
+
+	case led_halted:
+		break;
+
+	case led_green_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~ASIC3_GREEN_LED;
+		break;
+
+	case led_green_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= ASIC3_GREEN_LED;
+		break;
+
+	case led_amber_on:
+        if (led_state & LED_STATE_CLAIMED)
+            hw_led_state &= ~(ASIC3_GREEN_LED | ASIC3_RED_LED);
+		break;
+
+	case led_amber_off:
+        if (led_state & LED_STATE_CLAIMED)
+            hw_led_state = ASIC3_GREEN_LED | ASIC3_RED_LED;
+		break;
+
+	case led_red_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~ASIC3_RED_LED;
+		break;
+
+	case led_red_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= ASIC3_RED_LED;
+		break;
+
+	default:
+		break;
+	}
+
+	if  (led_state & LED_STATE_ENABLED)
+	{
+		switch (hw_led_state) {
+		case 0: // all on
+			ASIC3_GREEN_LED_ON;
+			ASIC3_RED_LED_ON;
+			break;
+		case 1: // turn off heartbeat, status on:
+			ASIC3_GREEN_LED_OFF;
+			ASIC3_RED_LED_ON;
+			break;
+		case 2: // status off, heartbeat on:
+			ASIC3_GREEN_LED_ON;
+			ASIC3_RED_LED_OFF;
+			break;
+		case 3: // turn them both off...
+			ASIC3_GREEN_LED_OFF;
+			ASIC3_RED_LED_OFF;
+			break;
+		default:
+			break;
+		}
+	}
+	local_irq_restore(flags);
+}
diff -urN kernel26/arch/arm/mach-pxa/leds.c kernel26_h4000/arch/arm/mach-pxa/leds.c
--- kernel26/arch/arm/mach-pxa/leds.c	2003-10-15 08:48:22.000000000 -0600
+++ kernel26_h4000/arch/arm/mach-pxa/leds.c	2004-05-08 12:48:42.059746256 -0600
@@ -22,6 +22,8 @@
 		leds_event = lubbock_leds_event;
 	if (machine_is_pxa_idp())
 		leds_event = idp_leds_event;
+        if (machine_is_h4000() || machine_is_h1900())
+                leds_event = asic3_leds_event;
 
 	leds_event(led_start);
 	return 0;
diff -urN kernel26/arch/arm/mach-pxa/leds.h kernel26_h4000/arch/arm/mach-pxa/leds.h
--- kernel26/arch/arm/mach-pxa/leds.h	2003-07-14 12:56:37.000000000 -0600
+++ kernel26_h4000/arch/arm/mach-pxa/leds.h	2004-05-06 21:52:06.000000000 -0600
@@ -9,3 +9,4 @@
 
 extern void lubbock_leds_event(led_event_t evt);
 extern void idp_leds_event(led_event_t evt);
+extern void asic3_leds_event(led_event_t evt);
diff -urN kernel26/arch/arm/mach-pxa/Makefile kernel26_h4000/arch/arm/mach-pxa/Makefile
--- kernel26/arch/arm/mach-pxa/Makefile	2004-04-14 20:47:38.000000000 -0600
+++ kernel26_h4000/arch/arm/mach-pxa/Makefile	2004-05-08 10:08:47.000000000 -0600
@@ -14,6 +14,8 @@
 led-y := leds.o
 led-$(CONFIG_ARCH_LUBBOCK)	+= leds-lubbock.o
 led-$(CONFIG_ARCH_PXA_IDP)	+= leds-idp.o
+led-$(CONFIG_MACH_H4000)	+= leds-asic3.o
+led-$(CONFIG_ARCH_H1900)	+= leds-asic3.o
 
 obj-$(CONFIG_LEDS)		+= $(led-y)
 obj-$(CONFIG_PXA_IPAQ)		+= ipaq.o
