Marc Kleine-Budde <m...@pengutronix.de> writes:

> From: Michael Grzeschik <m.grzesc...@pengutronix.de>
>
> Add function to physicaly enable or disable of pullup connection on the USB-D+
> line. The uvc gaget will fail, if this function is not implemented.
>
> Signed-off-by: Michael Grzeschik <m.grzesc...@pengutronix.de>
> Signed-off-by: Marc Kleine-Budde <m...@pengutronix.de>
> Acked-by: Felipe Balbi <ba...@ti.com>

Acked-by: Alexander Shishkin <alexander.shish...@linux.intel.com>

> ---
>  drivers/usb/chipidea/udc.c |   21 +++++++++++++++++----
>  1 file changed, 17 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
> index 7801a3f..32ee870 100644
> --- a/drivers/usb/chipidea/udc.c
> +++ b/drivers/usb/chipidea/udc.c
> @@ -78,8 +78,7 @@ static inline int ep_to_bit(struct ci13xxx *ci, int n)
>  }
>  
>  /**
> - * hw_device_state: enables/disables interrupts & starts/stops device 
> (execute
> - *                  without interruption)
> + * hw_device_state: enables/disables interrupts (execute without 
> interruption)
>   * @dma: 0 => disable, !0 => enable and set dma engine
>   *
>   * This function returns an error code
> @@ -91,9 +90,7 @@ static int hw_device_state(struct ci13xxx *ci, u32 dma)
>               /* interrupt, error, port change, reset, sleep/suspend */
>               hw_write(ci, OP_USBINTR, ~0,
>                            USBi_UI|USBi_UEI|USBi_PCI|USBi_URI|USBi_SLI);
> -             hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS);
>       } else {
> -             hw_write(ci, OP_USBCMD, USBCMD_RS, 0);
>               hw_write(ci, OP_USBINTR, ~0, 0);
>       }
>       return 0;
> @@ -1420,6 +1417,21 @@ static int ci13xxx_vbus_draw(struct usb_gadget 
> *_gadget, unsigned mA)
>       return -ENOTSUPP;
>  }
>  
> +/* Change Data+ pullup status
> + * this func is used by usb_gadget_connect/disconnet
> + */
> +static int ci13xxx_pullup(struct usb_gadget *_gadget, int is_on)
> +{
> +     struct ci13xxx *ci = container_of(_gadget, struct ci13xxx, gadget);
> +
> +     if (is_on)
> +             hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS);
> +     else
> +             hw_write(ci, OP_USBCMD, USBCMD_RS, 0);
> +
> +     return 0;
> +}
> +
>  static int ci13xxx_start(struct usb_gadget *gadget,
>                        struct usb_gadget_driver *driver);
>  static int ci13xxx_stop(struct usb_gadget *gadget,
> @@ -1432,6 +1444,7 @@ static int ci13xxx_stop(struct usb_gadget *gadget,
>  static const struct usb_gadget_ops usb_gadget_ops = {
>       .vbus_session   = ci13xxx_vbus_session,
>       .wakeup         = ci13xxx_wakeup,
> +     .pullup         = ci13xxx_pullup,
>       .vbus_draw      = ci13xxx_vbus_draw,
>       .udc_start      = ci13xxx_start,
>       .udc_stop       = ci13xxx_stop,
> -- 
> 1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to