aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorPavankumar Kondeti <pkondeti@codeaurora.org>2010-12-07 07:24:04 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2010-12-10 17:23:34 -0500
commitc036019ed2b729cb9517806c2b388b4f4323a904 (patch)
treef259d74516c3ef37dd00cc36d19cf8792daa374a /drivers
parent33f82f387b9cb27bc903e1368fce88b73213910a (diff)
USB: gadget: Implement runtime PM for ci13xxx gadget
The actual suspend/resume work is delegated to bus glue driver, which is responsible for putting hardware in low power mode. Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/gadget/ci13xxx_udc.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c
index c10d1aee5230..f200e472e476 100644
--- a/drivers/usb/gadget/ci13xxx_udc.c
+++ b/drivers/usb/gadget/ci13xxx_udc.c
@@ -60,6 +60,7 @@
60#include <linux/irq.h> 60#include <linux/irq.h>
61#include <linux/kernel.h> 61#include <linux/kernel.h>
62#include <linux/slab.h> 62#include <linux/slab.h>
63#include <linux/pm_runtime.h>
63#include <linux/usb/ch9.h> 64#include <linux/usb/ch9.h>
64#include <linux/usb/gadget.h> 65#include <linux/usb/gadget.h>
65#include <linux/usb/otg.h> 66#include <linux/usb/otg.h>
@@ -2348,6 +2349,7 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
2348 2349
2349 if (gadget_ready) { 2350 if (gadget_ready) {
2350 if (is_active) { 2351 if (is_active) {
2352 pm_runtime_get_sync(&_gadget->dev);
2351 hw_device_reset(udc); 2353 hw_device_reset(udc);
2352 hw_device_state(udc->ci13xxx_ep[0].qh[RX].dma); 2354 hw_device_state(udc->ci13xxx_ep[0].qh[RX].dma);
2353 } else { 2355 } else {
@@ -2356,6 +2358,7 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active)
2356 udc->udc_driver->notify_event(udc, 2358 udc->udc_driver->notify_event(udc,
2357 CI13XXX_CONTROLLER_STOPPED_EVENT); 2359 CI13XXX_CONTROLLER_STOPPED_EVENT);
2358 _gadget_stop_activity(&udc->gadget); 2360 _gadget_stop_activity(&udc->gadget);
2361 pm_runtime_put_sync(&_gadget->dev);
2359 } 2362 }
2360 } 2363 }
2361 2364
@@ -2473,16 +2476,20 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
2473 goto done; 2476 goto done;
2474 } 2477 }
2475 2478
2479 pm_runtime_get_sync(&udc->gadget.dev);
2476 if (udc->udc_driver->flags & CI13XXX_PULLUP_ON_VBUS) { 2480 if (udc->udc_driver->flags & CI13XXX_PULLUP_ON_VBUS) {
2477 if (udc->vbus_active) { 2481 if (udc->vbus_active) {
2478 if (udc->udc_driver->flags & CI13XXX_REGS_SHARED) 2482 if (udc->udc_driver->flags & CI13XXX_REGS_SHARED)
2479 hw_device_reset(udc); 2483 hw_device_reset(udc);
2480 } else { 2484 } else {
2485 pm_runtime_put_sync(&udc->gadget.dev);
2481 goto done; 2486 goto done;
2482 } 2487 }
2483 } 2488 }
2484 2489
2485 retval = hw_device_state(udc->ci13xxx_ep[0].qh[RX].dma); 2490 retval = hw_device_state(udc->ci13xxx_ep[0].qh[RX].dma);
2491 if (retval)
2492 pm_runtime_put_sync(&udc->gadget.dev);
2486 2493
2487 done: 2494 done:
2488 spin_unlock_irqrestore(udc->lock, flags); 2495 spin_unlock_irqrestore(udc->lock, flags);
@@ -2522,6 +2529,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
2522 udc->udc_driver->notify_event(udc, 2529 udc->udc_driver->notify_event(udc,
2523 CI13XXX_CONTROLLER_STOPPED_EVENT); 2530 CI13XXX_CONTROLLER_STOPPED_EVENT);
2524 _gadget_stop_activity(&udc->gadget); 2531 _gadget_stop_activity(&udc->gadget);
2532 pm_runtime_put(&udc->gadget.dev);
2525 } 2533 }
2526 2534
2527 /* unbind gadget */ 2535 /* unbind gadget */
@@ -2723,6 +2731,8 @@ static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev,
2723 if (retval) 2731 if (retval)
2724 goto remove_dbg; 2732 goto remove_dbg;
2725 } 2733 }
2734 pm_runtime_no_callbacks(&udc->gadget.dev);
2735 pm_runtime_enable(&udc->gadget.dev);
2726 2736
2727 _udc = udc; 2737 _udc = udc;
2728 return retval; 2738 return retval;