From c4dd6997f28704d3dae7022cc60be73705a107b7 Mon Sep 17 00:00:00 2001 From: juhosg Date: Sat, 22 Dec 2012 12:11:06 +0000 Subject: generic/3.6: add platform specific power callbacks to {e,o}hci_platform drivers Backport of upstream commits: 86e4cb35f2260374df4139c2352afe7fe247cb60 usb: host: ehci-platform: BUG_ON() to WARN_ON() on probe b6dd245c4594482d46507a0bfd100439be367952 usb: host: ohci-platform: BUG_ON() to WARN_ON() on probe 04216bedafb1b3992a6c2b7f1518281d2ba5fc7b usb: host: ehci-platform: add platform specific power callback e4d37aeb373a5edceecc1dadc76fabbe8bc18e44 usb: host: ohci-platform: addplatform specific power callback Signed-off-by: Gabor Juhos git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34842 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- ...ci-platform-add-platform-specific-power-c.patch | 114 +++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 target/linux/generic/patches-3.6/004-usb-host-ohci-platform-add-platform-specific-power-c.patch (limited to 'target/linux/generic/patches-3.6/004-usb-host-ohci-platform-add-platform-specific-power-c.patch') diff --git a/target/linux/generic/patches-3.6/004-usb-host-ohci-platform-add-platform-specific-power-c.patch b/target/linux/generic/patches-3.6/004-usb-host-ohci-platform-add-platform-specific-power-c.patch new file mode 100644 index 000000000..7a4169bb0 --- /dev/null +++ b/target/linux/generic/patches-3.6/004-usb-host-ohci-platform-add-platform-specific-power-c.patch @@ -0,0 +1,114 @@ +From e4d37aeb373a5edceecc1dadc76fabbe8bc18e44 Mon Sep 17 00:00:00 2001 +From: Kuninori Morimoto +Date: Mon, 6 Aug 2012 18:09:10 -0700 +Subject: [PATCH] usb: host: ohci-platform: add platform specific power callback + +Commit e4d37aeb373a5edceecc1dadc76fabbe8bc18e44 upstream. + +This patch enables to call platform specific power callback function. + +Signed-off-by: Kuninori Morimoto +Acked-by: Alan Stern +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/host/ohci-platform.c | 36 ++++++++++++++++++++++++++++++++++-- + include/linux/usb/ohci_pdriver.h | 8 ++++++++ + 2 files changed, 42 insertions(+), 2 deletions(-) + +--- a/drivers/usb/host/ohci-platform.c ++++ b/drivers/usb/host/ohci-platform.c +@@ -107,10 +107,18 @@ static int __devinit ohci_platform_probe + return -ENXIO; + } + ++ if (pdata->power_on) { ++ err = pdata->power_on(dev); ++ if (err < 0) ++ return err; ++ } ++ + hcd = usb_create_hcd(&ohci_platform_hc_driver, &dev->dev, + dev_name(&dev->dev)); +- if (!hcd) +- return -ENOMEM; ++ if (!hcd) { ++ err = -ENOMEM; ++ goto err_power; ++ } + + hcd->rsrc_start = res_mem->start; + hcd->rsrc_len = resource_size(res_mem); +@@ -138,12 +146,17 @@ err_release_region: + release_mem_region(hcd->rsrc_start, hcd->rsrc_len); + err_put_hcd: + usb_put_hcd(hcd); ++err_power: ++ if (pdata->power_off) ++ pdata->power_off(dev); ++ + return err; + } + + static int __devexit ohci_platform_remove(struct platform_device *dev) + { + struct usb_hcd *hcd = platform_get_drvdata(dev); ++ struct usb_ohci_pdata *pdata = dev->dev.platform_data; + + usb_remove_hcd(hcd); + iounmap(hcd->regs); +@@ -151,6 +164,9 @@ static int __devexit ohci_platform_remov + usb_put_hcd(hcd); + platform_set_drvdata(dev, NULL); + ++ if (pdata->power_off) ++ pdata->power_off(dev); ++ + return 0; + } + +@@ -158,12 +174,28 @@ static int __devexit ohci_platform_remov + + static int ohci_platform_suspend(struct device *dev) + { ++ struct usb_ohci_pdata *pdata = dev->platform_data; ++ struct platform_device *pdev = ++ container_of(dev, struct platform_device, dev); ++ ++ if (pdata->power_suspend) ++ pdata->power_suspend(pdev); ++ + return 0; + } + + static int ohci_platform_resume(struct device *dev) + { + struct usb_hcd *hcd = dev_get_drvdata(dev); ++ struct usb_ohci_pdata *pdata = dev->platform_data; ++ struct platform_device *pdev = ++ container_of(dev, struct platform_device, dev); ++ ++ if (pdata->power_on) { ++ int err = pdata->power_on(pdev); ++ if (err < 0) ++ return err; ++ } + + ohci_finish_controller_resume(hcd); + return 0; +--- a/include/linux/usb/ohci_pdriver.h ++++ b/include/linux/usb/ohci_pdriver.h +@@ -33,6 +33,14 @@ struct usb_ohci_pdata { + unsigned big_endian_desc:1; + unsigned big_endian_mmio:1; + unsigned no_big_frame_no:1; ++ ++ /* Turn on all power and clocks */ ++ int (*power_on)(struct platform_device *pdev); ++ /* Turn off all power and clocks */ ++ void (*power_off)(struct platform_device *pdev); ++ /* Turn on only VBUS suspend power and hotplug detection, ++ * turn off everything else */ ++ void (*power_suspend)(struct platform_device *pdev); + }; + + #endif /* __USB_CORE_OHCI_PDRIVER_H */ -- cgit v1.2.3