handle pcd multiprocess spin_lock
authoryangkai <yk@rock-chips.com>
Sat, 5 May 2012 08:57:30 +0000 (16:57 +0800)
committeryangkai <yk@rock-chips.com>
Sat, 5 May 2012 08:57:30 +0000 (16:57 +0800)
drivers/usb/dwc_otg/dwc_otg_pcd.c
drivers/usb/dwc_otg/dwc_otg_pcd_intr.c
drivers/usb/dwc_otg/linux/dwc_otg_plat.h

index e46b36934f6b999e966fa2bd68e568a9dd8205f3..9c50fcb4826b4f1745aa1c53570da7988a095f3e 100755 (executable)
@@ -287,8 +287,7 @@ static int dwc_otg_pcd_ep_enable(struct usb_ep *_ep,
                return -ESHUTDOWN;
        }
 
-       local_irq_save(flags);
-//     SPIN_LOCK_IRQSAVE(&pcd->lock, flags);
+       SPIN_LOCK_IRQSAVE(&pcd->lock, flags);
                
        ep->desc = _desc;
        ep->ep.maxpacket = le16_to_cpu (_desc->wMaxPacketSize);
@@ -355,8 +354,7 @@ static int dwc_otg_pcd_ep_enable(struct usb_ep *_ep,
                                        ep->dwc_ep.type, ep->dwc_ep.maxpacket, ep->desc );
                
        dwc_otg_ep_activate( GET_CORE_IF(pcd), &ep->dwc_ep );
-//     SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
-    local_irq_restore(flags);
+       SPIN_UNLOCK_IRQRESTORE(&pcd->lock, flags);
        return 0;
 }
 
@@ -383,8 +381,7 @@ static int dwc_otg_pcd_ep_disable(struct usb_ep *_ep)
                return -EINVAL;
        }
                
-//     SPIN_LOCK_IRQSAVE(&ep->pcd->lock, flags);
-    local_irq_save(flags);
+       SPIN_LOCK_IRQSAVE(&ep->pcd->lock, flags);
        request_nuke( ep );                
 
        dwc_otg_ep_deactivate( GET_CORE_IF(ep->pcd), &ep->dwc_ep );
@@ -397,8 +394,7 @@ static int dwc_otg_pcd_ep_disable(struct usb_ep *_ep)
                release_tx_fifo(GET_CORE_IF(ep->pcd), ep->dwc_ep.tx_fifo_num);
        }       
        
-//     SPIN_UNLOCK_IRQRESTORE(&ep->pcd->lock, flags);
-    local_irq_restore(flags);
+       SPIN_UNLOCK_IRQRESTORE(&ep->pcd->lock, flags);
 
        DWC_DEBUGPL(DBG_PCD, "%s disabled\n", _ep->name);
        return 0;
@@ -1152,9 +1148,7 @@ static int32_t dwc_otg_pcd_suspend_cb( void *_p ,int suspend)
 //#endif               
        if (pcd->driver && pcd->driver->resume) 
        {
-               SPIN_UNLOCK(&pcd->lock);
                pcd->driver->suspend(&pcd->gadget);
-               SPIN_LOCK(&pcd->lock);
        }
        return 1;
 }
@@ -1172,9 +1166,7 @@ static int32_t dwc_otg_pcd_resume_cb( void *_p )
        
        if (pcd->driver && pcd->driver->resume) 
        {
-                       SPIN_UNLOCK(&pcd->lock);
                        pcd->driver->resume(&pcd->gadget);
-                       SPIN_LOCK(&pcd->lock);
        }
        
        /* Stop the SRP timeout timer. */
index 60cf52d1e21e9ab81d5bc7d09e84bac5b74a43a1..224054ceaabb24f32a649c7388a2ecafa7f3d4aa 100755 (executable)
@@ -558,6 +558,8 @@ void dwc_otg_pcd_stop(dwc_otg_pcd_t *_pcd)
        dwc_otg_pcd_ep_t *ep;
        
        gintmsk_data_t intr_mask = {.d32 = 0};
+    
+    SPIN_LOCK(&_pcd->lock);
 
        num_in_eps = GET_CORE_IF(_pcd)->dev_if->num_in_eps;
        num_out_eps = GET_CORE_IF(_pcd)->dev_if->num_out_eps;
@@ -607,6 +609,7 @@ void dwc_otg_pcd_stop(dwc_otg_pcd_t *_pcd)
                _pcd->driver->disconnect(&_pcd->gadget);
                SPIN_LOCK(&_pcd->lock);
        }
+               SPIN_UNLOCK(&_pcd->lock);
 }
 
 /**
index 9037479461fa8e6b8c1c5a174d4cd93809f5d084..e3f7d6e996404319a6a68e389cbdd8c9e284f3f0 100755 (executable)
@@ -155,7 +155,7 @@ static __inline__ void MDELAY( const uint32_t _msecs )
  */
 static __inline__ void SPIN_LOCK( spinlock_t *_lock )  
 {
-//        spin_lock(_lock);
+        spin_lock(_lock);
 }
 
 /**
@@ -166,7 +166,7 @@ static __inline__ void SPIN_LOCK( spinlock_t *_lock )
  */
 static __inline__ void SPIN_UNLOCK( spinlock_t *_lock )     
 { 
-//        spin_unlock(_lock);
+        spin_unlock(_lock);
 }
 
 /**