--- linux-2.6.16/arch/arm/mach-pxa/spitz.c~	2006-05-03 13:00:49.000000000 +0000
+++ linux-2.6.16/arch/arm/mach-pxa/spitz.c	2006-05-03 16:37:21.000000000 +0000
@@ -402,16 +402,6 @@
 	pxa_gpio_mode(SPITZ_GPIO_USB_HOST | GPIO_OUT);
 	pxa_gpio_mode(SPITZ_GPIO_USB_DEVICE | GPIO_IN);
 
-	/* Setup USB Port 2 Output Control Register */
-	UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
-
-	GPSR(SPITZ_GPIO_USB_HOST) = GPIO_bit(SPITZ_GPIO_USB_HOST);
-
-	UHCHR = (UHCHR) &
-		~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE);
-
-	UHCRHDA |= UHCRHDA_NOCP;
-
 	return 0;
 }
 
--- linux-2.6.16/drivers/input/keyboard/spitzkbd.c.orig	2006-05-03 13:35:55.000000000 +0000
+++ linux-2.6.16/drivers/input/keyboard/spitzkbd.c	2006-05-03 16:20:20.000000000 +0000
@@ -277,6 +277,26 @@
 	return IRQ_HANDLED;
 }
 
+static void spitzkbd_usbcable(struct spitzkbd *spitzkbd_data)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&spitzkbd_data->lock, flags);
+	
+	input_report_switch(spitzkbd_data->input, SW_4, ((GPLR1 & GPIO_bit(SPITZ_GPIO_USB_CONNECT)) == 0));
+	input_report_switch(spitzkbd_data->input, SW_5, ((GPLR1 & GPIO_bit(SPITZ_GPIO_USB_HOST)) != 0));
+	input_report_switch(spitzkbd_data->input, SW_6, ((GPLR1 & GPIO_bit(SPITZ_GPIO_USB_DEVICE)) != 0));
+
+	spin_unlock_irqrestore(&spitzkbd_data->lock, flags);
+}
+
+static irqreturn_t spitzkbd_usbcable_isr(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct spitzkbd *spitzkbd_data = dev_id;
+	spitzkbd_usbcable(spitzkbd_data);
+	return IRQ_HANDLED;
+}
+
 #define HINGE_STABLE_COUNT 2
 static int sharpsl_hinge_state;
 static int hinge_count;
@@ -402,6 +422,10 @@
 	set_bit(SW_1, input_dev->swbit);
 	set_bit(SW_2, input_dev->swbit);
 
+	set_bit(SW_4, input_dev->swbit);
+	set_bit(SW_5, input_dev->swbit);
+	set_bit(SW_6, input_dev->swbit);
+
 	input_register_device(input_dev);
 
 	mod_timer(&spitzkbd->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL));
@@ -440,6 +464,17 @@
 		    SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING,
 		    "Spitzkbd HP", spitzkbd);
 
+	pxa_gpio_mode(SPITZ_GPIO_USB_CONNECT | GPIO_OUT);
+
+	request_irq(IRQ_GPIO(SPITZ_GPIO_USB_CONNECT), spitzkbd_usbcable_isr,
+		    SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING,
+		    "Spitzkbd UsbCable", spitzkbd);
+	request_irq(IRQ_GPIO(SPITZ_GPIO_USB_DEVICE), spitzkbd_usbcable_isr,
+		    SA_INTERRUPT | SA_TRIGGER_RISING | SA_TRIGGER_FALLING,
+		    "Spitzkbd UsbCable", spitzkbd);
+
+	spitzkbd_usbcable(spitzkbd);
+
 	printk(KERN_INFO "input: Spitz Keyboard Registered\n");
 
 	return 0;
@@ -458,6 +493,8 @@
 	free_irq(SPITZ_IRQ_GPIO_SWA, spitzkbd);
 	free_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd);
 	free_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd);
+	free_irq(IRQ_GPIO(SPITZ_GPIO_USB_CONNECT), spitzkbd);
+	free_irq(IRQ_GPIO(SPITZ_GPIO_USB_DEVICE), spitzkbd);
 
 	del_timer_sync(&spitzkbd->htimer);
 	del_timer_sync(&spitzkbd->timer);
--- linux-2.6.16/drivers/usb/host/ohci-pxa27x.c~	2006-05-03 13:04:39.000000000 +0000
+++ linux-2.6.16/drivers/usb/host/ohci-pxa27x.c	2006-05-03 14:46:36.000000000 +0000
@@ -28,6 +28,10 @@
 #include <asm/arch/pxa-regs.h>
 #include <asm/arch/ohci.h>
 
+#ifdef CONFIG_PXA_SHARP_Cxx00
+#include <asm/arch/spitz.h>
+#endif
+
 #define PXA_UHC_MAX_PORTNUM    3
 
 #define UHCRHPS(x)              __REG2( 0x4C000050, (x)<<2 )
@@ -82,6 +86,20 @@
 
 	pxa_set_cken(CKEN10_USBHOST, 1);
 
+#ifdef CONFIG_PXA_SHARP_Cxx00
+	/* Setup USB Port 2 Output Control Register */
+	UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
+
+
+	UHCHR = (UHCHR) &
+		~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE);
+
+	UHCRHDA |= UHCRHDA_NOCP;
+
+        /* Set GPIO Pin Hi to Unconnect Host */
+	GPSR(SPITZ_GPIO_USB_HOST) = GPIO_bit(SPITZ_GPIO_USB_HOST);
+#endif
+
 	UHCHR |= UHCHR_FHR;
 	udelay(11);
 	UHCHR &= ~UHCHR_FHR;
@@ -123,6 +141,11 @@
 	UHCCOMS |= 1;
 	udelay(10);
 
+#ifdef CONFIG_PXA_SHARP_Cxx00
+	/* Set GPIO Pin Low to Unconnect Host */
+	GPCR(SPITZ_GPIO_USB_HOST) = GPIO_bit(SPITZ_GPIO_USB_HOST);
+#endif
+
 	pxa_set_cken(CKEN10_USBHOST, 0);
 }
 
@@ -369,6 +392,12 @@
 	pr_debug ("block sizes: ed %d td %d\n",
 		sizeof (struct ed), sizeof (struct td));
 
+#ifdef CONFIG_PXA_SHARP_Cxx00
+	if (GPLR1 & GPIO_bit(SPITZ_GPIO_USB_CONNECT)) {
+	    return -ENODEV;
+	}
+#endif
+
 	return platform_driver_register(&ohci_hcd_pxa27x_driver);
 }
 

