From 7c966b8a3271a9312292094671dfcb7c08ec61c7 Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Thu, 4 Mar 2010 20:20:54 +0000 Subject: [PATCH] jz4740_udc: Implement suspend/resume SVN-Revision: 19978 --- .../drivers/usb/gadget/jz4740_udc.c | 48 +++++++++++++++---- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/target/linux/xburst/files-2.6.32/drivers/usb/gadget/jz4740_udc.c b/target/linux/xburst/files-2.6.32/drivers/usb/gadget/jz4740_udc.c index 881bca7864..8c58494b91 100644 --- a/target/linux/xburst/files-2.6.32/drivers/usb/gadget/jz4740_udc.c +++ b/target/linux/xburst/files-2.6.32/drivers/usb/gadget/jz4740_udc.c @@ -160,11 +160,6 @@ # define DEBUG_SETUP(fmt,args...) do {} while(0) #endif -static unsigned int udc_debug = 0; /* 0: normal mode, 1: test udc cable type mode */ - -module_param(udc_debug, int, 0); -MODULE_PARM_DESC(udc_debug, "test udc cable or power type"); - static unsigned int use_dma = 0; /* 1: use DMA, 0: use PIO */ module_param(use_dma, int, 0); @@ -407,7 +402,7 @@ static void udc_enable(struct jz4740_udc *dev) * there are no actions on the USB bus. * UDC still works during this bit was set. */ - jz4740_clock_udc_enable_auto_suspend(); + jz4740_clock_udc_enable_auto_suspend(); /* Enable the USB PHY */ clk_enable(dev->clk); @@ -2152,7 +2147,6 @@ static int jz4740_udc_wakeup(struct usb_gadget *_gadget) static int jz4740_udc_pullup(struct usb_gadget *_gadget, int on) { struct jz4740_udc *udc = gadget_to_udc(_gadget); - unsigned long flags; local_irq_save(flags); @@ -2170,6 +2164,7 @@ static int jz4740_udc_pullup(struct usb_gadget *_gadget, int on) return 0; } + static const struct usb_gadget_ops jz4740_udc_ops = { .get_frame = jz4740_udc_get_frame, .wakeup = jz4740_udc_wakeup, @@ -2381,12 +2376,48 @@ static int jz4740_udc_remove(struct platform_device *pdev) return 0; } +#ifdef CONFIG_PM + +static int jz4740_udc_suspend(struct device *dev) +{ + struct jz4740_udc *udc = dev_get_drvdata(dev); + + if (udc->state == UDC_STATE_ENABLE) + udc_disable(udc); + + return 0; +} + +static int jz4740_udc_resume(struct device *dev) +{ + struct jz4740_udc *udc = dev_get_drvdata(dev); + + if (udc->state == UDC_STATE_ENABLE) + udc_enable(udc); + + return 0; +} + +static struct dev_pm_ops jz4740_udc_pm_ops = { + .suspend = jz4740_udc_suspend, + .resume = jz4740_udc_resume, +}; + +#define JZ4740_UDC_PM_OPS (&jz4740_udc_pm_ops) + +#else + +#define JZ4740_UDC_PM_OPS NULL + +#endif + static struct platform_driver udc_driver = { .probe = jz4740_udc_probe, .remove = jz4740_udc_remove, .driver = { .name = "jz-udc", .owner = THIS_MODULE, + .pm = JZ4740_UDC_PM_OPS, }, }; @@ -2396,13 +2427,12 @@ static int __init udc_init (void) { return platform_driver_register(&udc_driver); } +module_init(udc_init); static void __exit udc_exit (void) { platform_driver_unregister(&udc_driver); } - -module_init(udc_init); module_exit(udc_exit); MODULE_DESCRIPTION("JZ4740 USB Device Controller"); -- 2.30.2