From: Todd Poynor <toddpoynor@xxxxxxxxxx> usb: phy: Temporarily hold wakeupsource on charger connect and disconnect events Allow other parts of the system to react to the charger connect/disconnect event without allowing the system to suspend before the other parts can process the event. This wakeup_source times out after 2 seconds; if nobody else holds a wakeup_source by that time then the device can sleep. Cc: Felipe Balbi <balbi@xxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> Cc: linux-kernel@xxxxxxxxxxxxxxx Cc: linux-usb@xxxxxxxxxxxxxxx Cc: Android Kernel Team <kernel-team@xxxxxxxxxxx> Cc: John Stultz <john.stultz@xxxxxxxxxx> Signed-off-by: Todd Poynor <toddpoynor@xxxxxxxxxx> [kiran: Added context to commit message wakeupsource handling implemented per PHY in phy core] Signed-off-by: Kiran Raparthy <kiran.kumar@xxxxxxxxxx> --- drivers/usb/phy/otg-wakeupsource.c | 2 +- drivers/usb/phy/phy.c | 10 ++++++++++ include/linux/usb/phy.h | 3 +++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/usb/phy/otg-wakeupsource.c b/drivers/usb/phy/otg-wakeupsource.c index fca2010..70fa05e 100644 --- a/drivers/usb/phy/otg-wakeupsource.c +++ b/drivers/usb/phy/otg-wakeupsource.c @@ -48,7 +48,7 @@ static void otgws_handle_event(struct usb_phy *otgws_xceiv, unsigned long event) case USB_EVENT_NONE: case USB_EVENT_ID: case USB_EVENT_CHARGER: - usb_drop_wsource(otgws_xceiv); + usb_temporary_hold_wsource(otgws_xceiv); break; default: diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c index 659b1e8..c488716 100644 --- a/drivers/usb/phy/phy.c +++ b/drivers/usb/phy/phy.c @@ -483,3 +483,13 @@ void usb_drop_wsource(struct usb_phy *x) __pm_relax(&x->wsource); } EXPORT_SYMBOL_GPL(usb_drop_wsource); + +/** + * usb_temporary_hold_wsource - temporarily hold wakeupsource + * @usb_phy: the phy returned by usb_get_phy() + */ +void usb_temporary_hold_wsource(struct usb_phy *x) +{ + __pm_wakeup_event(&x->wsource, msecs_to_jiffies(TEMPORARY_HOLD_TIME)); +} +EXPORT_SYMBOL_GPL(usb_temporary_hold_wsource); diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h index 6c680e6..5f9b70e 100644 --- a/include/linux/usb/phy.h +++ b/include/linux/usb/phy.h @@ -13,6 +13,8 @@ #include <linux/usb.h> #include <linux/pm_wakeup.h> +#define TEMPORARY_HOLD_TIME 2000 + enum usb_phy_interface { USBPHY_INTERFACE_MODE_UNKNOWN, USBPHY_INTERFACE_MODE_UTMI, @@ -218,6 +220,7 @@ void usb_wsource_init(struct usb_phy *x, char *phy_dev_name); void usb_wsource_trash(struct usb_phy *x); void usb_grab_wsource(struct usb_phy *x); void usb_drop_wsource(struct usb_phy *x); +void usb_temporary_hold_wsource(struct usb_phy *x); #else static inline struct usb_phy *usb_get_phy(enum usb_phy_type type) { -- 1.8.2.1 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html