On Wed, Sep 12, 2012 at 7:58 PM, Alexander Shishkin
<[email protected]> wrote:
> From: Michael Grzeschik <[email protected]>
>
> 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.
>
> Cc: <[email protected]>
> Signed-off-by: Michael Grzeschik <[email protected]>
> Acked-by: Felipe Balbi <[email protected]>
> Signed-off-by: Marc Kleine-Budde <[email protected]>
> Signed-off-by: Alexander Shishkin <[email protected]>
> ---
> 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);
> }
Hi Marc, your above change break the function that load gadget before
plug usb cable.
Does your change is because the set/clear usbcmd.rs twice at
usb_gadget_probe_driver
/usb_gadget_remove_driver? If it is, do you mind I submit a patch to re-add it?
> 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 [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html