diff -urN kernel26/arch/arm/mach-pxa/h4000/h4000.c kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000.c
--- kernel26/arch/arm/mach-pxa/h4000/h4000.c	2005-12-07 21:35:07.000000000 -0700
+++ kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000.c	2006-01-28 13:42:35.000000000 -0700
@@ -21,8 +21,7 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
 
 #include <asm/irq.h>
 #include <asm/mach-types.h>
@@ -31,7 +30,6 @@
 
 #include <asm/mach/irq.h>
 #include <asm/mach/arch.h>
-#include <asm/mach/map.h>
 
 #include <asm/arch/bitfield.h>
 #include <asm/arch/pxa-regs.h>
@@ -47,6 +45,16 @@
 
 void h4000_ll_pm_init(void);
 
+static struct platform_device h4000_lcd       = { .name = "h4000_lcd", };
+static struct platform_device h4000_udc       = { .name = "h4000_udc", };
+static struct platform_device h4000_pcmcia    = { .name = "h4000_pcmcia", };
+
+static struct platform_device *h4000_asic3_devices[] __initdata = {
+	&h4000_lcd,
+	&h4000_udc,
+	&h4000_pcmcia,
+};
+
 static struct asic3_platform_data h4000_asic3_platform_data = {
 	.gpio_a = {
 		.dir            = 0xfc7f,
@@ -80,6 +88,8 @@
 		.alt_function   = 0x0000,
 		.sleep_conf     = 0x000c,
 	},
+	.child_platform_devs     = h4000_asic3_devices,
+	.num_child_platform_devs = ARRAY_SIZE(h4000_asic3_devices),
 };
 
 static struct resource h4000_asic3_resources[] = {
@@ -103,9 +113,6 @@
 };
 EXPORT_SYMBOL(h4000_asic3);
 
-static struct platform_device *devices[] __initdata = {
-	&h4000_asic3,
-};
 
 /*
  * LCCR0: 0x003008f9 -- ENB=0x1,  CMS=0x0, SDS=0x0, LDM=0x1,
@@ -169,7 +176,7 @@
 #ifdef CONFIG_PM
 	h4000_ll_pm_init();
 #endif
-	platform_add_devices(devices, ARRAY_SIZE(devices));
+	platform_device_register(&h4000_asic3);
 }
 
 MACHINE_START(H4000, "HP iPAQ h4000")
@@ -181,7 +188,7 @@
 	.map_io		= h4000_map_io,
 	.init_irq	= h4000_init_irq,
 	.init_machine	= h4000_init,
-	.timer = &pxa_timer,
+	.timer		= &pxa_timer,
 MACHINE_END
 
 /* vim: set ts=8 tw=80 shiftwidth=8 noet: */
diff -urN kernel26/arch/arm/mach-pxa/h4000/h4000_lcd.c kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_lcd.c
--- kernel26/arch/arm/mach-pxa/h4000/h4000_lcd.c	2005-03-28 04:30:43.000000000 -0700
+++ kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_lcd.c	2006-01-28 13:06:13.000000000 -0700
@@ -13,6 +13,7 @@
 
 #include <linux/types.h>
 #include <asm/arch/hardware.h>  /* for pxa-regs.h (__REG) */
+#include <linux/platform_device.h>
 #include <asm/arch/pxa-regs.h>  /* LCCR[0,1,2,3]* */
 #include <asm/arch/bitfield.h>  /* for pxa-regs.h (Fld, etc) */
 #include <asm/arch/pxafb.h>     /* pxafb_mach_info, set_pxa_fb_info */
@@ -155,7 +156,7 @@
 	return 0;
 }
 
-struct lcd_properties h4000_lcd_properties =
+static struct lcd_properties h4000_lcd_properties =
 {
 	.owner          = THIS_MODULE,
 	.get_power      = h4000_lcd_get_power,
@@ -175,37 +176,69 @@
 	.set_brightness = h4000_bl_set_brightness,
 };
 
-static struct lcd_device *pxafb_lcd_device;
-static struct backlight_device *pxafb_backlight_device;
+static struct lcd_device *h4000_lcd_dev;
+static struct backlight_device *h4000_bl_dev;
 
