From 1110b791232d64e83f269d20dfff0ce36f6bf809 Mon Sep 17 00:00:00 2001 From: yangkai Date: Mon, 23 Jul 2012 17:39:01 +0800 Subject: [PATCH] fix pcd connect and disconnect bug --- drivers/usb/dwc_otg/dwc_otg_driver.c | 14 +++++++++----- drivers/usb/dwc_otg/dwc_otg_hcd.c | 1 + drivers/usb/dwc_otg/dwc_otg_pcd.c | 2 +- drivers/usb/dwc_otg/dwc_otg_pcd_intr.c | 4 +--- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/usb/dwc_otg/dwc_otg_driver.c b/drivers/usb/dwc_otg/dwc_otg_driver.c index 34af78a3a4dd..5efdecdd4705 100755 --- a/drivers/usb/dwc_otg/dwc_otg_driver.c +++ b/drivers/usb/dwc_otg/dwc_otg_driver.c @@ -1498,6 +1498,9 @@ static __devinit int dwc_otg_driver_probe(struct platform_device *pdev) dwc_otg_device->core_if->usb_mode = USB_MODE_FORCE_HOST; #else dwc_otg_device->core_if->usb_mode = USB_MODE_NORMAL; +#ifdef CONFIG_DWC_OTG_DEFAULT_DEVICE + dwc_otg_device->core_if->usb_mode = USB_MODE_FORCE_DEVICE; +#endif #endif #endif @@ -2044,16 +2047,17 @@ static __devinit int host20_driver_probe(struct platform_device *pdev) */ #ifdef CONFIG_ARCH_RK29 unsigned int * otg_phy_con1 = (unsigned int*)(USB_GRF_CON); -#endif -#ifdef CONFIG_ARCH_RK30 - unsigned int * otg_phy_con1 = (unsigned int*)(USBGRF_UOC1_CON2); -#endif - otgreg = * otg_phy_con1; otgreg |= (0x01<<13); // software control otgreg |= (0x01<<14); // exit suspend. otgreg &= ~(0x01<<13); // software control *otg_phy_con1 = otgreg; +#endif +#ifdef CONFIG_ARCH_RK30 + unsigned int * otg_phy_con1 = (unsigned int*)(USBGRF_UOC1_CON2); + *otg_phy_con1 = ((0x01<<2)<<16); // exit suspend. +#endif + #if 0 *otg_phy_con1 |= (0x01<<2); *otg_phy_con1 |= (0x01<<3); // exit suspend. diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd.c b/drivers/usb/dwc_otg/dwc_otg_hcd.c index e85ada78ead6..bef6e0db01d9 100755 --- a/drivers/usb/dwc_otg/dwc_otg_hcd.c +++ b/drivers/usb/dwc_otg/dwc_otg_hcd.c @@ -1267,6 +1267,7 @@ int __devinit host20_hcd_init(struct device *dev) } #ifdef CONFIG_ARCH_RK30 + dwc_otg_hcd->host_setenable = 1; dwc_otg_hcd->connect_detect_timer.function = dwc_otg_hcd_connect_detect; dwc_otg_hcd->connect_detect_timer.data = (unsigned long)(dwc_otg_hcd); init_timer( &dwc_otg_hcd->connect_detect_timer); diff --git a/drivers/usb/dwc_otg/dwc_otg_pcd.c b/drivers/usb/dwc_otg/dwc_otg_pcd.c index c89715f0e4dc..35b8a9e08d67 100755 --- a/drivers/usb/dwc_otg/dwc_otg_pcd.c +++ b/drivers/usb/dwc_otg/dwc_otg_pcd.c @@ -1845,7 +1845,7 @@ static void dwc_otg_pcd_check_vbus_timer( unsigned long pdata ) dwc_otg_msc_unlock(_pcd); } /* every 500 ms open usb phy power and start 1 jiffies timer to get vbus */ - if( _pcd->phy_suspend == 0 ) + else if( _pcd->phy_suspend == 0 ) /* no vbus detect here , close usb phy */ dwc_otg20phy_suspend( 0 ); } diff --git a/drivers/usb/dwc_otg/dwc_otg_pcd_intr.c b/drivers/usb/dwc_otg/dwc_otg_pcd_intr.c index 991ff028339f..e514b558a7d7 100755 --- a/drivers/usb/dwc_otg/dwc_otg_pcd_intr.c +++ b/drivers/usb/dwc_otg/dwc_otg_pcd_intr.c @@ -1053,10 +1053,8 @@ static inline void do_gadget_setup( dwc_otg_pcd_t *_pcd, { SPIN_UNLOCK(&_pcd->lock); ret = _pcd->driver->setup(&_pcd->gadget, _ctrl); - if(spin_is_locked(&_pcd->lock)){ + if(spin_is_locked(&_pcd->lock)) DWC_PRINT("%s warning: pcd->lock locked without unlock\n", __func__); - SPIN_UNLOCK(&_pcd->lock); - } SPIN_LOCK(&_pcd->lock); if (ret < 0) { -- 2.34.1