diff -urN kernel26/arch/arm/mach-pxa/h4000/Kconfig kernel26_a/arch/arm/mach-pxa/h4000/Kconfig
--- kernel26/arch/arm/mach-pxa/h4000/Kconfig	2005-03-07 19:07:20.000000000 -0700
+++ kernel26_a/arch/arm/mach-pxa/h4000/Kconfig	2005-03-20 11:27:28.000000000 -0700
@@ -14,3 +14,7 @@
 config IPAQ_H4000_BUTTONS
         tristate "Buttons support"
         depends on IPAQ_HANDHELD && MACH_H4000 && IPAQ_ASIC3
+
+config IPAQ_H4000_KEY
+	tristate "h4300 keyboard / h4100 Application Buttons Support"
+	depends on IPAQ_HANDHELD && MACH_H4000 && IPAQ_ASIC3
diff -urN kernel26/arch/arm/mach-pxa/h4000/Makefile kernel26_a/arch/arm/mach-pxa/h4000/Makefile
--- kernel26/arch/arm/mach-pxa/h4000/Makefile	2005-03-07 19:07:20.000000000 -0700
+++ kernel26_a/arch/arm/mach-pxa/h4000/Makefile	2005-03-20 11:28:13.000000000 -0700
@@ -6,4 +6,5 @@
 obj-$(CONFIG_IPAQ_H4000_LCD)    += h4000_lcd.o
 obj-$(CONFIG_IPAQ_H4000_TS)     += h4000_ts.o
 obj-$(CONFIG_IPAQ_H4000_BUTTONS)        += h4000_buttons.o
+obj-$(CONFIG_IPAQ_H4000_KEY)    += h4000_key.o
 
diff -urN kernel26/arch/arm/mach-pxa/h4000/h4000.c kernel26_a/arch/arm/mach-pxa/h4000/h4000.c
--- kernel26/arch/arm/mach-pxa/h4000/h4000.c	2005-03-19 11:05:28.000000000 -0700
+++ kernel26_a/arch/arm/mach-pxa/h4000/h4000.c	2005-03-20 11:44:17.443883496 -0700
@@ -33,9 +33,11 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
+#include <asm/arch/bitfield.h>
 #include <asm/arch/pxa-regs.h>
 #include <asm/arch/ipaq.h>
 #include <asm/arch/udc.h>
+#include <asm/arch/pxafb.h>
 #include <asm/arch/h4000-gpio.h>
 #include <asm/arch/h4000-init.h>
 #include <asm/arch/h4000-asic.h>
@@ -134,7 +136,7 @@
 static struct resource h4000_asic3_resources[] = {
 	[0] = {
 		.start  = H4000_ASIC3_PHYS,
-		.end    = H4000_ASIC3_PHYS + 0xfffff,
+		.end    = H4000_ASIC3_PHYS + IPAQ_ASIC3_MAP_SIZE,
 		.flags  = IORESOURCE_MEM,
 	},
 	[1] = {
@@ -143,7 +145,7 @@
 	},
 };
 