-static int h4000_lcd_init(void)
+static int h4000_lcd_probe(struct device * dev)
 {
-	if (!machine_is_h4000())
-		return -ENODEV;
-
-	pxafb_lcd_device = lcd_device_register("pxa2xx-fb", NULL,
+	h4000_lcd_dev = 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("pxa2xx-fb", NULL,
+	h4000_bl_dev = backlight_device_register("pxa2xx-fb", NULL,
 			&h4000_bl_properties);
-	if (IS_ERR (pxafb_backlight_device)) {
-		printk("%s: backlight_device_register failed\n", __FUNCTION__);
-		backlight_device_unregister(pxafb_backlight_device);
-		return PTR_ERR (pxafb_backlight_device);
+	if (IS_ERR(h4000_lcd_dev) || IS_ERR(h4000_bl_dev)) {
+		printk("h4000_lcd_probe: error registering devices\n");
+		return -1;
 	}
 
 	return 0;
 }
 
+static int h4000_lcd_remove(struct device * dev)
+{
+	backlight_device_unregister(h4000_bl_dev);
+	lcd_device_unregister(h4000_lcd_dev);
+	h4000_lcd_set_power(h4000_lcd_dev, 4);
+	h4000_bl_set_power(h4000_bl_dev, 4);
+
+	return 0;
+}
+
+static int h4000_lcd_suspend(struct device * dev, pm_message_t state)
+{
+	h4000_bl_set_power(h4000_bl_dev, 4);
+	h4000_lcd_set_power(h4000_lcd_dev, 4);
+	return 0;
+}
+
+static int h4000_lcd_resume(struct device * dev)
+{
+	h4000_lcd_set_power(h4000_lcd_dev, 0);
+	h4000_bl_set_power(h4000_bl_dev, 0);
+	return 0;
+}
+
+static struct device_driver h4000_lcd_driver = {
+	.name     = "h4000_lcd",
+	.bus      = &platform_bus_type,
+	.probe    = h4000_lcd_probe,
+	.remove   = h4000_lcd_remove,
+	.suspend  = h4000_lcd_suspend,
+	.resume   = h4000_lcd_resume,
+};
+
+static int h4000_lcd_init(void)
+{
+	if (!machine_is_h4000())
+		return -ENODEV;
+
+	return driver_register(&h4000_lcd_driver);
+}
+
 static void h4000_lcd_exit(void)
 {
-	lcd_device_unregister(pxafb_lcd_device);
-	backlight_device_unregister(pxafb_backlight_device);
+	lcd_device_unregister(h4000_lcd_dev);
+	backlight_device_unregister(h4000_bl_dev);
+	driver_unregister(&h4000_lcd_driver);
 }
 
 module_init(h4000_lcd_init);
diff -urN kernel26/arch/arm/mach-pxa/h4000/h4000_pcmcia.c kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_pcmcia.c
--- kernel26/arch/arm/mach-pxa/h4000/h4000_pcmcia.c	2005-06-26 13:54:42.000000000 -0600
+++ kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_pcmcia.c	2006-01-28 13:11:20.000000000 -0700
@@ -12,7 +12,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
 #include <asm/hardware.h>
 #include <asm/arch/pxa-regs.h>
 #include <asm/hardware/ipaq-asic3.h>
@@ -115,14 +115,26 @@
 	.dev = {.platform_data = &h4000_pcmcia_ops},
 };
 
-static int __init h4000_pcmcia_init(void)
+static int __init h4000_pcmcia_probe(struct device * dev)
 {
 	return (platform_device_register(&h4000_pcmcia));
 }
 
+static struct device_driver h4000_pcmcia_driver = {
+        .name     = "h4000_pcmcia",
+        .bus      = &platform_bus_type,
+        .probe    = h4000_pcmcia_probe,
+};
+
+static int __init h4000_pcmcia_init(void)
+{  
+    return driver_register(&h4000_pcmcia_driver);
+}
+
 static void __exit h4000_pcmcia_exit(void)
 {
 	platform_device_unregister(&h4000_pcmcia);
+    driver_unregister(&h4000_pcmcia_driver);
 }
 
 module_init(h4000_pcmcia_init);
diff -urN kernel26/arch/arm/mach-pxa/h4000/h4000_serial.c kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_serial.c
--- kernel26/arch/arm/mach-pxa/h4000/h4000_serial.c	2005-06-26 13:54:42.000000000 -0600
+++ kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_serial.c	2006-01-28 12:22:00.000000000 -0700
@@ -7,7 +7,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/pxa-regs.h>
 #include <linux/soc/asic3_base.h>
diff -urN kernel26/arch/arm/mach-pxa/h4000/h4000_ts.c kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_ts.c
--- kernel26/arch/arm/mach-pxa/h4000/h4000_ts.c	2005-03-05 14:59:35.000000000 -0700
+++ kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_ts.c	2006-01-28 12:21:39.000000000 -0700
@@ -445,7 +445,7 @@
     dev->absfuzz[ABS_Y] = 2;
     dev->absflat[ABS_X] = 4;
     dev->absflat[ABS_Y] = 4;
-    dev->id.bustype = BUS_PXA_NSSP;
+    dev->id.bustype = BUS_HOST;
     dev->id.vendor = 0xffff;
     dev->id.product = 0xffff;
     dev->id.version = 0xffff;
diff -urN kernel26/arch/arm/mach-pxa/h4000/h4000_udc.c kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_udc.c
--- kernel26/arch/arm/mach-pxa/h4000/h4000_udc.c	2005-06-26 13:54:42.000000000 -0600
+++ kernel26.15-hh0/arch/arm/mach-pxa/h4000/h4000_udc.c	2006-01-28 13:05:24.000000000 -0700
@@ -6,7 +6,7 @@
 
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/device.h>
+#include <linux/platform_device.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/pxa-regs.h>
 #include <asm/arch/udc.h>
@@ -43,12 +43,23 @@
 	.udc_command      = h4000_udc_command,
 };
 
-static int __init h4000_udc_init(void)
+static int h4000_udc_probe(struct device * dev)
 {
 	pxa_set_udc_info(&h4000_udc_info);
 	return 0;
 }
 
+static struct device_driver h4000_udc_driver = {
+	.name     = "h4000_udc",
+	.bus      = &platform_bus_type,
+	.probe    = h4000_udc_probe,
+};
+
+static int __init h4000_udc_init(void)
+{
+	return driver_register(&h4000_udc_driver);
+}
+
 module_init(h4000_udc_init);
 MODULE_LICENSE("GPL");
 
