lkml.org 
[lkml]   [2020]   [Nov]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/3] usb: gadget: composite: Split composite reset and disconnect
    Date
    Add a specific composite reset API to differentiate between disconnect and
    reset events. This is needed for adjusting the current draw accordingly
    based on the USB battery charging specification. The device is only allowed
    to draw the 500/900 mA (HS/SS) while in the CONFIGURED state, and only 100 mA
    in the connected and UNCONFIGURED state.

    Signed-off-by: Wesley Cheng <wcheng@codeaurora.org>
    ---
    drivers/usb/gadget/composite.c | 21 +++++++++++++++++++--
    include/linux/usb/composite.h | 2 ++
    2 files changed, 21 insertions(+), 2 deletions(-)

    diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
    index 05b176c82cc5..a41f7fe4b518 100644
    --- a/drivers/usb/gadget/composite.c
    +++ b/drivers/usb/gadget/composite.c
    @@ -2036,7 +2036,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
    return value;
    }

    -void composite_disconnect(struct usb_gadget *gadget)
    +static void __composite_disconnect(struct usb_gadget *gadget)
    {
    struct usb_composite_dev *cdev = get_gadget_data(gadget);
    unsigned long flags;
    @@ -2053,6 +2053,23 @@ void composite_disconnect(struct usb_gadget *gadget)
    spin_unlock_irqrestore(&cdev->lock, flags);
    }

    +void composite_disconnect(struct usb_gadget *gadget)
    +{
    + usb_gadget_vbus_draw(gadget, 0);
    + __composite_disconnect(gadget);
    +}
    +
    +void composite_reset(struct usb_gadget *gadget)
    +{
    + /*
    + * Section 1.4.13 Standard Downstream Port of the USB battery charging
    + * specification v1.2 states that a device connected on a SDP shall only
    + * draw at max 100mA while in a connected, but unconfigured state.
    + */
    + usb_gadget_vbus_draw(gadget, 100);
    + __composite_disconnect(gadget);
    +}
    +
    /*-------------------------------------------------------------------------*/

    static ssize_t suspended_show(struct device *dev, struct device_attribute *attr,
    @@ -2373,7 +2390,7 @@ static const struct usb_gadget_driver composite_driver_template = {
    .unbind = composite_unbind,

    .setup = composite_setup,
    - .reset = composite_disconnect,
    + .reset = composite_reset,
    .disconnect = composite_disconnect,

    .suspend = composite_suspend,
    diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h
    index 2040696d75b6..0d8a71471512 100644
    --- a/include/linux/usb/composite.h
    +++ b/include/linux/usb/composite.h
    @@ -525,6 +525,8 @@ extern struct usb_string *usb_gstrings_attach(struct usb_composite_dev *cdev,
    extern int usb_string_ids_n(struct usb_composite_dev *c, unsigned n);

    extern void composite_disconnect(struct usb_gadget *gadget);
    +extern void composite_reset(struct usb_gadget *gadget);
    +
    extern int composite_setup(struct usb_gadget *gadget,
    const struct usb_ctrlrequest *ctrl);
    extern void composite_suspend(struct usb_gadget *gadget);
    --
    The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
    a Linux Foundation Collaborative Project
    \
     
     \ /
      Last update: 2020-11-14 09:13    [W:5.947 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site