diff options
author | Felipe Balbi <balbi@ti.com> | 2014-10-07 11:19:23 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-11-03 11:00:58 -0500 |
commit | 0b0231aa246cbfdcf0a07f5e8914c0f1b80002f6 (patch) | |
tree | 3ee19d2b8df96e589d092c98ec3e8cf4d1c73251 /drivers/usb/dwc3 | |
parent | 7ee2566ff53e0620a80548689c74505fe8f10ec8 (diff) |
usb: dwc3: get rid of ->prepare()/->complete()
Using ->prepare()/->complete() to mask/unmask
IRQs is wrong at least for dwc3. We need to
make sure that by the end of ->resume(), IRQs
are working and ready to fire because a child
device may need working IRQs for its own ->resume()
method.
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc3')
-rw-r--r-- | drivers/usb/dwc3/core.c | 50 | ||||
-rw-r--r-- | drivers/usb/dwc3/core.h | 11 | ||||
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 20 |
3 files changed, 8 insertions, 73 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 4d4e854f99aa..fa396fc57a85 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -825,50 +825,6 @@ static int dwc3_remove(struct platform_device *pdev) | |||
825 | } | 825 | } |
826 | 826 | ||
827 | #ifdef CONFIG_PM_SLEEP | 827 | #ifdef CONFIG_PM_SLEEP |
828 | static int dwc3_prepare(struct device *dev) | ||
829 | { | ||
830 | struct dwc3 *dwc = dev_get_drvdata(dev); | ||
831 | unsigned long flags; | ||
832 | |||
833 | spin_lock_irqsave(&dwc->lock, flags); | ||
834 | |||
835 | switch (dwc->dr_mode) { | ||
836 | case USB_DR_MODE_PERIPHERAL: | ||
837 | case USB_DR_MODE_OTG: | ||
838 | dwc3_gadget_prepare(dwc); | ||
839 | /* FALLTHROUGH */ | ||
840 | case USB_DR_MODE_HOST: | ||
841 | default: | ||
842 | dwc3_event_buffers_cleanup(dwc); | ||
843 | break; | ||
844 | } | ||
845 | |||
846 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
847 | |||
848 | return 0; | ||
849 | } | ||
850 | |||
851 | static void dwc3_complete(struct device *dev) | ||
852 | { | ||
853 | struct dwc3 *dwc = dev_get_drvdata(dev); | ||
854 | unsigned long flags; | ||
855 | |||
856 | spin_lock_irqsave(&dwc->lock, flags); | ||
857 | |||
858 | dwc3_event_buffers_setup(dwc); | ||
859 | switch (dwc->dr_mode) { | ||
860 | case USB_DR_MODE_PERIPHERAL: | ||
861 | case USB_DR_MODE_OTG: | ||
862 | dwc3_gadget_complete(dwc); | ||
863 | /* FALLTHROUGH */ | ||
864 | case USB_DR_MODE_HOST: | ||
865 | default: | ||
866 | break; | ||
867 | } | ||
868 | |||
869 | spin_unlock_irqrestore(&dwc->lock, flags); | ||
870 | } | ||
871 | |||
872 | static int dwc3_suspend(struct device *dev) | 828 | static int dwc3_suspend(struct device *dev) |
873 | { | 829 | { |
874 | struct dwc3 *dwc = dev_get_drvdata(dev); | 830 | struct dwc3 *dwc = dev_get_drvdata(dev); |
@@ -883,7 +839,7 @@ static int dwc3_suspend(struct device *dev) | |||
883 | /* FALLTHROUGH */ | 839 | /* FALLTHROUGH */ |
884 | case USB_DR_MODE_HOST: | 840 | case USB_DR_MODE_HOST: |
885 | default: | 841 | default: |
886 | /* do nothing */ | 842 | dwc3_event_buffers_cleanup(dwc); |
887 | break; | 843 | break; |
888 | } | 844 | } |
889 | 845 | ||
@@ -916,6 +872,7 @@ static int dwc3_resume(struct device *dev) | |||
916 | 872 | ||
917 | spin_lock_irqsave(&dwc->lock, flags); | 873 | spin_lock_irqsave(&dwc->lock, flags); |
918 | 874 | ||
875 | dwc3_event_buffers_setup(dwc); | ||
919 | dwc3_writel(dwc->regs, DWC3_GCTL, dwc->gctl); | 876 | dwc3_writel(dwc->regs, DWC3_GCTL, dwc->gctl); |
920 | 877 | ||
921 | switch (dwc->dr_mode) { | 878 | switch (dwc->dr_mode) { |
@@ -944,9 +901,6 @@ err_usb2phy_init: | |||
944 | } | 901 | } |
945 | 902 | ||
946 | static const struct dev_pm_ops dwc3_dev_pm_ops = { | 903 | static const struct dev_pm_ops dwc3_dev_pm_ops = { |
947 | .prepare = dwc3_prepare, | ||
948 | .complete = dwc3_complete, | ||
949 | |||
950 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume) | 904 | SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume) |
951 | }; | 905 | }; |
952 | 906 | ||
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 66f62563bcf9..a715ee1f3c06 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h | |||
@@ -964,20 +964,9 @@ static inline int dwc3_send_gadget_generic_command(struct dwc3 *dwc, | |||
964 | 964 | ||
965 | /* power management interface */ | 965 | /* power management interface */ |
966 | #if !IS_ENABLED(CONFIG_USB_DWC3_HOST) | 966 | #if !IS_ENABLED(CONFIG_USB_DWC3_HOST) |
967 | int dwc3_gadget_prepare(struct dwc3 *dwc); | ||
968 | void dwc3_gadget_complete(struct dwc3 *dwc); | ||
969 | int dwc3_gadget_suspend(struct dwc3 *dwc); | 967 | int dwc3_gadget_suspend(struct dwc3 *dwc); |
970 | int dwc3_gadget_resume(struct dwc3 *dwc); | 968 | int dwc3_gadget_resume(struct dwc3 *dwc); |
971 | #else | 969 | #else |
972 | static inline int dwc3_gadget_prepare(struct dwc3 *dwc) | ||
973 | { | ||
974 | return 0; | ||
975 | } | ||
976 | |||
977 | static inline void dwc3_gadget_complete(struct dwc3 *dwc) | ||
978 | { | ||
979 | } | ||
980 | |||
981 | static inline int dwc3_gadget_suspend(struct dwc3 *dwc) | 970 | static inline int dwc3_gadget_suspend(struct dwc3 *dwc) |
982 | { | 971 | { |
983 | return 0; | 972 | return 0; |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 546ea5431b8c..748b87b3f98a 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -2744,26 +2744,13 @@ void dwc3_gadget_exit(struct dwc3 *dwc) | |||
2744 | dwc->ctrl_req, dwc->ctrl_req_addr); | 2744 | dwc->ctrl_req, dwc->ctrl_req_addr); |
2745 | } | 2745 | } |
2746 | 2746 | ||
2747 | int dwc3_gadget_prepare(struct dwc3 *dwc) | 2747 | int dwc3_gadget_suspend(struct dwc3 *dwc) |
2748 | { | 2748 | { |
2749 | if (dwc->pullups_connected) { | 2749 | if (dwc->pullups_connected) { |
2750 | dwc3_gadget_disable_irq(dwc); | 2750 | dwc3_gadget_disable_irq(dwc); |
2751 | dwc3_gadget_run_stop(dwc, true, true); | 2751 | dwc3_gadget_run_stop(dwc, true, true); |
2752 | } | 2752 | } |
2753 | 2753 | ||
2754 | return 0; | ||
2755 | } | ||
2756 | |||
2757 | void dwc3_gadget_complete(struct dwc3 *dwc) | ||
2758 | { | ||
2759 | if (dwc->pullups_connected) { | ||
2760 | dwc3_gadget_enable_irq(dwc); | ||
2761 | dwc3_gadget_run_stop(dwc, true, false); | ||
2762 | } | ||
2763 | } | ||
2764 | |||
2765 | int dwc3_gadget_suspend(struct dwc3 *dwc) | ||
2766 | { | ||
2767 | __dwc3_gadget_ep_disable(dwc->eps[0]); | 2754 | __dwc3_gadget_ep_disable(dwc->eps[0]); |
2768 | __dwc3_gadget_ep_disable(dwc->eps[1]); | 2755 | __dwc3_gadget_ep_disable(dwc->eps[1]); |
2769 | 2756 | ||
@@ -2798,6 +2785,11 @@ int dwc3_gadget_resume(struct dwc3 *dwc) | |||
2798 | 2785 | ||
2799 | dwc3_writel(dwc->regs, DWC3_DCFG, dwc->dcfg); | 2786 | dwc3_writel(dwc->regs, DWC3_DCFG, dwc->dcfg); |
2800 | 2787 | ||
2788 | if (dwc->pullups_connected) { | ||
2789 | dwc3_gadget_enable_irq(dwc); | ||
2790 | dwc3_gadget_run_stop(dwc, true, false); | ||
2791 | } | ||
2792 | |||
2801 | return 0; | 2793 | return 0; |
2802 | 2794 | ||
2803 | err1: | 2795 | err1: |