summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorAlbert Chen <R65187@freescale.com>2010-01-28 09:58:40 +0800
committerAlejandro Gonzalez <alex.gonzalez@digi.com>2010-05-25 11:13:33 +0200
commit6788f64c9521eecd48d6af298e828ff5cd660389 (patch)
tree05a174de8d3b9b2b2a89426cbe6c3a86e3d771d5 /drivers/usb
parent762f3cfa3716f18c54e83590588b3797df2f74ab (diff)
ENGR00117742-2 add usb support for mx28
kernel part Signed-off-by: Albert Chen <r65187@freescale.com> Signed-off-by: Alejandro Gonzalez <alex.gonzalez@digi.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/core/hub.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index b39a3941ce4d..6a84c8b31125 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -41,6 +41,14 @@
#define STMP3XXX_USB_HOST_HACK
#endif
+#ifdef CONFIG_ARCH_MXS
+#define MXS_USB_HOST_HACK
+
+#include <linux/fsl_devices.h>
+extern void fsl_platform_set_usb_phy_dis(struct fsl_usb2_platform_data *pdata,
+ bool enable);
+#endif
+
#ifdef STMP3XXX_USB_HOST_HACK
#include <linux/fsl_devices.h>
#include <mach/regs-usbphy.h>
@@ -2725,6 +2733,20 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
}
#endif
+#ifdef MXS_USB_HOST_HACK
+ { /*Must enable HOSTDISCONDETECT after second reset*/
+ if (port1 == 1) {
+ if (udev->speed == USB_SPEED_HIGH) {
+ struct device *dev = hcd->self.controller;
+ struct fsl_usb2_platform_data *pdata;
+ pdata = (struct fsl_usb2_platform_data *)
+ dev->platform_data;
+ fsl_platform_set_usb_phy_dis(pdata, 1);
+ }
+ }
+ }
+#endif
+
if (retval)
goto fail;
@@ -2880,6 +2902,24 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
}
#endif
+#ifdef MXS_USB_HOST_HACK
+ {
+ struct device *dev = hcd->self.controller;
+ struct fsl_usb2_platform_data *pdata;
+
+ pdata = (struct fsl_usb2_platform_data *)dev->platform_data;
+ if (dev->parent && dev->type) {
+ if (port1 == 1 && pdata->platform_init)
+ pdata->platform_init(NULL);
+ }
+ if (port1 == 1) {
+ if (!(portstatus&USB_PORT_STAT_CONNECTION)) {
+ /* Must clear HOSTDISCONDETECT when disconnect*/
+ fsl_platform_set_usb_phy_dis(pdata, 0);
+ }
+ }
+ }
+#endif
if (hub->has_indicators) {
set_port_led(hub, port1, HUB_LED_AUTO);