-static struct platform_device h4000_asic3_device = {
+struct platform_device h4000_asic3 = {
 	.name           = "asic3",
 	.id             = 0,
 	.num_resources  = ARRAY_SIZE(h4000_asic3_resources),
@@ -152,7 +154,37 @@
 };
 
 static struct platform_device *devices[] __initdata = {
-	&h4000_asic3_device,
+	&h4000_asic3,
+};
+
+/*
+ * LCCR0: 0x003008f9 -- ENB=0x1,  CMS=0x0, SDS=0x0, LDM=0x1,
+ *                      SFM=0x1,  IUM=0x1, EFM=0x1, PAS=0x1,
+ *                      res=0x0,  DPD=0x0, DIS=0x0, QDM=0x1,
+ *                      PDD=0x0,  BM=0x1,  OUM=0x1, res=0x0
+ * LCCR1: 0x13070cef -- BLW=0x13, ELW=0x7, HSW=0x3, PPL=0xef
+ * LCCR2: 0x0708013f -- BFW=0x7,  EFW=0x8, VSW=0x0, LPP=0x13f
+ * LCCR3: 0x04700008 -- res=0x0,  DPC=0x0, BPP=0x4, OEP=0x0, PCP=0x1
+ *                      HSP=0x1,  VSP=0x1, API=0x0, ACD=0x0, PCD=0x8
+ */
+
+static struct pxafb_mach_info sony_acx502bmu __initdata= {
+        .pixclock     = 171521,     // (160756 > 180849)
+        .bpp          = 16,         // BPP (0x4 == 16bits)
+        .xres         = 240,        // PPL + 1
+        .yres         = 320,        // LPP + 1
+        .hsync_len    = 4,          // HSW + 1
+        .vsync_len    = 1,          // VSW + 1
+        .left_margin  = 20,         // BLW + 1
+        .upper_margin = 8,          // BFW + 1
+        .right_margin = 8,          // ELW + 1
+        .lower_margin = 9,          // EFW + 1
+        .sync         = 0,
+        .lccr0        = LCCR0_Act | LCCR0_Sngl | LCCR0_Color,
+        .lccr3        = LCCR3_OutEnH | LCCR3_PixFlEdg | LCCR3_Acb(0),
+
+        //.pxafb_backlight_power = ,
+        //.pxafb_lcd_power =       ,
 };
 
 /*
@@ -192,9 +224,10 @@
 
 static void __init h4000_init(void)
 {
+	platform_add_devices(devices, ARRAY_SIZE(devices));
 	pxa_set_udc_info(&h4000_udc_info);
+	set_pxa_fb_info(&sony_acx502bmu);
 	h4000_rs232(0,0,0);
-	platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
 MACHINE_START(H4000, "HP iPAQ h4000")
diff -urN kernel26/arch/arm/mach-pxa/h4000/h4000_key.c kernel26_a/arch/arm/mach-pxa/h4000/h4000_key.c
--- kernel26/arch/arm/mach-pxa/h4000/h4000_key.c	1969-12-31 17:00:00.000000000 -0700
+++ kernel26_a/arch/arm/mach-pxa/h4000/h4000_key.c	2005-03-20 12:08:57.745843392 -0700
@@ -0,0 +1,307 @@
+#include <linux/module.h>
+#include <asm/irq.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <asm/arch/h4000-gpio.h>
+#include <asm/arch/h4000-asic.h>
+#include "../../common/ipaq/asic3_base.h"
+
+#include <asm/mach/irq.h>
+
+#define KEY_FUNC 0x32
+
+#undef IS_H4100
+
+extern struct platform_device h4000_asic3;
+static struct input_dev h4000_key_dev;
+static char *h4000_key_name = "h4000 asic3 key driver";
+static char *h4000_key_phys = "h4000_key/input0";
+
+static unsigned int h4300kbd_keycode[0x80] = {
+/*0*/   0, 0, 0, 0, 0, 0, 0, 0,
+        0,         0,              KEY_CALENDAR,  KEY_CONTACTS,
+        0,         0,              KEY_EMAIL,     KEY_HP,
+/*1*/   KEY_R,     KEY_RIGHT,      KEY_W,         KEY_E,
+        KEY_SELECT,KEY_U,          KEY_I,         KEY_P,
+        KEY_F,     KEY_Y,          KEY_Q,         KEY_D,
+        KEY_DOWN,  KEY_K,          KEY_O,         KEY_BACKSPACE,
+/*2*/   KEY_X,     KEY_H,          KEY_A,         KEY_S,
+        KEY_T,     KEY_J,          KEY_L,         KEY_ENTER,
+        KEY_C,     KEY_B,          KEY_LEFTSHIFT, KEY_Z,
+        KEY_G,     KEY_M,          KEY_BACKSLASH/*!*/, KEY_APOSTROPHE,
+/*3*/   KEY_ESC,   KEY_SPACE,      0/*KEY_FUNC*/, KEY_TAB,
+        KEY_V,     KEY_N,          KEY_COMMA,     KEY_QUESTION,
+        KEY_LEFT,  KEY_UP,         0, 0,
+        KEY_LEFTCTRL,  KEY_DOT,    0, 0,
+/*4*/   0, 0, 0, 0, 0, 0, 0, 0,
+        0,         0,              KEY_PROG1,     KEY_PROG2,
+        0,         0,              KEY_PROG3,     KEY_PROG4,
+/*5*/   0/*%*/,    KEY_RIGHT,      0/*@*/,        0/*$*/,
+        KEY_SELECT,KEY_1,          KEY_2,         KEY_SLASH,
+        KEY_EQUAL, KEY_MINUS,      0/*~*/,        0,/*:*/
+        KEY_DOWN,  KEY_5,          KEY_3,         KEY_DELETE,
+/*6*/   KEY_SEMICOLON/*;*/,    KEY_KPPLUS,     0/*{*/,        0/*}*/,
+        0/*_*/,    KEY_4,          KEY_6,         KEY_ENTER,
+        KEY_LEFT,  KEY_RIGHT,      KEY_CAPSLOCK,  0/*&*/,
+        KEY_UP,    KEY_8,          KEY_9,         0/*"*/,
+/*7*/   KEY_ESC,   KEY_COMPOSE,    0/*KEY_FUNC*/, KEY_TAB,
+        KEY_DOWN,  KEY_7,          KEY_0,         0/*#*/,
+        KEY_LEFT,  KEY_UP,         0, 0,
+        KEY_MENU,  KEY_KPASTERISK, 0, 0
+};
+
+static int asic3_spi_process_byte( unsigned char data )
+{
+#define ASIC3_SPI_CTRL    (0x400)
+#define ASIC3_SPI_DATA    (0x408)
+#define SPI_CTRL_SEL      (1 << 6)
+#define SPI_CTRL_SPIE     (1 << 5)
+#define SPI_CTRL_SPE      (1 << 4)
+	unsigned long flags;
+	unsigned int  timeout;
+	unsigned int  ctrl;
+	int           result = 0;
+
+	local_irq_save(flags);
+	/* Enable interrupts */
+	ctrl = asic3_read_register(&h4000_asic3.dev,
+			ASIC3_SPI_CTRL) | SPI_CTRL_SPIE;
+	asic3_write_register(&h4000_asic3.dev, ASIC3_SPI_CTRL, ctrl);
+
+	/* Send data */
+	asic3_write_register(&h4000_asic3.dev, ASIC3_SPI_DATA, data);
+	/* Start the transfer */
+	asic3_write_register(&h4000_asic3.dev,
+			ASIC3_SPI_CTRL, (ctrl | SPI_CTRL_SPE));
+
+	for (timeout = 255; timeout > 0; timeout--) {
+		if ( !(asic3_read_register(&h4000_asic3.dev,
+					ASIC3_SPI_CTRL) & SPI_CTRL_SPE )) {
+			udelay(20);    /* wait for a while, or we'll miss it */
+			result = asic3_read_register(&h4000_asic3.dev,
+					ASIC3_SPI_DATA);
+			break;
+		}
+	}
+	/* Disable interrupts */
+	ctrl = asic3_read_register(&h4000_asic3.dev,
+                        ASIC3_SPI_CTRL) & ~SPI_CTRL_SPIE;
+	asic3_write_register(&h4000_asic3.dev, ASIC3_SPI_CTRL, ctrl);
+		
+	local_irq_restore(flags);
+	return result & 0xff;
+}
+
+static irqreturn_t h4000_keyboard(int irq, void *dev_id, struct pt_regs *regs)
+{
+
+#define FN_PRESS (1<<0)
+#define FN_REL   (1<<1)
+#define KEY_REL  (1<<2)
+	int pressed;
+	unsigned char scancode = 0;
+	static unsigned char fn_flags = 0;
+
+	scancode = asic3_spi_process_byte(0);
+
+	if (scancode & 0x80) {
+		pressed = 0;
+		scancode &= ~0x80;
+	} else
+		pressed = 1;
+
+	if (scancode < 0x80) {
+		if (scancode == KEY_FUNC) {
+			if (pressed)
+				fn_flags = FN_PRESS;
+			else if (fn_flags & KEY_REL)
+				fn_flags = 0;
+			else
+				fn_flags |= FN_REL;
+		}
+		if (scancode != KEY_FUNC && fn_flags) {
+			scancode = h4300kbd_keycode[scancode+0x40];
+			if (!pressed) {
+				if (fn_flags & FN_REL)
+					fn_flags = 0;
+				else
+					fn_flags |= KEY_REL;
+			}
+		} else
+			scancode = h4300kbd_keycode[scancode];
+
+		input_regs(&h4000_key_dev, regs);
+		input_report_key(&h4000_key_dev, scancode, pressed);
+		input_sync(&h4000_key_dev);
+	} else
+		printk("%s: error code 0x%x\n", __FUNCTION__, scancode);
+
+	return IRQ_HANDLED;
+}
+static irqreturn_t h4000_record_btn(int irq, void *dev_id, struct pt_regs *regs)
+{
+	printk("...record button...\n");
+	input_regs(&h4000_key_dev, regs);
+	input_report_key(&h4000_key_dev, KEY_RECORD, 1);
+	input_report_key(&h4000_key_dev, KEY_RECORD, 0);
+	input_sync(&h4000_key_dev);
+	return IRQ_HANDLED;
+}
+
+#ifdef IS_H4100
+static irqreturn_t h4000_task_btn(int irq, void *dev_id, struct pt_regs *regs)
+{
+	printk("...task button...\n");
+	input_regs(&h4000_key_dev, regs);
+	input_report_key(&h4000_key_dev, KEY_HP, 1);
+	input_report_key(&h4000_key_dev, KEY_HP, 0);
+	input_sync(&h4000_key_dev);
+	return IRQ_HANDLED;
+}
+static irqreturn_t h4000_mail_btn(int irq, void *dev_id, struct pt_regs *regs)
+{
+	printk("...mail button...\n");
+	input_regs(&h4000_key_dev, regs);
+	input_report_key(&h4000_key_dev, KEY_EMAIL, 1);
+	input_report_key(&h4000_key_dev, KEY_EMAIL, 0);
+	input_sync(&h4000_key_dev);
+	return IRQ_HANDLED;
+}
+static irqreturn_t h4000_contacts_btn(int irq, void *dev_id, struct pt_regs *regs)
+{
+	printk("...contacts button...\n");
+	input_regs(&h4000_key_dev, regs);
+	input_report_key(&h4000_key_dev, KEY_CONTACTS, 1);
+	input_report_key(&h4000_key_dev, KEY_CONTACTS, 0);
+	input_sync(&h4000_key_dev);
+	return IRQ_HANDLED;
+}
+static irqreturn_t h4000_calendar_btn(int irq, void *dev_id, struct pt_regs *regs)
+{
+	printk("...calendar button...\n");
+	input_regs(&h4000_key_dev, regs);
+	input_report_key(&h4000_key_dev, KEY_CALENDAR, 1);
+	input_report_key(&h4000_key_dev, KEY_CALENDAR, 0);
+	input_sync(&h4000_key_dev);
+	return IRQ_HANDLED;
+}
+#endif
+
+static void setup_h4300_keyboard(void)
+{
+	ipaq_asic3_set_gpio_dir_b(&h4000_asic3.dev, GPIOB_KEYBOARD_IRQ, 0);	
+	ipaq_asic3_set_gpio_out_b(&h4000_asic3.dev,
+		(GPIOB_MICRO_3V3_EN | GPIOB_KEYBOARD_WAKE_UP),
+		(GPIOB_MICRO_3V3_EN | GPIOB_KEYBOARD_WAKE_UP) );
+
+	ipaq_asic3_set_gpio_dir_c(&h4000_asic3.dev, GPIOC_KEY_RXD, 0);
+	ipaq_asic3_set_gpio_alt_fn_c(&h4000_asic3.dev, 
+		GPIOC_KEY_RXD | GPIOC_KEY_TXD | GPIOC_KEY_CLK,
+		GPIOC_KEY_RXD | GPIOC_KEY_TXD | GPIOC_KEY_CLK);
+#ifndef IS_H4100
+	ipaq_asic3_set_gpio_dir_d(&h4000_asic3.dev, 
+		(GPIOD_TASK_BUTTON_N     | GPIOD_MAIL_BUTTON_N |
+		 GPIOD_CONTACTS_BUTTON_N | GPIOD_CALENDAR_BUTTON_N),
+		(GPIOD_TASK_BUTTON_N     | GPIOD_MAIL_BUTTON_N |
+		 GPIOD_CONTACTS_BUTTON_N | GPIOD_CALENDAR_BUTTON_N));
+#endif
+}
+
+static int __init h4000_key_init(void)
+{
+	int i, irq_base;
+
+	irq_base = asic3_irq_base(&h4000_asic3.dev);
+
+	setup_h4300_keyboard();
+
+	init_input_dev(&h4000_key_dev);
+
+	h4000_key_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
+	h4000_key_dev.keycode = h4300kbd_keycode;
+	h4000_key_dev.keycodesize = sizeof(unsigned char);
+	h4000_key_dev.keycodemax = ARRAY_SIZE(h4300kbd_keycode);
+
+	for (i = 0; i < h4000_key_dev.keycodemax; i++)
+		if (h4300kbd_keycode[i])
+			set_bit(h4300kbd_keycode[i], h4000_key_dev.keybit);
+
+	set_bit(KEY_RECORD, h4000_key_dev.keybit);
+#ifdef IS_H4100
+	set_bit(KEY_HP, h4000_key_dev.keybit);
+	set_bit(KEY_EMAIL, h4000_key_dev.keybit);
+	set_bit(KEY_CONTACTS, h4000_key_dev.keybit);
+	set_bit(KEY_CALENDAR, h4000_key_dev.keybit);
+#endif
+	if (request_irq(irq_base + H4000_KEYBOARD_IRQ, &h4000_keyboard,
+				SA_INTERRUPT, "keyboard", NULL))
+		printk("request_irq failed for H4000_KEYBOARD_IRQ\n");
+	else
+		set_irq_type(H4000_KEYBOARD_IRQ, IRQT_BOTHEDGE);
+	
+	if (request_irq(irq_base + H4000_RECORD_BTN_IRQ, &h4000_record_btn,
+				SA_INTERRUPT, "record button", NULL))
+		printk("request_irq failed for H4000_RECORD_BTN_IRQ\n");
+	else
+		set_irq_type(H4000_RECORD_BTN_IRQ, IRQT_BOTHEDGE);
+#ifdef IS_H4100
+	if (request_irq(irq_base + H4000_TASK_BTN_IRQ, &h4000_task_btn,
+				SA_INTERRUPT, "task button", NULL))
+		printk("request_irq failed for H4000_TASK_BTN_IRQ\n");
+	else
+		set_irq_type(H4000_TASK_BTN_IRQ, IRQT_BOTHEDGE);
+
+	if (request_irq(irq_base + H4000_MAIL_BTN_IRQ, &h4000_mail_btn,
+				SA_INTERRUPT, "mail button", NULL))
+		printk("request_irq failed for H4000_MAIL_BTN_IRQ\n");
+	else
+		set_irq_type(H4000_MAIL_BTN_IRQ, IRQT_BOTHEDGE);
+	
+	if (request_irq(irq_base + H4000_CONTACTS_BTN_IRQ, &h4000_contacts_btn,
+				SA_INTERRUPT, "contacts button", NULL))
+		printk("request_irq failed for H4000_CONTACTS_BTN_IRQ\n");
+	else
+		set_irq_type(H4000_CONTACTS_BTN_IRQ, IRQT_BOTHEDGE);
+	
+	if (request_irq(irq_base + H4000_CALENDAR_BTN_IRQ, &h4000_calendar_btn,
+				SA_INTERRUPT, "calendar button", NULL))
+		printk("request_irq failed for H4000_CALENDAR_BTN_IRQ\n");
+	else
+		set_irq_type(H4000_CALENDAR_BTN_IRQ, IRQT_BOTHEDGE);
+#endif
+	h4000_key_dev.name = h4000_key_name;
+	h4000_key_dev.phys = h4000_key_phys;
+	h4000_key_dev.id.bustype = BUS_HOST;
+	h4000_key_dev.id.vendor = 0x1;
+	h4000_key_dev.id.product = 0x1;
+	h4000_key_dev.id.version = 0x1;
+
+	input_register_device(&h4000_key_dev);
+
+	printk(KERN_INFO "input: %s\n", h4000_key_name);
+
+	return 0;
+}
+
+static void __exit h4000_key_exit(void)
+{
+	input_unregister_device(&h4000_key_dev);
+	free_irq(H4000_KEYBOARD_IRQ, &h4000_keyboard);
+	free_irq(H4000_RECORD_BTN_IRQ, &h4000_record_btn);
+#ifdef IS_H4100
+	free_irq(H4000_TASK_BTN_IRQ, &h4000_task_btn);
+	free_irq(H4000_MAIL_BTN_IRQ, &h4000_mail_btn);
+	free_irq(H4000_CONTACTS_BTN_IRQ, &h4000_contacts_btn);
+	free_irq(H4000_CALENDAR_BTN_IRQ, &h4000_calendar_btn);
+#endif
+}
+
+module_init(h4000_key_init);
+module_exit(h4000_key_exit);
+MODULE_AUTHOR("Shawn Anderson");
+MODULE_DESCRIPTION("Support for h4300/h4100 buttons/keyboard");
+MODULE_LICENSE("GPL");
+
+/* vim: set ts=8 tw=80 shiftwidth=8 noet: */
+
diff -urN kernel26/arch/arm/mach-pxa/h4000/h4000_lcd.c kernel26_a/arch/arm/mach-pxa/h4000/h4000_lcd.c
--- kernel26/arch/arm/mach-pxa/h4000/h4000_lcd.c	2005-03-07 19:07:21.000000000 -0700
+++ kernel26_a/arch/arm/mach-pxa/h4000/h4000_lcd.c	2005-03-20 11:32:22.000000000 -0700
@@ -88,12 +88,9 @@
 	if (power < 1) {
 		IPAQ_ASIC3_GPIO_B_OUT(H4000_ASIC3_VIRT) |= 
 			GPIOB_BACKLIGHT_POWER_ON;
-		pxa_gpio_mode(GPIO16_PWM0_MD);
-		pxa_set_cken(CKEN0_PWM0, 1);
 	} else {
 		IPAQ_ASIC3_GPIO_B_OUT(H4000_ASIC3_VIRT) & 
 			~GPIOB_BACKLIGHT_POWER_ON;
-		pxa_set_cken(CKEN0_PWM0, 0);
 	}
 	return 0;
 }
