ARM: Nec MobilePro900/c: isp116x: USB host device hardware reset and defconfig update

ARM: Nec MobilePro900/c: isp116x: USB host device hardware reset and defconfig update
On MobilePro900 we have ability to hard reset usb chip through gpio65.
Also updating USB host related GPIO in platform configuration.

Signed-off-by: Yulay Rakhmangulov <yulayr@gmail.com>
Signed-off-by: Kristoffer <kristoffer@Boggieman.(none)>
diff --git a/arch/arm/configs/mp900_defconfig b/arch/arm/configs/mp900_defconfig
index aacaa2a..2ad4baa 100644
--- a/arch/arm/configs/mp900_defconfig
+++ b/arch/arm/configs/mp900_defconfig
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.34
-# Sun Sep 19 17:37:17 2010
+# Sun Jan  2 16:02:05 2011
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -1213,14 +1213,14 @@
 # CONFIG_SOUND_PRIME is not set
 CONFIG_HID_SUPPORT=y
 CONFIG_HID=y
-CONFIG_HIDRAW=y
+# CONFIG_HIDRAW is not set
 
 #
 # USB Input Devices
 #
 CONFIG_USB_HID=y
 # CONFIG_HID_PID is not set
-CONFIG_USB_HIDDEV=y
+# CONFIG_USB_HIDDEV is not set
 
 #
 # Special HID drivers
@@ -1247,7 +1247,7 @@
 CONFIG_HID_MICROSOFT=y
 # CONFIG_HID_MOSART is not set
 CONFIG_HID_MONTEREY=y
-CONFIG_HID_NTRIG=y
+# CONFIG_HID_NTRIG is not set
 CONFIG_HID_ORTEK=y
 CONFIG_HID_PANTHERLORD=y
 # CONFIG_PANTHERLORD_FF is not set
@@ -1264,7 +1264,7 @@
 CONFIG_HID_TOPSEED=y
 CONFIG_HID_THRUSTMASTER=y
 # CONFIG_THRUSTMASTER_FF is not set
-CONFIG_HID_WACOM=m
+# CONFIG_HID_WACOM is not set
 CONFIG_HID_ZEROPLUS=y
 # CONFIG_ZEROPLUS_FF is not set
 CONFIG_USB_SUPPORT=y
@@ -1278,7 +1278,7 @@
 #
 # Miscellaneous USB options
 #
-CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_DEVICEFS is not set
 # CONFIG_USB_DEVICE_CLASS is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 CONFIG_USB_MON=m
@@ -1301,9 +1301,9 @@
 #
 # USB Device Class drivers
 #
-CONFIG_USB_ACM=m
+# CONFIG_USB_ACM is not set
 CONFIG_USB_PRINTER=m
-CONFIG_USB_WDM=y
+# CONFIG_USB_WDM is not set
 # CONFIG_USB_TMC is not set
 
 #
@@ -1314,25 +1314,25 @@
 # also be needed; see USB_STORAGE Help for more info
 #
 CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-CONFIG_USB_STORAGE_DATAFAB=m
-CONFIG_USB_STORAGE_FREECOM=m
-CONFIG_USB_STORAGE_ISD200=m
-CONFIG_USB_STORAGE_USBAT=m
-CONFIG_USB_STORAGE_SDDR09=m
-CONFIG_USB_STORAGE_SDDR55=m
-CONFIG_USB_STORAGE_JUMPSHOT=m
-CONFIG_USB_STORAGE_ALAUDA=m
+CONFIG_USB_STORAGE_DEBUG=y
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
 # CONFIG_USB_STORAGE_ONETOUCH is not set
-CONFIG_USB_STORAGE_KARMA=m
+# CONFIG_USB_STORAGE_KARMA is not set
 # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
 # CONFIG_USB_LIBUSUAL is not set
 
 #
 # USB Imaging devices
 #
-CONFIG_USB_MDC800=m
-CONFIG_USB_MICROTEK=m
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
 
 #
 # USB port drivers
@@ -1343,7 +1343,7 @@
 # CONFIG_USB_SERIAL_AIRCABLE is not set
 # CONFIG_USB_SERIAL_ARK3116 is not set
 # CONFIG_USB_SERIAL_BELKIN is not set
-# CONFIG_USB_SERIAL_CH341 is not set
+CONFIG_USB_SERIAL_CH341=m
 # CONFIG_USB_SERIAL_WHITEHEAT is not set
 # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
 # CONFIG_USB_SERIAL_CP210X is not set
@@ -1367,7 +1367,7 @@
 # CONFIG_USB_SERIAL_MOS7720 is not set
 # CONFIG_USB_SERIAL_MOS7840 is not set
 # CONFIG_USB_SERIAL_MOTOROLA is not set
