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 <cfswo...@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");
+       } 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;
 }
-- 
2.39.2

Reply via email to