lkml.org 
[lkml]   [2017]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 8/9] [HSLPM] usb: gadget: Allow a non-SuperSpeed gadget to support LPM
    From: John Youn <johnyoun@synopsys.com>

    This commit allows a gadget that does not support SuperSpeed to indicate
    that it supports LPM. It does this by setting the 'lpm_capable' flag in
    the gadget structure.

    If a gadget sets this, the composite gadget framework will set the
    bcdUSB to 0x0201 to indicate that this supports BOS descriptors, and
    also return a USB 2.0 Extension descriptor as part of the BOS descriptor
    set.

    See USB 2.0 LPM ECN Section 3.

    Signed-off-by: John Youn <johnyoun@synopsys.com>
    Signed-off-by: Sevak Arakelyan <sevaka@synopsys.com>
    ---
    drivers/usb/gadget/composite.c | 8 ++++++--
    include/linux/usb/gadget.h | 3 +++
    2 files changed, 9 insertions(+), 2 deletions(-)

    diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
    index abec93ab81ee..d62f53d7f418 100644
    --- a/drivers/usb/gadget/composite.c
    +++ b/drivers/usb/gadget/composite.c
    @@ -1608,7 +1608,10 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
    cdev->desc.bcdUSB = cpu_to_le16(0x0210);
    }
    } else {
    - cdev->desc.bcdUSB = cpu_to_le16(0x0200);
    + if (gadget->lpm_capable)
    + cdev->desc.bcdUSB = cpu_to_le16(0x0201);
    + else
    + cdev->desc.bcdUSB = cpu_to_le16(0x0200);
    }

    value = min(w_length, (u16) sizeof cdev->desc);
    @@ -1639,7 +1642,8 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
    value = min(w_length, (u16) value);
    break;
    case USB_DT_BOS:
    - if (gadget_is_superspeed(gadget)) {
    + if (gadget_is_superspeed(gadget) ||
    + gadget->lpm_capable) {
    value = bos_desc(cdev);
    value = min(w_length, (u16) value);
    }
    diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
    index e4516e9ded0f..927df464100d 100644
    --- a/include/linux/usb/gadget.h
    +++ b/include/linux/usb/gadget.h
    @@ -352,6 +352,8 @@ struct usb_gadget_ops {
    * @deactivated: True if gadget is deactivated - in deactivated state it cannot
    * be connected.
    * @connected: True if gadget is connected.
    + * @lpm_capable: If the gadget max_speed is FULL or HIGH, this flag
    + * indicates that it supports LPM as per the LPM ECN & errata.
    *
    * Gadgets have a mostly-portable "gadget driver" implementing device
    * functions, handling all usb configurations and interfaces. Gadget
    @@ -404,6 +406,7 @@ struct usb_gadget {
    unsigned is_selfpowered:1;
    unsigned deactivated:1;
    unsigned connected:1;
    + unsigned lpm_capable:1;
    };
    #define work_to_gadget(w) (container_of((w), struct usb_gadget, work))

    --
    2.11.0
    \
     
     \ /
      Last update: 2017-04-28 10:59    [W:5.185 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site