-CONFIG_USB_SERIAL_NAVMAN=m
+# CONFIG_USB_SERIAL_NAVMAN is not set
 # CONFIG_USB_SERIAL_PL2303 is not set
 # CONFIG_USB_SERIAL_OTI6858 is not set
 # CONFIG_USB_SERIAL_QCAUX is not set
@@ -1395,16 +1395,16 @@
 # CONFIG_USB_ADUTUX is not set
 # CONFIG_USB_SEVSEG is not set
 # CONFIG_USB_RIO500 is not set
-CONFIG_USB_LEGOTOWER=m
+# CONFIG_USB_LEGOTOWER is not set
 # CONFIG_USB_LCD is not set
-CONFIG_USB_LED=m
+# CONFIG_USB_LED is not set
 # CONFIG_USB_CYPRESS_CY7C63 is not set
 # CONFIG_USB_CYTHERM is not set
 # CONFIG_USB_IDMOUSE is not set
 # CONFIG_USB_FTDI_ELAN is not set
 # CONFIG_USB_APPLEDISPLAY is not set
 # CONFIG_USB_LD is not set
-CONFIG_USB_TRANCEVIBRATOR=m
+# CONFIG_USB_TRANCEVIBRATOR is not set
 # CONFIG_USB_IOWARRIOR is not set
 # CONFIG_USB_TEST is not set
 # CONFIG_USB_ISIGHTFW is not set
@@ -1678,7 +1678,7 @@
 #
 # Kernel hacking
 #
-# CONFIG_PRINTK_TIME is not set
+CONFIG_PRINTK_TIME=y
 CONFIG_ENABLE_WARN_DEPRECATED=y
 CONFIG_ENABLE_MUST_CHECK=y
 CONFIG_FRAME_WARN=1024
@@ -1719,7 +1719,6 @@
 CONFIG_FRAME_POINTER=y
 # CONFIG_BOOT_PRINTK_DELAY is not set
 # CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
 # CONFIG_BACKTRACE_SELF_TEST is not set
 # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
 # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
diff --git a/arch/arm/mach-pxa/mp900.c b/arch/arm/mach-pxa/mp900.c
index cfda24e..71c7968 100644
--- a/arch/arm/mach-pxa/mp900.c
+++ b/arch/arm/mach-pxa/mp900.c
@@ -195,16 +195,23 @@
 
 	GPIO1_RST,	/* RESET pin */
 
-	GPIO2_GPIO | MFP_LPM_CAN_WAKEUP | MFP_LPM_EDGE_RISE,	//? IRQ_GPIO(2)
-	GPIO3_GPIO | MFP_LPM_CAN_WAKEUP | MFP_LPM_EDGE_FALL,	//? IRQ_GPIO(3)
-
-	GPIO4_GPIO | MFP_LPM_EDGE_BOTH,							//? IRQ_GPIO(4)
+	GPIO4_GPIO | MFP_LPM_EDGE_BOTH,				//? IRQ_GPIO(4)
 
 	GPIO6_GPIO | MFP_LPM_CAN_WAKEUP | MFP_LPM_EDGE_FALL,	//? IRQ_GPIO(6)
 
 	MFP_CFG_OUT(GPIO12, AF0, DRIVE_HIGH),	//? output
 
-	GPIO63_GPIO | MFP_LPM_EDGE_FALL,	//? IRQ_GPIO(63)
+	/* USB chip Phillips isp116x */
+	MFP_CFG_OUT(GPIO65, AF0, DRIVE_HIGH),	/* nRESET */
+	/* USB Device Controller */
+	GPIO3_GPIO | MFP_LPM_CAN_WAKEUP,	/* MFP_LPM_EDGE_FALL nINT2 */
+	MFP_CFG_OUT(GPIO60, AF0, DRIVE_LOW),	/* D_WAKEUP */
+	GPIO62_GPIO,				/* D_SUSPEND */
+	/* USB Host Controller */
+	GPIO2_GPIO | MFP_LPM_CAN_WAKEUP,	/* MFP_LPM_EDGE_RISE nINT1 */
+	GPIO61_GPIO,				/* H_SUSPEND */
+	
+	GPIO63_GPIO, // | MFP_LPM_EDGE_FALL,	//? IRQ_GPIO(63)
 
 	MFP_CFG_OUT(GPIO72, AF0, DRIVE_LOW),	//? output
 	MFP_CFG_OUT(GPIO73, AF0, DRIVE_HIGH),	//? output
@@ -260,36 +267,63 @@
 
 	/* PWM 0/1 */
 	GPIO16_PWM0_OUT,
