Hi, On Tue, Dec 10, 2019 at 06:11:10PM +0100, Paul Cercueil wrote: > The pullup may be already enabled before the driver is initialized. > It has to be disabled at init time, as we cannot guarantee that a gadget > driver will be bound to the UDC. > > Signed-off-by: Paul Cercueil <paul@xxxxxxxxxxxxxxx> > --- > > Notes: > v3: New patch > > drivers/usb/musb/jz4740.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/usb/musb/jz4740.c b/drivers/usb/musb/jz4740.c > index f948eca654f3..1af9e4053312 100644 > --- a/drivers/usb/musb/jz4740.c > +++ b/drivers/usb/musb/jz4740.c > @@ -75,6 +75,7 @@ static const struct musb_hdrc_config jz4740_musb_config = { > static int jz4740_musb_init(struct musb *musb) > { > struct device *dev = musb->controller->parent; > + u8 power; > int err; > > if (dev->of_node) > @@ -97,6 +98,14 @@ static int jz4740_musb_init(struct musb *musb) > musb->isr = jz4740_musb_interrupt; > musb->dma_share_usb_irq = true; > > + /* > + * If the SoC booted from USB the pullup might still be set. > + * Disable it until a gadget is bound. > + */ > + power = musb_readb(musb->mregs, MUSB_POWER); > + power &= ~MUSB_POWER_SOFTCONN; > + musb_writeb(musb->mregs, MUSB_POWER, power); > + > return 0; > } It is preferred the glue drivers don't touch the controller core registers if possible. Please try the following patch instead. -Bin. ------------- >8 ------------ t a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 683b719c5026..2f9105e8ea38 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c @@ -2317,6 +2317,9 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) musb_disable_interrupts(musb); musb_writeb(musb->mregs, MUSB_DEVCTL, 0); + /* MUSB_POWER_SOFTCONN might be already set, jz4740 does this. */ + musb_writeb(musb->mregs, MUSB_POWER, 0); + /* Init IRQ workqueue before request_irq */ INIT_DELAYED_WORK(&musb->irq_work, musb_irq_work); INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset);