diff options
author | Pavankumar Kondeti <pkondeti@codeaurora.org> | 2010-12-07 07:24:04 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-12-10 17:23:34 -0500 |
commit | c036019ed2b729cb9517806c2b388b4f4323a904 (patch) | |
tree | f259d74516c3ef37dd00cc36d19cf8792daa374a /drivers | |
parent | 33f82f387b9cb27bc903e1368fce88b73213910a (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.c | 10 |
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; |