+	GPIO17_PWM1_OUT,
 
 	/* I2S audio interface to Wolfson WM8731 */
 	GPIO28_I2S_BITCLK_OUT,	/* BCLK */
 	GPIO29_I2S_SDATA_IN,	/* ADCDAT */
 	GPIO30_I2S_SDATA_OUT,	/* DACDAT */
 	GPIO31_I2S_SYNC,		/**/
-	GPIO32_I2S_SYSCLK,		/**/
+	GPIO32_I2S_SYSCLK,	/* XTI/MCLK */
 
 	/* SSP 1 control interface to Wolfson WM8731 */
 	GPIO23_SSP1_SCLK,
-	GPIO24_SSP1_SFRM,
+	GPIO24_SSP1_SFRM,	/* ADCDAT */
 	GPIO25_SSP1_TXD,
 	GPIO26_SSP1_RXD,
 
-	GPIO61_GPIO,
 };
 
 
-/* USB controller */
+/* isp116x USB controller */
+static void isp116x_hw_reset(void)
+{
+	unsigned long flags;
+	
+	printk(KERN_INFO "isp116x: Hardware reset...");
+
+	local_irq_save(flags);
+
+	GPCR(65) = GPIO_bit(65);	/* clear GPIO65 - activate nRESET */
+	udelay(300);			/* AN10044: nRESET time min 160 uS */
+	GPSR(65) = GPIO_bit(65);	/* set GPIO65 - deactivate nRESET */
+
+	local_irq_restore(flags);
+
+	mdelay(1);
+	printk(" done\n");
+}
 
 static void isp116x_pfm_delay(struct device *dev, int delay)
 {
-	ndelay(delay);
+        /* 400Mhz PXA2 = 2.5ns / instruction */
+
+         int cyc = delay / 5; //10;
+
+         /* 4 Instructions = 4 x 2.5ns = 10ns */
+         __asm__ volatile ("0:\n"
+                 "subs %0, %1, #1\n"
+                 "bge 0b\n"
+                 :"=r" (cyc)
+                 :"0"(cyc)
+         );
 }
 
 static struct isp116x_platform_data isp116x_pfm_data = {
 	.sel15Kres		= 1, /* Enable internal resistors on downstream ports */
 	.oc_enable		= 0, /* On-chip overcurrent protection */
 	.int_act_high		= 1, /* INT output polarity */
-	.int_edge_triggered	= 0, /* INT edge or level triggered */
+	.int_edge_triggered	= 1, /* INT edge or level triggered */
 	.remote_wakeup_enable	= 0, /* Wakeup by devices on usb bus */
 	.delay			= isp116x_pfm_delay,
 };
@@ -297,18 +331,18 @@
 static struct resource isp116x_pfm_resources[] = {
 	[0] =	{
 		.start	= 0x0d000000,	/* Host data port */
-		.end	= 0x0d000000,
+		.end	= 0x0d000001,
 		.flags	= IORESOURCE_MEM,
 		},
 	[1] =	{
 		.start  = 0x0d000002,	/* Host command port */
-		.end	= 0x0d000002,
+		.end	= 0x0d000003,
 		.flags  = IORESOURCE_MEM,
 		},
 	[2] =	{
-		.start	= IRQ_GPIO(61),
-		.end	= IRQ_GPIO(61),
-		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
+		.start	= IRQ_GPIO(2),
+		.end	= IRQ_GPIO(2),
+		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
 		},
 };
 
@@ -382,9 +416,9 @@
 
 static struct spi_board_info spi_board_info[] __initdata = {
 	[0] = {
-			.modalias		= "wm8731",
+			.modalias	= "wm8731",
 			.max_speed_hz	= 1843200,
-			.bus_num		= 1,
+			.bus_num	= 1,
 			.chip_select	= 0,
 	},
 };
@@ -415,17 +449,17 @@
 static struct mtd_partition mp900flash0_partitions[] = {
 	{
 		.name =         "Bootloader",
-		.size =         0x00040000,
+		.size =         0x00080000,
 		.offset =       0,
 		.mask_flags =   MTD_WRITEABLE  /* force read-only */
 	},{
 		.name =         "Kernel",
 		.size =         0x00400000,
-		.offset =       0x00040000,
+		.offset =       0x00080000,
 	},{
 		.name =         "Filesystem",
 		.size =         MTDPART_SIZ_FULL,
-		.offset =       0x00440000
+		.offset =       0x00480000
 	}
 };
 
@@ -500,6 +534,8 @@
 
 	pxa2xx_mfp_config(ARRAY_AND_SIZE(mp900_pin_config));
 
+	isp116x_hw_reset();
+	
 	pxa_set_ffuart_info(NULL); /* RS232 connector */
 
 	pxa_set_ficp_info(&mp900_ficp_platform_data);