lkml.org 
[lkml]   [2015]   [Apr]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] usb: dwc3: gadget: call gadget driver's ->suspend/->resume
    On Fri, Apr 17, 2015 at 11:41:56AM -0700, David Cohen wrote:
    > From: Felipe Balbi <balbi@ti.com>

    missing the required:

    [ Upstream commit bc5ba2e0b829c9397f96df1191c7d2319ebc36d9 ]

    >
    > When going into bus suspend/resume we _must_
    > call gadget driver's ->suspend/->resume callbacks
    > accordingly. This patch implements that very feature
    > which has been missing forever.
    >
    > Cc: <stable@vger.kernel.org> # 3.14
    > Signed-off-by: Felipe Balbi <balbi@ti.com>
    > Signed-off-by: David Cohen <david.a.cohen@linux.intel.com>
    > ---
    >
    > Hi,
    >
    > This patch was introduced on v3.15.
    > But the issue it fixes already existed on v3.14 and v3.14 is a long term
    > support version.

    Can you show me a log of this breaking anywhere ? Why do you consider
    this a bug fix ? What sort of drawbacks did you notice ?

    > I propose to backport it over there as well.
    >
    > BR, David
    > ---
    >
    > drivers/usb/dwc3/gadget.c | 35 +++++++++++++++++++++++++++++++++++
    > 1 file changed, 35 insertions(+)
    >
    > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
    > index 8f6738d46b14..1bb752736c32 100644
    > --- a/drivers/usb/dwc3/gadget.c
    > +++ b/drivers/usb/dwc3/gadget.c
    > @@ -2012,6 +2012,24 @@ static void dwc3_disconnect_gadget(struct dwc3 *dwc)
    > }
    > }
    >
    > +static void dwc3_suspend_gadget(struct dwc3 *dwc)
    > +{
    > + if (dwc->gadget_driver && dwc->gadget_driver->disconnect) {

    you also need Dan Carperter's commit which fixes this cut & paste error.
    That's commit 73a30bfc0d526db899033165db6f95c427e70505

    > + spin_unlock(&dwc->lock);
    > + dwc->gadget_driver->suspend(&dwc->gadget);
    > + spin_lock(&dwc->lock);
    > + }
    > +}
    > +
    > +static void dwc3_resume_gadget(struct dwc3 *dwc)
    > +{
    > + if (dwc->gadget_driver && dwc->gadget_driver->disconnect) {
    > + spin_unlock(&dwc->lock);
    > + dwc->gadget_driver->resume(&dwc->gadget);
    > + spin_lock(&dwc->lock);
    > + }
    > +}
    > +
    > static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum)
    > {
    > struct dwc3_ep *dep;
    > @@ -2391,6 +2409,23 @@ static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc,
    >
    > dwc->link_state = next;
    >
    > + switch (next) {
    > + case DWC3_LINK_STATE_U1:
    > + if (dwc->speed == USB_SPEED_SUPER)
    > + dwc3_suspend_gadget(dwc);
    > + break;
    > + case DWC3_LINK_STATE_U2:
    > + case DWC3_LINK_STATE_U3:
    > + dwc3_suspend_gadget(dwc);
    > + break;
    > + case DWC3_LINK_STATE_RESUME:
    > + dwc3_resume_gadget(dwc);
    > + break;
    > + default:
    > + /* do nothing */
    > + break;
    > + }
    > +
    > dev_vdbg(dwc->dev, "%s link %d\n", __func__, dwc->link_state);
    > }

    --
    balbi
    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2015-04-17 22:21    [W:10.712 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site