On Wed, Sep 12, 2012 at 7:58 PM, Alexander Shishkin <alexander.shish...@linux.intel.com> wrote: > 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. > > Cc: <sta...@vger.kernel.org> > Signed-off-by: Michael Grzeschik <m.grzesc...@pengutronix.de> > Acked-by: Felipe Balbi <ba...@ti.com> > Signed-off-by: Marc Kleine-Budde <m...@pengutronix.de> > Signed-off-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); > }
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 majord...@vger.kernel.org > 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 majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html