All code not applicable to uBoot is ifdef'd out with

ifndef __UBOOT__ as it is done in the musb-new directory.

This code has not been fully debuged or excersized.

Signed-off-by: Dan Murphy <[email protected]>
---
 Makefile                      |    1 +
 drivers/usb/dwc3/Makefile     |   53 ++++++
 drivers/usb/dwc3/core.c       |   90 +++++++++-
 drivers/usb/dwc3/core.h       |   53 +++++-
 drivers/usb/dwc3/dwc3-omap.c  |   28 ++-
 drivers/usb/dwc3/dwc3-omap.h  |   41 +++++
 drivers/usb/dwc3/dwc3-uboot.c |  384 +++++++++++++++++++++++++++++++++++++++++
 drivers/usb/dwc3/ep0.c        |   31 +++-
 drivers/usb/dwc3/gadget.c     |   75 +++++++-
 drivers/usb/dwc3/gadget.h     |    2 +
 drivers/usb/dwc3/host.c       |   27 ++-
 drivers/usb/dwc3/io.h         |   15 ++
 12 files changed, 779 insertions(+), 21 deletions(-)
 create mode 100644 drivers/usb/dwc3/Makefile
 create mode 100644 drivers/usb/dwc3/dwc3-omap.h
 create mode 100644 drivers/usb/dwc3/dwc3-uboot.c

diff --git a/Makefile b/Makefile
index fdaddb9..e4a6264 100644
--- a/Makefile
+++ b/Makefile
@@ -327,6 +327,7 @@ LIBS-y += drivers/usb/gadget/libusb_gadget.o
 LIBS-y += drivers/usb/host/libusb_host.o
 LIBS-y += drivers/usb/musb/libusb_musb.o
 LIBS-y += drivers/usb/musb-new/libusb_musb-new.o
+LIBS-y += drivers/usb/dwc3/libusb_dwc3.o
 LIBS-y += drivers/usb/phy/libusb_phy.o
 LIBS-y += drivers/usb/ulpi/libusb_ulpi.o
 LIBS-y += drivers/video/libvideo.o
diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
new file mode 100644
index 0000000..0d589cc
--- /dev/null
+++ b/drivers/usb/dwc3/Makefile
@@ -0,0 +1,53 @@
+#
+# (C) Copyright 2013
+# Texas Instruments Incorporated.
+#
+# Author: Dan Murphy <[email protected]>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    := $(obj)libusb_dwc3.o
+
+COBJS-$(CONFIG_USB_DWC3) += core.o dwc3-uboot.o
+COBJS-$(CONFIG_USB_DWC3_GADGET) += gadget.o ep0.o
+COBJS-$(CONFIG_USB_DWC3_HOST) += host.o
+COBJS-$(CONFIG_USB_DWC3_OMAP) += dwc3-omap.o
+
+CFLAGS_NO_WARN := $(call cc-option,-Wno-unused-variable) \
+                       $(call cc-option,-Wno-unused-label)
+CFLAGS += $(CFLAGS_NO_WARN)
+
+COBJS  := $(COBJS-y)
+SRCS   := $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+
+all:   $(LIB)
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
+
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index c35d49d..1bf1882 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -6,6 +6,8 @@
  * Authors: Felipe Balbi <[email protected]>,
  *         Sebastian Andrzej Siewior <[email protected]>
  *
+ * Back-ported by: Dan Murphy <[email protected]>
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -36,6 +38,9 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#define __UBOOT__
+#ifndef __UBOOT__
+
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -51,14 +56,28 @@
 #include <linux/of.h>
 
 #include <linux/usb/otg.h>
+
+#include <linux/usb/ch9.h>
+#include <linux/usb/gadget.h>
+
+#else
+#include <common.h>
+
+#include <linux/err.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
+#include <linux/usb/linux-compat.h>
+
+#endif
 
 #include "core.h"
 #include "gadget.h"
 #include "io.h"
 
+#ifndef __UBOOT__
+/* TODO: Need to move over the debug files */
 #include "debug.h"
+#endif
 
 static char *maximum_speed = "super";
 module_param(maximum_speed, charp, 0);
@@ -98,9 +117,11 @@ static void dwc3_core_soft_reset(struct dwc3 *dwc)
        reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
        reg |= DWC3_GUSB2PHYCFG_PHYSOFTRST;
        dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
-
+#ifndef __UBOOT__
+       /* FIX THIS DM */
        usb_phy_init(dwc->usb2_phy);
        usb_phy_init(dwc->usb3_phy);
+#endif
        mdelay(100);
 
        /* Clear USB3 PHY reset */
