Message ID | 20191210171110.62141-7-paul@crapouillou.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3,1/7] usb: musb: dma: Correct parameter passed to IRQ handler | expand |
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@crapouillou.net> > --- > > 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);
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; }
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@crapouillou.net> --- Notes: v3: New patch drivers/usb/musb/jz4740.c | 9 +++++++++ 1 file changed, 9 insertions(+)