aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorMarek Szyprowski <m.szyprowski@samsung.com>2014-02-28 07:06:11 -0500
committerFelipe Balbi <balbi@ti.com>2014-03-05 15:40:06 -0500
commitb83e333a4d03b73eb5ea7fc1cb86683c2575b237 (patch)
tree4346066f0dfd5b6fdaaeeb1fd257d6a311046e23 /drivers/usb
parentaecbc31d767cb549e93a44e50218e20d1bc66b59 (diff)
usb: gadget: s3c-hsotg: add proper suspend/resume support
This patch adds suspend/resume support to s3c-hsotg driver. It makes UDC driver more power efficient. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Tested-by: Robert Baldyga <r.baldyga@samsung.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/gadget/s3c-hsotg.c53
1 files changed, 49 insertions, 4 deletions
diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c
index 99c8e3ca6a3c..2a9cb674926a 100644
--- a/drivers/usb/gadget/s3c-hsotg.c
+++ b/drivers/usb/gadget/s3c-hsotg.c
@@ -3774,10 +3774,55 @@ static int s3c_hsotg_remove(struct platform_device *pdev)
3774 return 0; 3774 return 0;
3775} 3775}
3776 3776
3777#if 1 3777static int s3c_hsotg_suspend(struct platform_device *pdev, pm_message_t state)
3778#define s3c_hsotg_suspend NULL 3778{
3779#define s3c_hsotg_resume NULL 3779 struct s3c_hsotg *hsotg = platform_get_drvdata(pdev);
3780#endif 3780 unsigned long flags;
3781 int ret = 0;
3782
3783 if (hsotg->driver)
3784 dev_info(hsotg->dev, "suspending usb gadget %s\n",
3785 hsotg->driver->driver.name);
3786
3787 spin_lock_irqsave(&hsotg->lock, flags);
3788 s3c_hsotg_disconnect(hsotg);
3789 s3c_hsotg_phy_disable(hsotg);
3790 hsotg->gadget.speed = USB_SPEED_UNKNOWN;
3791 spin_unlock_irqrestore(&hsotg->lock, flags);
3792
3793 if (hsotg->driver) {
3794 int ep;
3795 for (ep = 0; ep < hsotg->num_of_eps; ep++)
3796 s3c_hsotg_ep_disable(&hsotg->eps[ep].ep);
3797
3798 ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies),
3799 hsotg->supplies);
3800 }
3801
3802 return ret;
3803}
3804
3805static int s3c_hsotg_resume(struct platform_device *pdev)
3806{
3807 struct s3c_hsotg *hsotg = platform_get_drvdata(pdev);
3808 unsigned long flags;
3809 int ret = 0;
3810
3811 if (hsotg->driver) {
3812 dev_info(hsotg->dev, "resuming usb gadget %s\n",
3813 hsotg->driver->driver.name);
3814 ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies),
3815 hsotg->supplies);
3816 }
3817
3818 spin_lock_irqsave(&hsotg->lock, flags);
3819 hsotg->last_rst = jiffies;
3820 s3c_hsotg_phy_enable(hsotg);
3821 s3c_hsotg_core_init(hsotg);
3822 spin_unlock_irqrestore(&hsotg->lock, flags);
3823
3824 return ret;
3825}
3781 3826
3782#ifdef CONFIG_OF 3827#ifdef CONFIG_OF
3783static const struct of_device_id s3c_hsotg_of_ids[] = { 3828static const struct of_device_id s3c_hsotg_of_ids[] = {