@@ -145,7 +166,11 @@ static struct dwc3_event_buffer 
*dwc3_alloc_one_event_buffer(struct dwc3 *dwc,
 {
        struct dwc3_event_buffer        *evt;
 
+#ifndef __UBOOT__
        evt = devm_kzalloc(dwc->dev, sizeof(*evt), GFP_KERNEL);
+#else
+       evt = kzalloc(sizeof(*evt), GFP_KERNEL);
+#endif
        if (!evt)
                return ERR_PTR(-ENOMEM);
 
@@ -163,7 +188,11 @@ static struct dwc3_event_buffer 
*dwc3_alloc_one_event_buffer(struct dwc3 *dwc,
  * dwc3_free_event_buffers - frees all allocated event buffers
  * @dwc: Pointer to our controller context structure
  */
+#ifndef __UBOOT__
 static void dwc3_free_event_buffers(struct dwc3 *dwc)
+#else
+void dwc3_free_event_buffers(struct dwc3 *dwc)
+#endif
 {
        struct dwc3_event_buffer        *evt;
        int i;
@@ -183,16 +212,23 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc)
  * Returns 0 on success otherwise negative errno. In the error case, dwc
  * may contain some buffers allocated but not all which were requested.
  */
+#ifndef __UBOOT__
 static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)
+#else
+int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)
+#endif
 {
        int                     num;
        int                     i;
 
        num = DWC3_NUM_INT(dwc->hwparams.hwparams1);
        dwc->num_event_buffers = num;
-
+#ifndef __UBOOT__
        dwc->ev_buffs = devm_kzalloc(dwc->dev, sizeof(*dwc->ev_buffs) * num,
                        GFP_KERNEL);
+#else
+       dwc->ev_buffs = kzalloc(sizeof(*dwc->ev_buffs) * num, GFP_KERNEL);
+#endif
        if (!dwc->ev_buffs) {
                dev_err(dwc->dev, "can't allocate event buffers array\n");
                return -ENOMEM;
@@ -218,7 +254,11 @@ static int dwc3_alloc_event_buffers(struct dwc3 *dwc, 
unsigned length)
  *
  * Returns 0 on success otherwise negative errno.
  */
+#ifndef __UBOOT__
 static int dwc3_event_buffers_setup(struct dwc3 *dwc)
+#else
+int dwc3_event_buffers_setup(struct dwc3 *dwc)
+#endif
 {
        struct dwc3_event_buffer        *evt;
        int                             n;
@@ -242,8 +282,11 @@ static int dwc3_event_buffers_setup(struct dwc3 *dwc)
 
        return 0;
 }
-
+#ifndef __UBOOT__
 static void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
+#else
+void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
+#endif
 {
        struct dwc3_event_buffer        *evt;
        int                             n;
@@ -270,8 +313,11 @@ static void dwc3_core_num_eps(struct dwc3 *dwc)
        dev_vdbg(dwc->dev, "found %d IN and %d OUT endpoints\n",
                        dwc->num_in_eps, dwc->num_out_eps);
 }
-
+#ifndef __UBOOT__
 static void dwc3_cache_hwparams(struct dwc3 *dwc)
+#else
+void dwc3_cache_hwparams(struct dwc3 *dwc)
+#endif
 {
        struct dwc3_hwparams    *parms = &dwc->hwparams;
 
@@ -292,7 +338,11 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
  *
  * Returns 0 on success otherwise negative errno.
  */
+#ifndef __UBOOT__
 static int dwc3_core_init(struct dwc3 *dwc)
+#else
+int dwc3_core_init(struct dwc3 *dwc)
+#endif
 {
        unsigned long           timeout;
        u32                     reg;
@@ -308,14 +358,25 @@ static int dwc3_core_init(struct dwc3 *dwc)
        dwc->revision = reg;
 
        /* issue device SoftReset too */
+#ifndef __UBOOT__
        timeout = jiffies + msecs_to_jiffies(500);
+#else
+       timeout = 500;
+#endif
        dwc3_writel(dwc->regs, DWC3_DCTL, DWC3_DCTL_CSFTRST);
        do {
                reg = dwc3_readl(dwc->regs, DWC3_DCTL);
                if (!(reg & DWC3_DCTL_CSFTRST))
                        break;
 
+#ifndef __UBOOT__
                if (time_after(jiffies, timeout)) {
+#else
+               mdelay(1);
+               timeout--;
+
+               if (!timeout) {
+#endif
                        dev_err(dwc->dev, "Reset Timed Out\n");
                        ret = -ETIMEDOUT;
                        goto err0;
@@ -356,13 +417,21 @@ static int dwc3_core_init(struct dwc3 *dwc)
 err0:
        return ret;
 }
-
+#ifndef __UBOOT__
 static void dwc3_core_exit(struct dwc3 *dwc)
+#else
+void dwc3_core_exit(struct dwc3 *dwc)
+#endif
 {
+#ifndef __UBOOT__
+       /* FIX THIS DM */
        usb_phy_shutdown(dwc->usb2_phy);
        usb_phy_shutdown(dwc->usb3_phy);
+#endif
 }
 
+#ifndef __UBOOT__
+
 #define DWC3_ALIGN_MASK                (16 - 1)
 
 static int dwc3_probe(struct platform_device *pdev)
@@ -699,10 +768,11 @@ static int dwc3_suspend(struct device *dev)
 
        dwc->gctl = dwc3_readl(dwc->regs, DWC3_GCTL);
        spin_unlock_irqrestore(&dwc->lock, flags);
-
+#ifndef __UBOOT__
+       /* FIX THIS DM */
        usb_phy_shutdown(dwc->usb3_phy);
        usb_phy_shutdown(dwc->usb2_phy);
-
+#endif
        return 0;
 }
 
@@ -710,9 +780,11 @@ static int dwc3_resume(struct device *dev)
 {
        struct dwc3     *dwc = dev_get_drvdata(dev);
        unsigned long   flags;
-
+#ifndef __UBOOT__
+       /* FIX THIS DM */
        usb_phy_init(dwc->usb3_phy);
        usb_phy_init(dwc->usb2_phy);
+#endif
        msleep(100);
 
        spin_lock_irqsave(&dwc->lock, flags);
@@ -773,6 +845,8 @@ static struct platform_driver dwc3_driver = {
 
 module_platform_driver(dwc3_driver);
 
+#endif /* __UBOOT__ */
+
 MODULE_ALIAS("platform:dwc3");
 MODULE_AUTHOR("Felipe Balbi <[email protected]>");
 MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index b69d322..43e81f9 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -6,6 +6,8 @@
  * Authors: Felipe Balbi <[email protected]>,
  *         Sebastian Andrzej Siewior <[email protected]>
  *
+ * Back-ported by: Dan Murphy <[email protected]>
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -39,6 +41,8 @@
 #ifndef __DRIVERS_USB_DWC3_CORE_H
 #define __DRIVERS_USB_DWC3_CORE_H
 
+#define __UBOOT__
+#ifndef __UBOOT__
 #include <linux/device.h>
 #include <linux/spinlock.h>
 #include <linux/ioport.h>
@@ -50,6 +54,15 @@
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
 
+#else
+
+#include <linux/usb/ch9.h>
+#include <linux/usb/gadget.h>
+#include <linux/compiler.h>
+#include <linux/usb/linux-compat.h>
+
+#endif
+
 /* Global constants */
 #define DWC3_EP0_BOUNCE_SIZE   512
 #define DWC3_ENDPOINTS_NUM     32
@@ -676,7 +689,9 @@ struct dwc3 {
        struct device           *dev;
 
        struct platform_device  *xhci;
+#ifndef __UBOOT__
        struct resource         xhci_resources[DWC3_XHCI_RESOURCES_NUM];
+#endif
 
        struct dwc3_event_buffer **ev_buffs;
        struct dwc3_ep          *eps[DWC3_ENDPOINTS_NUM];
@@ -889,7 +904,15 @@ union dwc3_event {
 void dwc3_set_mode(struct dwc3 *dwc, u32 mode);
 int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc);
 
+#ifndef __UBOOT__
+/* TODO rework this for uboot */
 #if IS_ENABLED(CONFIG_USB_DWC3_HOST) || IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)
+#endif
+#endif /* __UBOOT__ */
+
+#if defined(CONFIG_USB_DWC3_HOST) || \
+       defined(CONFIG_USB_DWC3_DUAL_ROLE)
+
 int dwc3_host_init(struct dwc3 *dwc);
 void dwc3_host_exit(struct dwc3 *dwc);
 #else
@@ -899,7 +922,15 @@ static inline void dwc3_host_exit(struct dwc3 *dwc)
 { }
 #endif
 
+#ifndef __UBOOT__
+/* TODO rework this for uboot */
 #if IS_ENABLED(CONFIG_USB_DWC3_GADGET) || IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)
+#endif
+#endif
+
+#if defined(CONFIG_USB_DWC3_GADGET) || \
+       defined(CONFIG_USB_DWC3_DUAL_ROLE)
+
 int dwc3_gadget_init(struct dwc3 *dwc);
 void dwc3_gadget_exit(struct dwc3 *dwc);
 #else
@@ -910,11 +941,20 @@ static inline void dwc3_gadget_exit(struct dwc3 *dwc)
 #endif
 
 /* power management interface */
+#ifndef __UBOOT__
+/* TODO rework this for uboot */
 #if !IS_ENABLED(CONFIG_USB_DWC3_HOST)
+#endif /* __UBOOT__ */
+#endif
+#if defined (CONFIG_USB_DWC3_HOST)
+
 int dwc3_gadget_prepare(struct dwc3 *dwc);
 void dwc3_gadget_complete(struct dwc3 *dwc);
 int dwc3_gadget_suspend(struct dwc3 *dwc);
 int dwc3_gadget_resume(struct dwc3 *dwc);
+
+#endif
+/*
 #else
 static inline int dwc3_gadget_prepare(struct dwc3 *dwc)
 {
@@ -934,6 +974,17 @@ static inline int dwc3_gadget_resume(struct dwc3 *dwc)
 {
        return 0;
 }
-#endif /* !IS_ENABLED(CONFIG_USB_DWC3_HOST) */
+#endif */
+/* !IS_ENABLED(CONFIG_USB_DWC3_HOST) */
+
+#ifdef __UBOOT__
+int dwc3_core_init(struct dwc3 *dwc);
+int dwc3_event_buffers_setup(struct dwc3 *dwc);
+void dwc3_core_exit(struct dwc3 *dwc);
+int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length);
+void dwc3_free_event_buffers(struct dwc3 *dwc);
+void dwc3_event_buffers_cleanup(struct dwc3 *dwc);
+void dwc3_cache_hwparams(struct dwc3 *dwc);
+#endif
 
 #endif /* __DRIVERS_USB_DWC3_CORE_H */
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
index 34638b9..3dc31d2 100644
--- a/drivers/usb/dwc3/dwc3-omap.c
+++ b/drivers/usb/dwc3/dwc3-omap.c
@@ -6,6 +6,8 @@
  * Authors: Felipe Balbi <[email protected]>,
  *         Sebastian Andrzej Siewior <[email protected]>
  *
+ * Back-ported by: Dan Murphy <[email protected]>
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -36,6 +38,9 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#define __UBOOT__
+#ifndef __UBOOT__
+
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -53,6 +58,16 @@
 
 #include <linux/usb/otg.h>
 
+#else
+
+#include <linux/usb/linux-compat.h>
+#include <usb/lin_gadget_compat.h>
+
+#include "io.h"
+#include "dwc3-omap.h"
+
+#endif
+
 /*
  * All these registers belong to OMAP's Wrapper around the
  * DesignWare USB3 Core.
@@ -144,8 +159,11 @@ int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status)
        struct dwc3_omap        *omap = _omap;
 
        if (!omap)
+#ifndef __UBOOT__
                return -EPROBE_DEFER;
-
+#else
+               return -EINVAL;
+#endif
        switch (status) {
        case OMAP_DWC3_ID_GROUND:
                dev_dbg(omap->dev, "ID GND\n");
@@ -243,6 +261,7 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap)
        return IRQ_HANDLED;
 }
 
+#ifndef __UBOOT__
 static int dwc3_omap_remove_core(struct device *dev, void *c)
 {
        struct platform_device *pdev = to_platform_device(dev);
@@ -251,8 +270,13 @@ static int dwc3_omap_remove_core(struct device *dev, void 
*c)
 
        return 0;
 }
+#endif
 
+#ifndef __UBOOT__
 static void dwc3_omap_enable_irqs(struct dwc3_omap *omap)
+#else
+void dwc3_omap_enable_irqs(struct dwc3_omap *omap)
+#endif
 {
        u32                     reg;
 
@@ -280,6 +304,7 @@ static void dwc3_omap_disable_irqs(struct dwc3_omap *omap)
        dwc3_omap_writel(omap->base, USBOTGSS_IRQENABLE_SET_0, 0x00);
 }
 
+#ifndef __UBOOT__
 static u64 dwc3_omap_dma_mask = DMA_BIT_MASK(32);
 
 static int dwc3_omap_probe(struct platform_device *pdev)
@@ -474,6 +499,7 @@ static struct platform_driver dwc3_omap_driver = {
 };
 
 module_platform_driver(dwc3_omap_driver);
+#endif /* __UBOOT__ */
 
 MODULE_ALIAS("platform:omap-dwc3");
 MODULE_AUTHOR("Felipe Balbi <[email protected]>");
diff --git a/drivers/usb/dwc3/dwc3-omap.h b/drivers/usb/dwc3/dwc3-omap.h
new file mode 100644
index 0000000..e80a89f
--- /dev/null
+++ b/drivers/usb/dwc3/dwc3-omap.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2013 by Texas Instruments
+ * *
+ * Back-ported by: Dan Murphy <[email protected]>
+ *
+ * The Inventra Controller Driver for Linux is free software; you
+ * can redistribute it and/or modify it under the terms of the GNU
+ * General Public License version 2 as published by the Free Software
+ * Foundation.
+ */
+
+#ifndef __DWC3_OMAP_H__
+#define __DWC3_OMAP_H__
+
+enum omap_dwc3_vbus_id_status {
+       OMAP_DWC3_UNKNOWN = 0,
+       OMAP_DWC3_ID_GROUND,
+       OMAP_DWC3_ID_FLOAT,
+       OMAP_DWC3_VBUS_VALID,
+       OMAP_DWC3_VBUS_OFF,
+};
+
+enum dwc3_omap_utmi_mode {
+       DWC3_OMAP_UTMI_MODE_UNKNOWN = 0,
+       DWC3_OMAP_UTMI_MODE_HW,
+       DWC3_OMAP_UTMI_MODE_SW,
+};
+
+#if defined(CONFIG_USB_DWC3)
+extern int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status);
+#endif
+/*
+TODO need this override for non-USB_DWC3
+#else
+static inline int dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status)
+{
+       return -ENODEV;
+}
+#endif
+*/
+#endif /* __DWC3_OMAP_H__ */
diff --git a/drivers/usb/dwc3/dwc3-uboot.c b/drivers/usb/dwc3/dwc3-uboot.c
new file mode 100644
index 0000000..3732462
--- /dev/null
+++ b/drivers/usb/dwc3/dwc3-uboot.c
@@ -0,0 +1,384 @@
+/**
+ * dwc3-uboot.c - dwc3 uboot initialization
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Authors: Dan Murphy <[email protected]>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The names of the above-listed copyright holders may not be used
+ *    to endorse or promote products derived from this software without
+ *    specific prior written permission.
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2, as published by the Free
+ * Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <usb.h>
+#include <linux/usb/linux-compat.h>
+#include <linux/usb/usb-compat.h>
+#include <usb_defs.h>
+
+#include "core.h"
+#include "io.h"
+#include "dwc3-omap.h"
+
+#define DWC3_ALIGN_MASK                (16 - 1)
+
+static char *maximum_speed = "super";
+
+
+#include <asm/omap_common.h>
+/* IRQS0 BITS */
+#define USBOTGSS_IRQO_COREIRQ_ST               (1 << 0)
+
+/* IRQ1 BITS */
+#define USBOTGSS_IRQ1_DMADISABLECLR            (1 << 17)
+#define USBOTGSS_IRQ1_OEVT                     (1 << 16)
+#define USBOTGSS_IRQ1_DRVVBUS_RISE             (1 << 13)
+#define USBOTGSS_IRQ1_CHRGVBUS_RISE            (1 << 12)
+#define USBOTGSS_IRQ1_DISCHRGVBUS_RISE         (1 << 11)
+#define USBOTGSS_IRQ1_IDPULLUP_RISE            (1 << 8)
+#define USBOTGSS_IRQ1_DRVVBUS_FALL             (1 << 5)
+#define USBOTGSS_IRQ1_CHRGVBUS_FALL            (1 << 4)
+#define USBOTGSS_IRQ1_DISCHRGVBUS_FALL         (1 << 3)
+#define USBOTGSS_IRQ1_IDPULLUP_FALL            (1 << 0)
+
+#define USBOTGSS_IRQENABLE_SET_0       0x4A02002c
+#define USBOTGSS_IRQENABLE_SET_1       0x4A02003c
+#define USBOTGSS_SYSCONFIG             0x4A020010
+#define USBOTGSS_IRQSTATUS_0           0x4A020028
+#define USBOTGSS_IRQSTATUS_1           0x4A020038
+#define USBOTGSS_UTMI_OTG_STATUS 0x4A020084
+
+struct usb_dpll_params {
+       u16     m;
+       u8      n;
+       u8      freq:3;
+       u8      sd;
+       u32     mf;
+};
+
+static struct usb_dpll_params omap_usb3_dpll_params[6] = {
+       {1250, 5, 4, 20, 0},            /* 12 MHz */
+       {0, 0, 0, 0, 0},                /* for 13 MHz TBD   */
+       {3125, 20, 4, 20, 0},           /* 16.8 MHz */
+       {1172, 8, 4, 20, 65537},        /* 19.2 MHz */
+       {1250, 12, 4, 20, 0},           /* 26 MHz */
+       {3125, 47, 4, 20, 92843},       /* 38.4 MHz */
+};
+
+#define USB3_PHY_PLL_CONFIGURATION1    0x4A084C0C
+#define USB3_PHY_PLL_REGN_MASK         0xFE
+#define USB3_PHY_PLL_REGN_SHIFT                1
+#define USB3_PHY_PLL_REGM_MASK         0x1FFE00
+#define USB3_PHY_PLL_REGM_SHIFT                9
+#define USB3_PHY_PLL_CONFIGURATION2    0x4A084C10
+#define USB3_PHY_PLL_SELFREQDCO_MASK   0xE
+#define USB3_PHY_PLL_SELFREQDCO_SHIFT  1
+#define USB3_PHY_PLL_CONFIGURATION4     0x4A084C20
+#define USB3_PHY_PLL_REGM_F_MASK       0x3FFFF
+#define USB3_PHY_PLL_REGM_F_SHIFT      0
+#define USB3_PHY_PLL_CONFIGURATION3    0x4A084C14
+#define USB3_PHY_PLL_SD_MASK           0x3FC00
+#define USB3_PHY_PLL_SD_SHIFT          9
+#define USB3_PHY_CONTROL_PHY_POWER_USB 0x4A002370
+#define USB3_PWRCTL_CLK_CMD_MASK       0x3FE000
+#define USB3_PWRCTL_CLK_FREQ_MASK      0xFFC
+#define USB3_PHY_PARTIAL_RX_POWERON     (1<<6)
+#define USB3_PHY_TX_RX_POWERON         0x3
+#define USB3_PWRCTL_CLK_CMD_SHIFT      14
+#define USB3_PWRCTL_CLK_FREQ_SHIFT     22
+#define USB3_PHY_PLL_IDLE              1
+
+#define USB3_PHY_PLL_STATUS    0x4A084C04
+#define USB3_PHY_PLL_TICOPWDN   0x10000
+#define USB3_PHY_PLL_LOCK      0x2
+#define CONTROL_DEV_CONF       0x4A002300
+#define CONTROL_DEV_CONF_USBPHY_PD     1
+
+#define USB3_PHY_PLL_GO                0x4A084C08
+#define USB3_PHY_SET_PLL_GO    1
+
+void setup_usb(void)
+{
+       u32                     val;
+       u32                     retry;
+       u8 vali;
+       writel(0x118, 0x4A0029EC);
+       writel(0x1180000, 0x4A0029F0);
+       writel(0x118, 0x4A0029F4);
+       /* Turn on 32K AON clk */
+       writel(0x100, 0x4A008640);
+       /* Setting USBOTGSS_SYSCONFIG set to NO idle  */
+       val = readl(0x4A020010);
+       writel(0x10034, 0x4A020010);
+
+       /* Set the IRQ Enables */
+       /* Clear status */
+       val = readl(USBOTGSS_UTMI_OTG_STATUS);
+       writel(val, USBOTGSS_UTMI_OTG_STATUS);
+       /* Enable interrupts */
+       writel(0x1, USBOTGSS_IRQENABLE_SET_0);
+       writel(0x13939, USBOTGSS_IRQENABLE_SET_1);
+       /* Check for non zero status */
+       val = readl(USBOTGSS_IRQSTATUS_1);
+       writel(val, USBOTGSS_IRQSTATUS_1);
+       val = readl(USBOTGSS_IRQSTATUS_0);
+       writel(val, USBOTGSS_IRQSTATUS_0);
+}
+
+#ifdef CONFIG_USB_DWC3_HOST
+static struct musb *host;
+static struct usb_hcd hcd;
+static enum usb_device_speed host_speed;
+
+#define DWC_HOST_TIMEOUT       0x3ffffff
+
+static struct usb_host_endpoint hep;
+static struct urb urb;
+
+static void dwc3_host_complete_urb(struct urb *urb)
+{
+       urb->dev->status &= ~USB_ST_NOT_PROC;
+       urb->dev->act_len = urb->actual_length;
+
+       return;
+}
+
+static struct urb *construct_urb(struct usb_device *dev, int endpoint_type,
+                               unsigned long pipe, void *buffer, int len,
+                               struct devrequest *setup, int interval)
+{
+       int epnum = usb_pipeendpoint(pipe);
+       int is_in = usb_pipein(pipe);
+
+       memset(&urb, 0, sizeof(struct urb));
+       memset(&hep, 0, sizeof(struct usb_host_endpoint));
+
+       INIT_LIST_HEAD(&hep.urb_list);
+
+       INIT_LIST_HEAD(&urb.urb_list);
+       urb.ep = &hep;
+       urb.complete = dwc3_host_complete_urb;
+       urb.status = -EINPROGRESS;
+       urb.dev = dev;
+       urb.pipe = pipe;
+       urb.transfer_buffer = buffer;
+       urb.transfer_dma = (unsigned long)buffer;
+       urb.transfer_buffer_length = len;
+       urb.setup_packet = (unsigned char *)setup;
+
+       urb.ep->desc.wMaxPacketSize =
+               __cpu_to_le16(is_in ? dev->epmaxpacketin[epnum] :
+                               dev->epmaxpacketout[epnum]);
+       urb.ep->desc.bmAttributes = endpoint_type;
+       urb.ep->desc.bEndpointAddress =
+               (is_in ? USB_DIR_IN : USB_DIR_OUT) | epnum;
+       urb.ep->desc.bInterval = interval;
+
+       return &urb;
+}
+
+static int submit_urb(struct usb_hcd *hcd, struct urb *urb)
+{
+       return NULL;
+}
+
+int submit_control_msg(struct usb_device *dev, unsigned long pipe,
+                       void *buffer, int len, struct devrequest *setup)
+{
+       struct urb *urb = construct_urb(dev, USB_ENDPOINT_XFER_CONTROL, pipe,
+                                       buffer, len, setup, 0);
+
+       /* Fix speed for non hub-attached devices */
+       if (!dev->parent)
+               dev->speed = host_speed;
+
+       return submit_urb(&hcd, urb);
+}
+
+
+int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
+                                       void *buffer, int len)
+{
+       struct urb *urb = construct_urb(dev, USB_ENDPOINT_XFER_BULK, pipe,
+                                       buffer, len, NULL, 0);
+       return submit_urb(&hcd, urb);
+}
+
+int submit_int_msg(struct usb_device *dev, unsigned long pipe,
+                               void *buffer, int len, int interval)
+{
+       struct urb *urb = construct_urb(dev, USB_ENDPOINT_XFER_INT, pipe,
+                                       buffer, len, NULL, interval);
+       return submit_urb(&hcd, urb);
+}
+
+/* The init sequence was abstracted from the core.c probe function */
+int usb_lowlevel_init(int index, void **controller)
+{
+       struct dwc3 *dwc;
+       int ret = -ENOMEM;
+       void *mem;
+       u8 mode;
+
+       mem = kzalloc(sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
+       if (!mem) {
+               dev_err(dev, "not enough memory\n");
+               return -ENOMEM;
+       }
+       dwc = PTR_ALIGN(mem, DWC3_ALIGN_MASK + 1);
+       dwc->mem = mem;
+       dwc->regs = 0x4A030000;
+
+       if (!strncmp("super", maximum_speed, 5))
+               dwc->maximum_speed = DWC3_DCFG_SUPERSPEED;
+       else if (!strncmp("high", maximum_speed, 4))
+               dwc->maximum_speed = DWC3_DCFG_HIGHSPEED;
+       else if (!strncmp("full", maximum_speed, 4))
+               dwc->maximum_speed = DWC3_DCFG_FULLSPEED1;
+       else if (!strncmp("low", maximum_speed, 3))
+               dwc->maximum_speed = DWC3_DCFG_LOWSPEED;
+       else
+               dwc->maximum_speed = DWC3_DCFG_SUPERSPEED;
+
+       setup_usb();
+
+       dwc3_cache_hwparams(dwc);
+
+       ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE);
+       if (ret) {
+               dev_err(dwc->dev, "failed to allocate event buffers\n");
+               ret = -ENOMEM;
+               goto err0;
+       }
+
+       ret = dwc3_core_init(dwc);
+       if (ret) {
+               dev_err(dev, "failed to initialize core\n");
+               goto err0;
+       }
+
+       ret = dwc3_event_buffers_setup(dwc);
+       if (ret) {
+               dev_err(dwc->dev, "failed to setup event buffers\n");
+               goto err1;
+       }
+/* TODO: Figure out how to enable this
+       if (CONFIG_USB_DWC3_HOST)
+               mode = DWC3_MODE_HOST;
+       else if (CONFIG_USB_DWC3_GADGET)
+               mode = DWC3_MODE_DEVICE;
+       else
+               mode = DWC3_MODE_DRD;
+*/
+       mode = DWC3_MODE_HOST;
+       switch (mode) {
+       case DWC3_MODE_DEVICE:
+               dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
+               ret = dwc3_gadget_init(dwc);
+               if (ret) {
+                       printf("failed to initialize gadget\n");
+                       goto err2;
+               }
+               break;
+       case DWC3_MODE_HOST:
+               dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST);
+               ret = dwc3_host_init(dwc);
+               if (ret) {
+                       printf("failed to initialize host\n");
+                       goto err2;
+               }
+               break;
+       case DWC3_MODE_DRD:
+               dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
+               ret = dwc3_host_init(dwc);
+               if (ret) {
+                       printf("failed to initialize host\n");
+                       goto err2;
+               }
+
+               ret = dwc3_gadget_init(dwc);
+               if (ret) {
+                       printf("failed to initialize gadget\n");
+                       goto err2;
+               }
+               break;
+       default:
+               printf("Unsupported mode of operation %d\n", mode);
+               goto err2;
+       }
+       dwc->mode = mode;
+
+       return 0;
+
+err2:
+       dwc3_event_buffers_cleanup(dwc);
+
+err1:
+       dwc3_core_exit(dwc);
+
+err0:
+       dwc3_free_event_buffers(dwc);
+
+       return ret;
+}
+
+int usb_lowlevel_stop(int index)
+{
+       return 0;
+}
+#endif /* CONFIG_USB_DWC3_HOST */
+
+#ifdef CONFIG_USB_DWC3_GADGET
+int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
+{
+       return 0;
+}
+
+static struct dwc *gadget;
+int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+{
+       int ret;
+
+       if (!driver || /* driver->speed < USB_SPEED_FULL ||*/ !driver->bind ||
+           !driver->setup) {
+               printf("bad parameter.\n");
+               return -EINVAL;
+       }
+
+       if (!gadget) {
+               printf("Controller uninitialized\n");
+               return -ENXIO;
+       }
+
+       return 0;
+}
+
+int usb_gadget_handle_interrupts(void)
+{
+       return 0;
+}
+#endif /* CONFIG_USB_DWC3_GADGET */
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 5acbb94..423301e 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -6,6 +6,8 @@
  * Authors: Felipe Balbi <[email protected]>,
  *         Sebastian Andrzej Siewior <[email protected]>
  *
+ * Back-ported by: Dan Murphy <[email protected]>
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -36,6 +38,9 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#define __UBOOT__
+#ifndef __UBOOT__
+
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
@@ -50,6 +55,18 @@
 #include <linux/usb/gadget.h>
 #include <linux/usb/composite.h>
 
+#else
+
+#include <common.h>
+
+#include <linux/usb/ch9.h>
+#include <linux/usb/gadget.h>
+#include <linux/usb/composite.h>
+#include <linux/usb/linux-compat.h>
+#include <usb/lin_gadget_compat.h>
+
+#endif
+
 #include "core.h"
 #include "gadget.h"
 #include "io.h"
@@ -147,7 +164,12 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep,
                direction = !!(dep->flags & DWC3_EP0_DIR_IN);
 
                if (dwc->ep0state != EP0_DATA_PHASE) {
+
+#ifndef __UBOOT__
                        dev_WARN(dwc->dev, "Unexpected pending request\n");
+#else
+                       printf("Unexpected pending request\n");
+#endif
                        return 0;
                }
 
@@ -902,14 +924,15 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
                        && (dep->number == 0)) {
                u32     transfer_size;
                u32     maxpacket;
-
+#ifndef __UBOOT__
+       /* FIX THIS DM */
                ret = usb_gadget_map_request(&dwc->gadget, &req->request,
                                dep->number);
                if (ret) {
                        dev_dbg(dwc->dev, "failed to map request\n");
                        return;
                }
-
+#endif
                WARN_ON(req->request.length > DWC3_EP0_BOUNCE_SIZE);
 
                maxpacket = dep->endpoint.maxpacket;
@@ -926,13 +949,15 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
                                dwc->ep0_bounce_addr, transfer_size,
                                DWC3_TRBCTL_CONTROL_DATA);
        } else {
+#ifndef __UBOOT__
+       /* FIX THIS DM */
                ret = usb_gadget_map_request(&dwc->gadget, &req->request,
                                dep->number);
                if (ret) {
                        dev_dbg(dwc->dev, "failed to map request\n");
                        return;
                }
-
+#endif
                ret = dwc3_ep0_start_trans(dwc, dep->number, req->request.dma,
                                req->request.length, DWC3_TRBCTL_CONTROL_DATA);
        }
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 2b6e7e0..694762d 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -6,6 +6,8 @@
  * Authors: Felipe Balbi <[email protected]>,
  *         Sebastian Andrzej Siewior <[email protected]>
  *
+ * Back-ported by: Dan Murphy <[email protected]>
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -36,6 +38,9 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#define __UBOOT__
+#ifndef __UBOOT__
+
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
@@ -50,6 +55,16 @@
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
 
+#else
+
+#include <common.h>
+#include <linux/usb/ch9.h>
+#include <linux/usb/gadget.h>
+#include <linux/usb/linux-compat.h>
+#include <usb/lin_gadget_compat.h>
+
+#endif
+
 #include "core.h"
 #include "gadget.h"
 #include "io.h"
@@ -268,8 +283,12 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct 
dwc3_request *req,
        if (dwc->ep0_bounced && dep->number == 0)
                dwc->ep0_bounced = false;
        else
+
+#ifndef __UBOOT__
+       /* FIX THIS DM */
                usb_gadget_unmap_request(&dwc->gadget, &req->request,
                                req->direction);
+#endif
 
        dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n",
                        req, dep->name, req->request.actual,
@@ -654,23 +673,44 @@ static int dwc3_gadget_ep_enable(struct usb_ep *ep,
        dwc = dep->dwc;
 
        if (dep->flags & DWC3_EP_ENABLED) {
+
+#ifndef __UBOOT__
                dev_WARN_ONCE(dwc->dev, true, "%s is already enabled\n",
                                dep->name);
+#else
+               printf("%s is already enabled\n", dep->name);
+#endif
                return 0;
        }
 
        switch (usb_endpoint_type(desc)) {
        case USB_ENDPOINT_XFER_CONTROL:
+#ifndef __UBOOT__
                strlcat(dep->name, "-control", sizeof(dep->name));
+#else
+               strcat(dep->name, "-control");
+#endif
                break;
        case USB_ENDPOINT_XFER_ISOC:
+#ifndef __UBOOT__
                strlcat(dep->name, "-isoc", sizeof(dep->name));
+#else
+               strcat(dep->name, "-isoc");
+#endif
                break;
        case USB_ENDPOINT_XFER_BULK:
+#ifndef __UBOOT__
                strlcat(dep->name, "-bulk", sizeof(dep->name));
+#else
+               strcat(dep->name, "-bulk");
+#endif
                break;
        case USB_ENDPOINT_XFER_INT:
+#ifndef __UBOOT__
                strlcat(dep->name, "-int", sizeof(dep->name));
+#else
+               strcat(dep->name, "-int");
+#endif
                break;
        default:
                dev_err(dwc->dev, "invalid endpoint transfer type\n");
@@ -701,8 +741,12 @@ static int dwc3_gadget_ep_disable(struct usb_ep *ep)
        dwc = dep->dwc;
 
        if (!(dep->flags & DWC3_EP_ENABLED)) {
+#ifndef __UBOOT__
                dev_WARN_ONCE(dwc->dev, true, "%s is already disabled\n",
                                dep->name);
+#else
+               printf("%s is already disabled\n", dep->name);
+#endif
                return 0;
        }
 
@@ -896,6 +940,9 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool 
starting)
                        struct scatterlist *s;
                        int             i;
 
+                       printf("Fix this\n");
+#ifndef __UBOOT__
+       /* FIX THIS DM */
                        for_each_sg(sg, s, request->num_mapped_sgs, i) {
                                unsigned chain = true;
 
@@ -923,6 +970,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool 
starting)
                                if (last_one)
                                        break;
                        }
+#endif
                } else {
                        dma = req->request.dma;
                        length = req->request.length;
@@ -1002,8 +1050,11 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep 
*dep, u16 cmd_param,
                 * here and stop, unmap, free and del each of the linked
                 * requests instead of what we do now.
                 */
+#ifndef __UBOOT__
+       /* FIX THIS DM */
                usb_gadget_unmap_request(&dwc->gadget, &req->request,
                                req->direction);
+#endif
                list_del(&req->list);
                return ret;
        }
@@ -1070,11 +1121,13 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, 
struct dwc3_request *req)
         * This will also avoid Host cancelling URBs due to too
         * many NAKs.
         */
+#ifndef __UBOOT__
+       /* FIX THIS DM */
        ret = usb_gadget_map_request(&dwc->gadget, &req->request,
                        dep->direction);
        if (ret)
                return ret;
-
+#endif
        list_add_tail(&req->list, &dep->request_list);
 
        /*
@@ -1376,14 +1429,23 @@ static int dwc3_gadget_wakeup(struct usb_gadget *g)
        }
 
        /* poll until Link State changes to ON */
+#ifndef __UBOOT__
        timeout = jiffies + msecs_to_jiffies(100);
-
        while (!time_after(jiffies, timeout)) {
+#else
+       timeout = 100;
+       while (timeout != 0) {
+#endif
+
                reg = dwc3_readl(dwc->regs, DWC3_DSTS);
 
                /* in HS, means ON */
                if (DWC3_DSTS_USBLNKST(reg) == DWC3_LINK_STATE_U0)
                        break;
+#ifdef __UBOOT__
+               mdelay(1);
+               timeout--;
+#endif
        }
 
        if (DWC3_DSTS_USBLNKST(reg) != DWC3_LINK_STATE_U0) {
@@ -1564,7 +1626,7 @@ static int dwc3_gadget_start(struct usb_gadget *g,
        /* begin to receive SETUP packets */
        dwc->ep0state = EP0_SETUP_PHASE;
        dwc3_ep0_out_start(dwc);
-
+#ifndef __UBOOT__
        irq = platform_get_irq(to_platform_device(dwc->dev), 0);
        ret = request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt,
                        IRQF_SHARED | IRQF_ONESHOT, "dwc3", dwc);
@@ -1573,7 +1635,7 @@ static int dwc3_gadget_start(struct usb_gadget *g,
                                irq, ret);
                goto err1;
        }
-
+#endif /* __UBOOT__ */
        dwc3_gadget_enable_irq(dwc);
 
        spin_unlock_irqrestore(&dwc->lock, flags);
@@ -1599,8 +1661,10 @@ static int dwc3_gadget_stop(struct usb_gadget *g,
        spin_lock_irqsave(&dwc->lock, flags);
 
        dwc3_gadget_disable_irq(dwc);
+#ifndef __UBOOT__
        irq = platform_get_irq(to_platform_device(dwc->dev), 0);
        free_irq(irq, dwc);
+#endif
 
        __dwc3_gadget_ep_disable(dwc->eps[0]);
        __dwc3_gadget_ep_disable(dwc->eps[1]);
@@ -2644,12 +2708,13 @@ int dwc3_gadget_init(struct dwc3 *dwc)
                dwc3_gadget_usb3_phy_suspend(dwc, false);
        }
 
+#ifndef __UBOOT__
        ret = usb_add_gadget_udc(dwc->dev, &dwc->gadget);
        if (ret) {
                dev_err(dwc->dev, "failed to register udc\n");
                goto err5;
        }
-
+#endif
        return 0;
 
 err5:
diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h
index 99e6d72..23c57fe 100644
--- a/drivers/usb/dwc3/gadget.h
+++ b/drivers/usb/dwc3/gadget.h
@@ -6,6 +6,8 @@
  * Authors: Felipe Balbi <[email protected]>,
  *         Sebastian Andrzej Siewior <[email protected]>
  *
+ * Back-ported by: Dan Murphy <[email protected]>
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c
index 0fa1846..0171b6c 100644
--- a/drivers/usb/dwc3/host.c
+++ b/drivers/usb/dwc3/host.c
@@ -5,6 +5,8 @@
  *
  * Authors: Felipe Balbi <[email protected]>,
  *
+ * Back-ported by: Dan Murphy <[email protected]>
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -35,30 +37,44 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#define __UBOOT__
+#ifndef __UBOOT__
 #include <linux/platform_device.h>
+#endif
 
 #include "core.h"
 
 int dwc3_host_init(struct dwc3 *dwc)
 {
+#ifndef __UBOOT__
        struct platform_device  *xhci;
+#endif
+       void *xhci;
        int                     ret;
-
+#ifndef __UBOOT__
        xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO);
        if (!xhci) {
                dev_err(dwc->dev, "couldn't allocate xHCI device\n");
                ret = -ENOMEM;
                goto err0;
        }
-
        dma_set_coherent_mask(&xhci->dev, dwc->dev->coherent_dma_mask);
 
        xhci->dev.parent        = dwc->dev;
        xhci->dev.dma_mask      = dwc->dev->dma_mask;
        xhci->dev.dma_parms     = dwc->dev->dma_parms;
 
+#else
+       xhci = kzalloc(sizeof(*dwc), GFP_KERNEL);
+       if (!xhci) {
+               dev_err(dev, "not enough memory\n");
+               return -ENOMEM;
+       }
+#endif
+
        dwc->xhci = xhci;
 
+#ifndef __UBOOT__
        ret = platform_device_add_resources(xhci, dwc->xhci_resources,
                                                DWC3_XHCI_RESOURCES_NUM);
        if (ret) {
@@ -71,11 +87,14 @@ int dwc3_host_init(struct dwc3 *dwc)
                dev_err(dwc->dev, "failed to register xHCI device\n");
                goto err1;
        }
-
+#endif
        return 0;
 
 err1:
+#ifndef __UBOOT__
        platform_device_put(xhci);
+#endif
+
 
 err0:
        return ret;
@@ -83,5 +102,7 @@ err0:
 
 void dwc3_host_exit(struct dwc3 *dwc)
 {
+#ifndef __UBOOT__
        platform_device_unregister(dwc->xhci);
+#endif
 }
diff --git a/drivers/usb/dwc3/io.h b/drivers/usb/dwc3/io.h
index a50f76b..2b0895a 100644
--- a/drivers/usb/dwc3/io.h
+++ b/drivers/usb/dwc3/io.h
@@ -6,6 +6,8 @@
  * Authors: Felipe Balbi <[email protected]>,
  *         Sebastian Andrzej Siewior <[email protected]>
  *
+ * Back-ported by: Dan Murphy <[email protected]>
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -39,7 +41,12 @@
 #ifndef __DRIVERS_USB_DWC3_IO_H
 #define __DRIVERS_USB_DWC3_IO_H
 
+#define __UBOOT__
+#ifndef __UBOOT__
 #include <linux/io.h>
+#else
+#include <asm/io.h>
+#endif
 
 #include "core.h"
 
@@ -50,7 +57,11 @@ static inline u32 dwc3_readl(void __iomem *base, u32 offset)
         * space, see dwc3_probe in core.c.
         * However, the offsets are given starting from xHCI address space.
         */
+#ifndef __UBOOT__
        return readl(base + (offset - DWC3_GLOBALS_REGS_START));
+#else
+       return readl(base + offset);
+#endif
 }
 
 static inline void dwc3_writel(void __iomem *base, u32 offset, u32 value)
@@ -60,7 +71,11 @@ static inline void dwc3_writel(void __iomem *base, u32 
offset, u32 value)
         * space, see dwc3_probe in core.c.
         * However, the offsets are given starting from xHCI address space.
         */
+#ifndef __UBOOT__
        writel(value, base + (offset - DWC3_GLOBALS_REGS_START));
+#else
+       writel(value, (base + offset));
+#endif
 }
 
 #endif /* __DRIVERS_USB_DWC3_IO_H */
-- 
1.7.9.5

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to