@@ -132,36 +129,6 @@
 	return 0;
 }
 
-/*
- * LCCR0: 0x003008f9 -- ENB=0x1,  CMS=0x0, SDS=0x0, LDM=0x1,
- *                      SFM=0x1,  IUM=0x1, EFM=0x1, PAS=0x1,
- *                      res=0x0,  DPD=0x0, DIS=0x0, QDM=0x1,
- *                      PDD=0x0,  BM=0x1,  OUM=0x1, res=0x0
- * LCCR1: 0x13070cef -- BLW=0x13, ELW=0x7, HSW=0x3, PPL=0xef
- * LCCR2: 0x0708013f -- BFW=0x7,  EFW=0x8, VSW=0x0, LPP=0x13f
- * LCCR3: 0x04700008 -- res=0x0,  DPC=0x0, BPP=0x4, OEP=0x0, PCP=0x1
- *                      HSP=0x1,  VSP=0x1, API=0x0, ACD=0x0, PCD=0x8
- */
-
-static struct pxafb_mach_info sony_acx502bmu __initdata= {
-        .pixclock     = 171521,     // (160756 > 180849)
-        .bpp          = 16,         // BPP (0x4 == 16bits)
-        .xres         = 240,        // PPL + 1
-        .yres         = 320,        // LPP + 1
-        .hsync_len    = 4,          // HSW + 1
-        .vsync_len    = 1,          // VSW + 1
-        .left_margin  = 20,         // BLW + 1
-        .upper_margin = 8,          // BFW + 1
-        .right_margin = 8,          // ELW + 1
-        .lower_margin = 9,          // EFW + 1
-        .sync         = 0,
-        .lccr0        = LCCR0_Act | LCCR0_Sngl | LCCR0_Color,
-        .lccr3        = LCCR3_OutEnH | LCCR3_PixFlEdg | LCCR3_Acb(0),
-
-        //.pxafb_backlight_power = ,
-        //.pxafb_lcd_power =       ,
-};
-
 struct lcd_properties h4000_lcd_properties =
 {
 	.owner          = THIS_MODULE,
@@ -190,21 +157,19 @@
 	if (!machine_is_h4000())
 		return -ENODEV;
 
-	//should we have to run both set_pxa_fb_info and lcd_device_register?
-	set_pxa_fb_info(&sony_acx502bmu);	
-
-	pxafb_lcd_device = lcd_device_register("pxafb", NULL,
+	pxafb_lcd_device = lcd_device_register("pxa2xx-fb", NULL,
 			&h4000_lcd_properties);
 	if (IS_ERR (pxafb_lcd_device)) {
 		printk("%s: lcd_device_register failed\n", __FUNCTION__);
+		lcd_device_unregister(pxafb_lcd_device);
 		return PTR_ERR (pxafb_lcd_device);
 	}
 
-	pxafb_backlight_device = backlight_device_register("pxafb", NULL,
+	pxafb_backlight_device = backlight_device_register("pxa2xx-fb", NULL,
 			&h4000_bl_properties);
 	if (IS_ERR (pxafb_backlight_device)) {
 		printk("%s: backlight_device_register failed\n", __FUNCTION__);
-		lcd_device_unregister(pxafb_lcd_device);
+		backlight_device_unregister(pxafb_backlight_device);
 		return PTR_ERR (pxafb_backlight_device);
 	}
 
diff -urN kernel26/include/asm-arm/arch-pxa/h4000-asic.h kernel26_a/include/asm-arm/arch-pxa/h4000-asic.h
--- kernel26/include/asm-arm/arch-pxa/h4000-asic.h	2005-03-07 19:13:25.000000000 -0700
+++ kernel26_a/include/asm-arm/arch-pxa/h4000-asic.h	2005-03-20 11:02:04.000000000 -0700
@@ -95,5 +95,14 @@
 /* 3 -> TEMP_AD */
 /* 7 -> MBAT_ID */
 
+/* ASIC3 IRQs */
+#define H4000_KEYBOARD_IRQ     (ASIC3_GPIOB_IRQ_BASE+1)
+#define H4000_RECORD_BTN_IRQ   (ASIC3_GPIOD_IRQ_BASE+2)
+#define H4000_TASK_BTN_IRQ     (ASIC3_GPIOD_IRQ_BASE+3)
+#define H4000_MAIL_BTN_IRQ     (ASIC3_GPIOD_IRQ_BASE+4)
+#define H4000_CONTACTS_BTN_IRQ (ASIC3_GPIOD_IRQ_BASE+5)
+#define H4000_CALENDAR_BTN_IRQ (ASIC3_GPIOD_IRQ_BASE+6)
+#define H4000_HEADPHONE_IN_IRQ (ASIC3_GPIOD_IRQ_BASE+7)
+
 #endif /* _INCLUDE_H4000_ASIC_H_ */
 

