diff -urN kernel26/arch/arm/mach-pxa/h4000.c kernel26_h4000/arch/arm/mach-pxa/h4000.c
--- kernel26/arch/arm/mach-pxa/h4000.c	2004-04-02 23:13:42.000000000 -0700
+++ kernel26_h4000/arch/arm/mach-pxa/h4000.c	2004-04-15 21:30:32.536590848 -0600
@@ -19,13 +19,13 @@
 
 #include <linux/lcd.h>
 #include <linux/backlight.h>
-#include <linux/fb.h>  // needed by pxafb.h
-#include "../../../drivers/video/pxafb.h" /* pxafb_mach_info */
+#include <linux/fb.h>
+#include "../../../drivers/video/pxafb.h"
 #include <asm/arch/udc.h>
 
-#include <asm/arch/ipaq.h> // struct ipaq_model_ops
-#include <asm/mach/map.h>  // struct map_desc
-#include "generic.h" // pxa_map_io()
+#include <asm/arch/ipaq.h>
+#include <asm/mach/map.h>
+#include "generic.h"
 #include <asm/mach/arch.h>
 #include <asm/hardware/ipaq-asic3.h>
 
@@ -55,16 +55,15 @@
 
 static void h4000_udc_command (int cmd)
 {
-        // I dont think this works... GPIO[10] probably isnt the usb pullup
         switch (cmd)
         {
         case PXA2XX_UDC_CMD_DISCONNECT:
-            //GPSR0 |= 0x400;
-            printk("%s: make usb disappear:a GPLR0 0x%x\n",__FUNCTION__,GPLR0);
+            IPAQ_ASIC3_GPIO_D_OUT(IPAQ_ASIC3_VIRT) &= ~0x1;
+            /* printk("%s: make usb disappear\n",__FUNCTION__); */
             break;
         case PXA2XX_UDC_CMD_CONNECT:
-            //GPCR0 |= 0x400;
-            printk("%s: let usb appear:a GPLR0 0x%x\n",__FUNCTION__,GPLR0);
+            IPAQ_ASIC3_GPIO_D_OUT(IPAQ_ASIC3_VIRT) |= 0x1;
+            /* printk("%s: let usb appear\n",__FUNCTION__); */
             break;
         default:
             printk("_udc_control: unknown command!\n");
@@ -75,7 +74,8 @@
 static int h4000_udc_is_connected (void)
 {
     /* do we see host?  FIXME: return a meaningful value here...*/
-      printk("%s: is usb connected: GPLR0 0x%x\n",__FUNCTION__,GPLR0);
+    /*  printk("%s: is usb connected: GPIO 10 =%d\n",
+              __FUNCTION__,(GPLR0 & 0x400)); */
       return 1;
 }
 
@@ -96,7 +96,7 @@
 {
         unsigned int* ptr;
 
-        ptr = IPAQ_ASIC3_VIRT + gpiobase;
+        ptr = (unsigned int* )IPAQ_ASIC3_VIRT + gpiobase;
         printk("---------- BEGIN ASIC3 GPIO%d DUMP\n", gpiobase/0x100);
         printk("MASK: %04x\n", *(ptr));
         printk("DIR : %04x\n", *(ptr+1));
@@ -146,6 +146,65 @@
     PRER = 0;
     /* 3.6864 MHz oscillator power-down enable */
     PCFR = PCFR_OPDE;
+
+    /* Initialize the ASIC */
+    IPAQ_ASIC3_CLOCK_CDEX(IPAQ_ASIC3_VIRT) = 0x26c3;
+    IPAQ_ASIC3_CLOCK_SEL(IPAQ_ASIC3_VIRT)  = 0x0007;
+
+    IPAQ_ASIC3_GPIO_A_MASK(IPAQ_ASIC3_VIRT)                 = 0xffff;
+    IPAQ_ASIC3_GPIO_A_DIR(IPAQ_ASIC3_VIRT)                  = 0xfc7f;
+    IPAQ_ASIC3_GPIO_A_LEVELTRI(IPAQ_ASIC3_VIRT)             = 0x0000;
+    IPAQ_ASIC3_GPIO_A_RISING(IPAQ_ASIC3_VIRT)               = 0x0000;
+    IPAQ_ASIC3_GPIO_A_LEVEL(IPAQ_ASIC3_VIRT)                = 0x0000;
+    IPAQ_ASIC3_GPIO_A_SLEEP_MASK(IPAQ_ASIC3_VIRT)           = 0xffff;
+    IPAQ_ASIC3_GPIO_A_SLEEP_OUT(IPAQ_ASIC3_VIRT)            = 0x0000;
+    IPAQ_ASIC3_GPIO_A_BATT_FAULT_OUT(IPAQ_ASIC3_VIRT)       = 0x0000;
+    IPAQ_ASIC3_GPIO_A_INT_STATUS(IPAQ_ASIC3_VIRT)           = 0x0000;
+    IPAQ_ASIC3_GPIO_A_SLEEP_CONF(IPAQ_ASIC3_VIRT)           = 0x000c;
+    /* (1<<6) turns on serial */
+    IPAQ_ASIC3_GPIO_A_OUT(IPAQ_ASIC3_VIRT)                  = 0x0000 | (1<<6);
+    
+    IPAQ_ASIC3_GPIO_B_MASK(IPAQ_ASIC3_VIRT)                 = 0xffff;
+    IPAQ_ASIC3_GPIO_B_DIR(IPAQ_ASIC3_VIRT)                  = 0xddbf; //0xdfbf
+    IPAQ_ASIC3_GPIO_B_LEVELTRI(IPAQ_ASIC3_VIRT)             = 0x0000;
+    IPAQ_ASIC3_GPIO_B_RISING(IPAQ_ASIC3_VIRT)               = 0x0000;
+    IPAQ_ASIC3_GPIO_B_LEVEL(IPAQ_ASIC3_VIRT)                = 0x0000;
+    IPAQ_ASIC3_GPIO_B_SLEEP_MASK(IPAQ_ASIC3_VIRT)           = 0xffff;
+    IPAQ_ASIC3_GPIO_B_SLEEP_OUT(IPAQ_ASIC3_VIRT)            = 0x0000;
+    IPAQ_ASIC3_GPIO_B_BATT_FAULT_OUT(IPAQ_ASIC3_VIRT)       = 0x0000;
+    IPAQ_ASIC3_GPIO_B_INT_STATUS(IPAQ_ASIC3_VIRT)           = 0x0000;
+    IPAQ_ASIC3_GPIO_B_SLEEP_CONF(IPAQ_ASIC3_VIRT)           = 0x000c;
+    IPAQ_ASIC3_GPIO_B_OUT(IPAQ_ASIC3_VIRT)                  = 0x1c00;
+    
+    IPAQ_ASIC3_GPIO_C_MASK(IPAQ_ASIC3_VIRT)                 = 0xffff;
+    IPAQ_ASIC3_GPIO_C_DIR(IPAQ_ASIC3_VIRT)                  = 0xffff;
+    IPAQ_ASIC3_GPIO_C_LEVELTRI(IPAQ_ASIC3_VIRT)             = 0x0000;
+    IPAQ_ASIC3_GPIO_C_RISING(IPAQ_ASIC3_VIRT)               = 0x0000;
+    IPAQ_ASIC3_GPIO_C_LEVEL(IPAQ_ASIC3_VIRT)                = 0x0000;
+    IPAQ_ASIC3_GPIO_C_SLEEP_MASK(IPAQ_ASIC3_VIRT)           = 0xffff;
+    IPAQ_ASIC3_GPIO_C_SLEEP_OUT(IPAQ_ASIC3_VIRT)            = 0x4000;
+    IPAQ_ASIC3_GPIO_C_BATT_FAULT_OUT(IPAQ_ASIC3_VIRT)       = 0x4000;
+    IPAQ_ASIC3_GPIO_C_INT_STATUS(IPAQ_ASIC3_VIRT)           = 0x0000;
+    IPAQ_ASIC3_GPIO_OFFSET(IPAQ_ASIC3_VIRT, u16, C, AltFunction) = 0x0003;
+    IPAQ_ASIC3_GPIO_C_SLEEP_CONF(IPAQ_ASIC3_VIRT)           = 0x000c;
+    IPAQ_ASIC3_GPIO_C_OUT(IPAQ_ASIC3_VIRT)                  = 0x4700;
+    
+    IPAQ_ASIC3_GPIO_D_MASK(IPAQ_ASIC3_VIRT)                 = 0xff03;
+    IPAQ_ASIC3_GPIO_D_DIR(IPAQ_ASIC3_VIRT)                  = 0xef03;
+    IPAQ_ASIC3_GPIO_D_LEVELTRI(IPAQ_ASIC3_VIRT)             = 0x00fc;
+    IPAQ_ASIC3_GPIO_D_RISING(IPAQ_ASIC3_VIRT)               = 0x0080;
+    IPAQ_ASIC3_GPIO_D_LEVEL(IPAQ_ASIC3_VIRT)                = 0x0000;
+    IPAQ_ASIC3_GPIO_D_SLEEP_MASK(IPAQ_ASIC3_VIRT)           = 0xff83;
+    IPAQ_ASIC3_GPIO_D_SLEEP_OUT(IPAQ_ASIC3_VIRT)            = 0x0100;
+    IPAQ_ASIC3_GPIO_D_BATT_FAULT_OUT(IPAQ_ASIC3_VIRT)       = 0x0100;
+    IPAQ_ASIC3_GPIO_D_INT_STATUS(IPAQ_ASIC3_VIRT)           = 0x0000;
+    IPAQ_ASIC3_GPIO_D_SLEEP_CONF(IPAQ_ASIC3_VIRT)           = 0x000c;
+    /* (1<<14) turns on usb */
+    IPAQ_ASIC3_GPIO_D_OUT(IPAQ_ASIC3_VIRT)                  = 0x0f02 | (1<<14);
+    
+    IPAQ_ASIC3_INTR_IntMask(IPAQ_ASIC3_VIRT)= 0x0003;
+    IPAQ_ASIC3_INTR_IntCPS(IPAQ_ASIC3_VIRT) = 0x001e;
+    IPAQ_ASIC3_INTR_IntTBS(IPAQ_ASIC3_VIRT) = 0x000a;
     
     ipaq_model_ops = h4000_model_ops;
 }

