>From 5649569cfff0ba5bbb0d6c48b0316e1011d6051a Mon Sep 17 00:00:00 2001 From: JiebingLi <[email protected]> Date: Wed, 24 Nov 2010 15:43:10 +0800 Subject: [PATCH] usb: langwell_udc: add runtime pm support
This patch enables runtime pm support for langwell_udc controller driver. Signed-off-by: JiebingLi <[email protected]> --- drivers/usb/gadget/langwell_udc.c | 85 +++++++++++++++++++++++++++++++++++++ 1 files changed, 85 insertions(+), 0 deletions(-) diff --git a/drivers/usb/gadget/langwell_udc.c b/drivers/usb/gadget/langwell_udc.c index b39ed1c..c8cdf2c 100644 --- a/drivers/usb/gadget/langwell_udc.c +++ b/drivers/usb/gadget/langwell_udc.c @@ -2842,6 +2842,9 @@ static void handle_bus_suspend(struct langwell_udc *dev) { dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); + if (dev->usb_state == USB_STATE_SUSPENDED) + return; + dev->resume_state = dev->usb_state; dev->usb_state = USB_STATE_SUSPENDED; @@ -2861,6 +2864,8 @@ static void handle_bus_suspend(struct langwell_udc *dev) } } + pm_runtime_put(&dev->pdev->dev); + /* enter PHY low power suspend */ langwell_phy_low_power(dev, 1); @@ -2894,6 +2899,8 @@ static void handle_bus_resume(struct langwell_udc *dev) } } + pm_runtime_get(&dev->pdev->dev); + dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__); } @@ -3076,6 +3083,9 @@ static void langwell_udc_remove(struct pci_dev *pdev) dev->done = &done; #ifndef OTG_TRANSCEIVER + pm_runtime_disable(&pdev->dev); + pm_runtime_set_suspended(&pdev->dev); + /* free dTD dma_pool and dQH */ if (dev->dtd_pool) dma_pool_destroy(dev->dtd_pool); @@ -3395,6 +3405,11 @@ static int langwell_udc_probe(struct pci_dev *pdev, if (retval) goto error_attr1; +#ifndef OTG_TRANSCEIVER + pm_runtime_set_active(&pdev->dev); + pm_runtime_enable(&pdev->dev); +#endif + dev_vdbg(&dev->pdev->dev, "<--- %s()\n", __func__); return 0; @@ -3538,6 +3553,67 @@ static int langwell_udc_resume(struct pci_dev *pdev) } +#ifdef CONFIG_PM_RUNTIME +/* device controller runtime suspend */ +static int langwell_udc_runtime_suspend(struct device *device) +{ + struct langwell_udc *dev = the_controller; + struct pci_dev *pdev; + + dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); + + pdev = to_pci_dev(device); + + /* save PCI state */ + pci_save_state(pdev); + + /* disable PCI device */ + pci_disable_device(pdev); + + /* set device power state */ + pci_set_power_state(pdev, PCI_D3hot); + + dev->vbus_active = 0; + + dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__); + return 0; +} + + +/* device controller runtime resume */ +static int langwell_udc_runtime_resume(struct device *device) +{ + struct langwell_udc *dev = the_controller; + struct pci_dev *pdev; + + dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); + + pdev = to_pci_dev(device); + + /* set device D0 power state */ + pci_set_power_state(pdev, PCI_D0); + + /* restore PCI state */ + pci_restore_state(pdev); + + /* enable PCI device */ + if (pci_enable_device(pdev) < 0) + return -ENODEV; + + dev->vbus_active = 1; + + dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__); + return 0; +} + +#else + +#define langwell_udc_runtime_suspend NULL +#define langwell_udc_runtime_resume NULL + +#endif + + /* pci driver shutdown */ static void langwell_udc_shutdown(struct pci_dev *pdev) { @@ -3577,7 +3653,16 @@ static const struct pci_device_id pci_ids[] = { { MODULE_DEVICE_TABLE(pci, pci_ids); +static const struct dev_pm_ops langwell_udc_pm_ops = { + .runtime_suspend = langwell_udc_runtime_suspend, + .runtime_resume = langwell_udc_runtime_resume, +}; + + static struct pci_driver langwell_pci_driver = { + .driver = { + .pm = &langwell_udc_pm_ops, + }, .name = (char *) driver_name, .id_table = pci_ids, -- 1.6.0.3
0005-usb-langwell_udc-add-runtime-pm-support.patch
Description: 0005-usb-langwell_udc-add-runtime-pm-support.patch
_______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
