
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 dmurphy@ti.com --- 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 dmurphy@ti.com +# +# 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 balbi@ti.com, * Sebastian Andrzej Siewior bigeasy@linutronix.de * + * Back-ported by: Dan Murphy dmurphy@ti.com + * * 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 balbi@ti.com"); 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 balbi@ti.com, * Sebastian Andrzej Siewior bigeasy@linutronix.de * + * Back-ported by: Dan Murphy dmurphy@ti.com + * * 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 balbi@ti.com, * Sebastian Andrzej Siewior bigeasy@linutronix.de * + * Back-ported by: Dan Murphy dmurphy@ti.com + * * 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 balbi@ti.com"); 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 dmurphy@ti.com + * + * 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 dmurphy@ti.com + * + * 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 balbi@ti.com, * Sebastian Andrzej Siewior bigeasy@linutronix.de * + * Back-ported by: Dan Murphy dmurphy@ti.com + * * 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 balbi@ti.com, * Sebastian Andrzej Siewior bigeasy@linutronix.de * + * Back-ported by: Dan Murphy dmurphy@ti.com + * * 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 balbi@ti.com, * Sebastian Andrzej Siewior bigeasy@linutronix.de * + * Back-ported by: Dan Murphy dmurphy@ti.com + * * 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 balbi@ti.com, * + * Back-ported by: Dan Murphy dmurphy@ti.com + * * 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 balbi@ti.com, * Sebastian Andrzej Siewior bigeasy@linutronix.de * + * Back-ported by: Dan Murphy dmurphy@ti.com + * * 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 */