> > usb: phy: hold wakeupsource when USB is enumerated in peripheral mode > > Some systems require a mechanism to prevent system to enter into suspend > state when USB is connected and enumerated in peripheral mode. > > This patch provides an interface to hold a wakeupsource to prevent suspend. > PHY drivers can use this interface when USB is connected and enumerated in > peripheral mode. > > A timed wakeupsource is temporarily held on USB disconnect events, to allow > the rest of the system to react to the USB disconnection (dropping host > sessions, updating charger status, etc.) prior to re-allowing suspend. > Hi Kiran & Felipe, Just two questions for this series - Will it be the default behavior for all peripheral drivers? - If the peripheral driver's PHY driver does not vbus event, how to support it? For example, chipidea udc driver has its vbus interface at its controller register. Peter > 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> > Cc: Sumit Semwal <sumit.semwal@xxxxxxxxxx> > Cc: Arve Hjønnevåg <arve@xxxxxxxxxxx> > Cc: Benoit Goby <benoit@xxxxxxxxxxx> > [Original patch in Android from Todd] > Cc: Todd Poynor <toddpoynor@xxxxxxxxxx> > Signed-off-by: Kiran Raparthy <kiran.kumar@xxxxxxxxxx> > --- > drivers/usb/phy/phy.c | 29 +++++++++++++++++++++++++++-- > include/linux/usb/phy.h | 5 +++++ > 2 files changed, 32 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c index > b4066a0..8c87bc3 100644 > --- a/drivers/usb/phy/phy.c > +++ b/drivers/usb/phy/phy.c > @@ -331,6 +331,7 @@ int usb_add_phy(struct usb_phy *x, enum > usb_phy_type type) > int ret = 0; > unsigned long flags; > struct usb_phy *phy; > + char wsource_name[40]; > > if (x->type != USB_PHY_TYPE_UNDEFINED) { > dev_err(x->dev, "not accepting initialized PHY %s\n", x->label); > @@ -353,6 +354,10 @@ int usb_add_phy(struct usb_phy *x, enum > usb_phy_type type) > x->type = type; > list_add_tail(&x->head, &phy_list); > > + snprintf(wsource_name, sizeof(wsource_name), "vbus-%s", > + dev_name(x->dev)); > + wakeup_source_init(&x->wsource, wsource_name); > + > out: > spin_unlock_irqrestore(&phy_lock, flags); > return ret; > @@ -404,6 +409,7 @@ void usb_remove_phy(struct usb_phy *x) > > spin_lock_irqsave(&phy_lock, flags); > if (x) { > + wakeup_source_trash(&x->wsource); > list_for_each_entry(phy_bind, &phy_bind_list, list) > if (phy_bind->phy == x) > phy_bind->phy = NULL; > @@ -448,13 +454,32 @@ int usb_bind_phy(const char *dev_name, u8 index, > EXPORT_SYMBOL_GPL(usb_bind_phy); > > /** > - * usb_phy_set_event - set event to phy event > + * usb_phy_set_event - set event to phy event and > + * hold/temporarily hold wakeupsource > * @x: the phy returned by usb_get_phy(); > * > - * This sets event to phy event > + * This holds per-PHY wakeupsource/timed wakeupsource > */ > void usb_phy_set_event(struct usb_phy *x, unsigned long event) { > + > x->last_event = event; > + > + switch (event) { > + case USB_EVENT_ENUMERATED: > + __pm_stay_awake(&x->wsource); > + break; > + > + case USB_EVENT_NONE: > + case USB_EVENT_ID: > + case USB_EVENT_VBUS: > + case USB_EVENT_CHARGER: > + __pm_wakeup_event(&x->wsource, > + USB_PHY_DEFAULT_WAKEUP_SRC_TIMEOUT); > + break; > + > + default: > + break; > + } > } > EXPORT_SYMBOL_GPL(usb_phy_set_event); > diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h index > f499c23..63a56bf 100644 > --- a/include/linux/usb/phy.h > +++ b/include/linux/usb/phy.h > @@ -12,6 +12,8 @@ > #include <linux/notifier.h> > #include <linux/usb.h> > > +#define USB_PHY_DEFAULT_WAKEUP_SRC_TIMEOUT > msecs_to_jiffies(2000) > + > enum usb_phy_interface { > USBPHY_INTERFACE_MODE_UNKNOWN, > USBPHY_INTERFACE_MODE_UTMI, > @@ -88,6 +90,9 @@ struct usb_phy { > /* for notification of usb_phy_events */ > struct atomic_notifier_head notifier; > > + /* wakeup source */ > + struct wakeup_source wsource; > + > /* to pass extra port status to the root hub */ > u16 port_status; > u16 port_change; > -- > 1.9.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 ��.n��������+%������w��{.n�����{���)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