Message ID | 20230602214958.167909-4-CFSworks@gmail.com |
---|---|
State | Superseded |
Delegated to: | Marek Vasut |
Headers | show |
Series | Allwinner sunxi USB gadget improvements | expand |
On 6/2/23 23:49, Sam Edwards wrote: > Since many sunxi boards do not implement a `board_usb_init`, it's > better if we just make the sunxi USB driver compatible with the > DM gadget model, as many other musb-new variants already are. > > This change has been verified working on a T113s. > > Signed-off-by: Sam Edwards <CFSworks@gmail.com> > --- > drivers/usb/musb-new/sunxi.c | 60 +++++++++++++++++++++++------------- > 1 file changed, 38 insertions(+), 22 deletions(-) > > diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c > index 65a528e229..ac6d1a41bb 100644 > --- a/drivers/usb/musb-new/sunxi.c > +++ b/drivers/usb/musb-new/sunxi.c > @@ -432,6 +432,16 @@ static struct musb_hdrc_config musb_config_h3 = { > .ram_bits = SUNXI_MUSB_RAM_BITS, > }; > > +#if CONFIG_IS_ENABLED(DM_USB_GADGET) > +int dm_usb_gadget_handle_interrupts(struct udevice *dev) { > + struct sunxi_glue *glue = dev_get_priv(dev); > + struct musb_host_data *host = &glue->mdata; > + > + host->host->isr(0, host->host); > + return 0; > +} > +#endif > + > static int musb_usb_probe(struct udevice *dev) > { > struct sunxi_glue *glue = dev_get_priv(dev); > @@ -440,10 +450,6 @@ static int musb_usb_probe(struct udevice *dev) > void *base = dev_read_addr_ptr(dev); > int ret; > > -#ifdef CONFIG_USB_MUSB_HOST > - struct usb_bus_priv *priv = dev_get_uclass_priv(dev); > -#endif > - > if (!base) > return -EINVAL; > > @@ -474,25 +480,35 @@ static int musb_usb_probe(struct udevice *dev) > pdata.platform_ops = &sunxi_musb_ops; > pdata.config = glue->cfg->config; > > -#ifdef CONFIG_USB_MUSB_HOST > - priv->desc_before_addr = true; > - > - pdata.mode = MUSB_HOST; > - host->host = musb_init_controller(&pdata, &glue->dev, base); > - if (!host->host) > - return -EIO; > - > - ret = musb_lowlevel_init(host); > - if (!ret) > - printf("Allwinner mUSB OTG (Host)\n"); > -#else > - pdata.mode = MUSB_PERIPHERAL; > - host->host = musb_register(&pdata, &glue->dev, base); > - if (IS_ERR_OR_NULL(host->host)) > - return -EIO; > + if (IS_ENABLED(CONFIG_USB_MUSB_HOST)) { > + struct usb_bus_priv *priv = dev_get_uclass_priv(dev); > + priv->desc_before_addr = true; > + > + pdata.mode = MUSB_HOST; > + host->host = musb_init_controller(&pdata, &glue->dev, base); > + if (!host->host) > + return -EIO; > + > + ret = musb_lowlevel_init(host); > + if (!ret) > + printf("Allwinner mUSB OTG (Host)\n"); Please just drop this print for DM (or in general).
diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c index 65a528e229..ac6d1a41bb 100644 --- a/drivers/usb/musb-new/sunxi.c +++ b/drivers/usb/musb-new/sunxi.c @@ -432,6 +432,16 @@ static struct musb_hdrc_config musb_config_h3 = { .ram_bits = SUNXI_MUSB_RAM_BITS, }; +#if CONFIG_IS_ENABLED(DM_USB_GADGET) +int dm_usb_gadget_handle_interrupts(struct udevice *dev) { + struct sunxi_glue *glue = dev_get_priv(dev); + struct musb_host_data *host = &glue->mdata; + + host->host->isr(0, host->host); + return 0; +} +#endif + static int musb_usb_probe(struct udevice *dev) { struct sunxi_glue *glue = dev_get_priv(dev); @@ -440,10 +450,6 @@ static int musb_usb_probe(struct udevice *dev) void *base = dev_read_addr_ptr(dev); int ret; -#ifdef CONFIG_USB_MUSB_HOST - struct usb_bus_priv *priv = dev_get_uclass_priv(dev); -#endif - if (!base) return -EINVAL; @@ -474,25 +480,35 @@ static int musb_usb_probe(struct udevice *dev) pdata.platform_ops = &sunxi_musb_ops; pdata.config = glue->cfg->config; -#ifdef CONFIG_USB_MUSB_HOST - priv->desc_before_addr = true; - - pdata.mode = MUSB_HOST; - host->host = musb_init_controller(&pdata, &glue->dev, base); - if (!host->host) - return -EIO; - - ret = musb_lowlevel_init(host); - if (!ret) - printf("Allwinner mUSB OTG (Host)\n"); -#else - pdata.mode = MUSB_PERIPHERAL; - host->host = musb_register(&pdata, &glue->dev, base); - if (IS_ERR_OR_NULL(host->host)) - return -EIO; + if (IS_ENABLED(CONFIG_USB_MUSB_HOST)) { + struct usb_bus_priv *priv = dev_get_uclass_priv(dev); + priv->desc_before_addr = true; + + pdata.mode = MUSB_HOST; + host->host = musb_init_controller(&pdata, &glue->dev, base); + if (!host->host) + return -EIO; + + ret = musb_lowlevel_init(host); + if (!ret) + printf("Allwinner mUSB OTG (Host)\n"); + } else if (CONFIG_IS_ENABLED(DM_USB_GADGET)) { + pdata.mode = MUSB_PERIPHERAL; + host->host = musb_init_controller(&pdata, &glue->dev, base); + if (!host->host) + return -EIO; + + ret = usb_add_gadget_udc(&glue->dev, &host->host->g); + if (!ret) + printf("Allwinner mUSB OTG (Peripheral)\n"); + } else { + pdata.mode = MUSB_PERIPHERAL; + host->host = musb_register(&pdata, &glue->dev, base); + if (IS_ERR_OR_NULL(host->host)) + return -EIO; - printf("Allwinner mUSB OTG (Peripheral)\n"); -#endif + printf("Allwinner mUSB OTG (Peripheral)\n"); + } return ret; }
Since many sunxi boards do not implement a `board_usb_init`, it's better if we just make the sunxi USB driver compatible with the DM gadget model, as many other musb-new variants already are. This change has been verified working on a T113s. Signed-off-by: Sam Edwards <CFSworks@gmail.com> --- drivers/usb/musb-new/sunxi.c | 60 +++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 22 deletions(-)