diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/Kconfig | 20 | ||||
-rw-r--r-- | drivers/usb/eth/asix.c | 40 | ||||
-rw-r--r-- | drivers/usb/gadget/gadget_chips.h | 2 | ||||
-rw-r--r-- | drivers/usb/host/dwc2.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/usb-uclass.c | 2 | ||||
-rw-r--r-- | drivers/usb/musb-new/Kconfig | 28 | ||||
-rw-r--r-- | drivers/usb/musb-new/Makefile | 6 | ||||
-rw-r--r-- | drivers/usb/musb-new/musb_core.c | 12 | ||||
-rw-r--r-- | drivers/usb/musb-new/musb_core.h | 4 | ||||
-rw-r--r-- | drivers/usb/musb-new/musb_dma.h | 2 | ||||
-rw-r--r-- | drivers/usb/musb-new/musb_gadget.c | 4 | ||||
-rw-r--r-- | drivers/usb/musb-new/musb_uboot.c | 12 | ||||
-rw-r--r-- | drivers/usb/musb-new/sunxi.c | 9 | ||||
-rw-r--r-- | drivers/usb/musb/Makefile | 4 | ||||
-rw-r--r-- | drivers/usb/musb/musb_core.c | 8 | ||||
-rw-r--r-- | drivers/usb/musb/musb_hcd.c | 6 | ||||
-rw-r--r-- | drivers/usb/musb/musb_hcd.h | 4 |
17 files changed, 116 insertions, 51 deletions
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 716dad4..abb06fc 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig @@ -1,10 +1,5 @@ -menu USB -config USB_ARCH_HAS_HCD - def_bool y - -config USB - bool "Support for Host-side USB" - depends on USB_ARCH_HAS_HCD +menuconfig USB + bool "USB support" ---help--- Universal Serial Bus (USB) is a specification for a serial bus subsystem which offers higher speeds and more features than the @@ -18,8 +13,10 @@ config USB such as scanners, keyboards, mice, modems, cameras, disks, flash memory, network links, and printers to the PC. - Say Y here if your computer has a host-side USB port and you want - to use USB devices. You then need to say Y to at least one of the + Say Y here if your device has an USB port, either host, peripheral or + dual-role. + + For an USB host port, you then need to say Y to at least one of the Host Controller Driver (HCD) options below. Choose a USB 1.1 controller, such as "UHCI HCD support" or "OHCI HCD support", and "EHCI HCD (USB 2.0) support" except for older systems that @@ -52,8 +49,12 @@ config DM_USB source "drivers/usb/host/Kconfig" +source "drivers/usb/musb-new/Kconfig" + source "drivers/usb/emul/Kconfig" +comment "USB peripherals" + config USB_STORAGE bool "USB Mass Storage support" ---help--- @@ -88,4 +89,3 @@ endchoice endif endif -endmenu diff --git a/drivers/usb/eth/asix.c b/drivers/usb/eth/asix.c index 72ec41e..8a43e7c 100644 --- a/drivers/usb/eth/asix.c +++ b/drivers/usb/eth/asix.c @@ -1,6 +1,8 @@ /* * Copyright (c) 2011 The Chromium OS Authors. * + * Patched for AX88772B by Antmicro Ltd <www.antmicro.com> + * * SPDX-License-Identifier: GPL-2.0+ */ @@ -64,8 +66,11 @@ AX_MEDIUM_AC | AX_MEDIUM_RE) /* AX88772 & AX88178 RX_CTL values */ -#define AX_RX_CTL_SO 0x0080 -#define AX_RX_CTL_AB 0x0008 +#define AX_RX_CTL_RH2M 0x0200 /* 32-bit aligned RX IP header */ +#define AX_RX_CTL_RH1M 0x0100 /* Enable RX header format type 1 */ +#define AX_RX_CTL_SO 0x0080 +#define AX_RX_CTL_AB 0x0008 +#define AX_RX_HEADER_DEFAULT (AX_RX_CTL_RH1M | AX_RX_CTL_RH2M) #define AX_DEFAULT_RX_CTL \ (AX_RX_CTL_SO | AX_RX_CTL_AB) @@ -92,6 +97,8 @@ #define FLAG_TYPE_AX88772B (1U << 2) #define FLAG_EEPROM_MAC (1U << 3) /* initial mac address in eeprom */ +#define ASIX_USB_VENDOR_ID 0x0b95 +#define AX88772B_USB_PRODUCT_ID 0x772b /* driver private */ struct asix_private { @@ -418,15 +425,23 @@ static int asix_basic_reset(struct ueth_data *dev) return 0; } -static int asix_init_common(struct ueth_data *dev) +static int asix_init_common(struct ueth_data *dev, uint8_t *enetaddr) { int timeout = 0; #define TIMEOUT_RESOLUTION 50 /* ms */ int link_detected; + u32 ctl = AX_DEFAULT_RX_CTL; debug("** %s()\n", __func__); - if (asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL) < 0) + if ((dev->pusb_dev->descriptor.idVendor == ASIX_USB_VENDOR_ID) && + (dev->pusb_dev->descriptor.idProduct == AX88772B_USB_PRODUCT_ID)) + ctl |= AX_RX_HEADER_DEFAULT; + + if (asix_write_rx_ctl(dev, ctl) < 0) + goto out_err; + + if (asix_write_hwaddr_common(dev, enetaddr) < 0) goto out_err; do { @@ -447,6 +462,12 @@ static int asix_init_common(struct ueth_data *dev) goto out_err; } + /* + * Wait some more to avoid timeout on first transfer + * (e.g. EHCI timed out on TD - token=0x8008d80) + */ + mdelay(25); + return 0; out_err: return -1; @@ -488,7 +509,7 @@ static int asix_init(struct eth_device *eth, bd_t *bd) { struct ueth_data *dev = (struct ueth_data *)eth->priv; - return asix_init_common(dev); + return asix_init_common(dev, eth->enetaddr); } static int asix_send(struct eth_device *eth, void *packet, int length) @@ -550,6 +571,12 @@ static int asix_recv(struct eth_device *eth) return -1; } + if ((dev->pusb_dev->descriptor.idVendor == + ASIX_USB_VENDOR_ID) && + (dev->pusb_dev->descriptor.idProduct == + AX88772B_USB_PRODUCT_ID)) + buf_ptr += 2; + /* Notify net stack */ net_process_received_packet(buf_ptr + sizeof(packet_len), packet_len); @@ -729,9 +756,10 @@ int asix_eth_get_info(struct usb_device *dev, struct ueth_data *ss, #ifdef CONFIG_DM_ETH static int asix_eth_start(struct udevice *dev) { + struct eth_pdata *pdata = dev_get_platdata(dev); struct asix_private *priv = dev_get_priv(dev); - return asix_init_common(&priv->ueth); + return asix_init_common(&priv->ueth, pdata->enetaddr); } void asix_eth_stop(struct udevice *dev) diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h index c859df2..e9811c3 100644 --- a/drivers/usb/gadget/gadget_chips.h +++ b/drivers/usb/gadget/gadget_chips.h @@ -125,7 +125,7 @@ #endif /* Mentor high speed "dual role" controller, in peripheral role */ -#ifdef CONFIG_MUSB_GADGET +#ifdef CONFIG_USB_MUSB_GADGET #define gadget_is_musbhdrc(g) (!strcmp("musb-hdrc", (g)->name)) #else #define gadget_is_musbhdrc(g) 0 diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c index eee60a2..ad35841 100644 --- a/drivers/usb/host/dwc2.c +++ b/drivers/usb/host/dwc2.c @@ -929,6 +929,10 @@ int usb_lowlevel_init(int index, enum usb_init_type init, void **controller) root_hub_devnum = 0; + /* board dependant init */ + if (board_usb_init(index, USB_INIT_HOST)) + return -1; + snpsid = readl(®s->gsnpsid); printf("Core Release: %x.%03x\n", snpsid >> 12 & 0xf, snpsid & 0xfff); diff --git a/drivers/usb/host/usb-uclass.c b/drivers/usb/host/usb-uclass.c index c5d1e7f..b17a7d7 100644 --- a/drivers/usb/host/usb-uclass.c +++ b/drivers/usb/host/usb-uclass.c @@ -173,7 +173,9 @@ int usb_stop(void) uclass_foreach_dev(dev, uc) usb_emul_reset(dev); #endif +#ifdef CONFIG_USB_STORAGE usb_stor_reset(); +#endif usb_hub_reset(); uc_priv->companion_device_count = 0; usb_started = 0; diff --git a/drivers/usb/musb-new/Kconfig b/drivers/usb/musb-new/Kconfig new file mode 100644 index 0000000..0082ff8 --- /dev/null +++ b/drivers/usb/musb-new/Kconfig @@ -0,0 +1,28 @@ +# +# MUSB Controller Driver +# +comment "MUSB Controller Driver" + +config USB_MUSB_HOST + bool "MUSB host mode support" + help + Enables the MUSB USB dual-role controller in host mode. + +config USB_MUSB_GADGET + bool "MUSB gadget mode support" + help + Enables the MUSB USB dual-role controller in gadget mode. + +if USB_MUSB_HOST || USB_MUSB_GADGET + +config USB_MUSB_SUNXI + bool "Enable sunxi OTG / DRC USB controller" + depends on ARCH_SUNXI + default y + ---help--- + Say y here to enable support for the sunxi OTG / DRC USB controller + used on almost all sunxi boards. Note currently u-boot can only have + one usb host controller enabled at a time, so enabling this on boards + which also use the ehci host controller will result in build errors. + +endif diff --git a/drivers/usb/musb-new/Makefile b/drivers/usb/musb-new/Makefile index 9edeece..fd9df72 100644 --- a/drivers/usb/musb-new/Makefile +++ b/drivers/usb/musb-new/Makefile @@ -2,9 +2,9 @@ # for USB OTG silicon based on Mentor Graphics INVENTRA designs # -obj-$(CONFIG_MUSB_GADGET) += musb_gadget.o musb_gadget_ep0.o musb_core.o -obj-$(CONFIG_MUSB_GADGET) += musb_uboot.o -obj-$(CONFIG_MUSB_HOST) += musb_host.o musb_core.o musb_uboot.o +obj-$(CONFIG_USB_MUSB_GADGET) += musb_gadget.o musb_gadget_ep0.o musb_core.o +obj-$(CONFIG_USB_MUSB_GADGET) += musb_uboot.o +obj-$(CONFIG_USB_MUSB_HOST) += musb_host.o musb_core.o musb_uboot.o obj-$(CONFIG_USB_MUSB_DSPS) += musb_dsps.o obj-$(CONFIG_USB_MUSB_AM35X) += am35x.o obj-$(CONFIG_USB_MUSB_OMAP2PLUS) += omap2430.o diff --git a/drivers/usb/musb-new/musb_core.c b/drivers/usb/musb-new/musb_core.c index f530af4..411e5a0 100644 --- a/drivers/usb/musb-new/musb_core.c +++ b/drivers/usb/musb-new/musb_core.c @@ -1437,7 +1437,7 @@ static int __devinit musb_core_init(u16 musb_type, struct musb *musb) strcat(aInfo, ", dyn FIFOs"); musb->dyn_fifo = true; } -#ifndef CONFIG_MUSB_DISABLE_BULK_COMBINE_SPLIT +#ifndef CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT if (reg & MUSB_CONFIGDATA_MPRXE) { strcat(aInfo, ", bulk combine"); musb->bulk_combine = true; @@ -1662,7 +1662,7 @@ irqreturn_t musb_interrupt(struct musb *musb) } EXPORT_SYMBOL_GPL(musb_interrupt); -#ifndef CONFIG_MUSB_PIO_ONLY +#ifndef CONFIG_USB_MUSB_PIO_ONLY static bool __devinitdata use_dma = 1; /* "modprobe ... use_dma=0" etc */ @@ -2011,7 +2011,7 @@ musb_init_controller(struct musb_hdrc_platform_data *plat, struct device *dev, pm_runtime_get_sync(musb->controller); -#ifndef CONFIG_MUSB_PIO_ONLY +#ifndef CONFIG_USB_MUSB_PIO_ONLY if (use_dma && dev->dma_mask) { struct dma_controller *c; @@ -2194,7 +2194,7 @@ fail0: * bridge to a platform device; this driver then suffices. */ -#ifndef CONFIG_MUSB_PIO_ONLY +#ifndef CONFIG_USB_MUSB_PIO_ONLY static u64 *orig_dma_mask; #endif @@ -2217,7 +2217,7 @@ static int __devinit musb_probe(struct platform_device *pdev) return -ENOMEM; } -#ifndef CONFIG_MUSB_PIO_ONLY +#ifndef CONFIG_USB_MUSB_PIO_ONLY /* clobbered by use_dma=n */ orig_dma_mask = dev->dma_mask; #endif @@ -2244,7 +2244,7 @@ static int __devexit musb_remove(struct platform_device *pdev) musb_free(musb); iounmap(ctrl_base); device_init_wakeup(&pdev->dev, 0); -#ifndef CONFIG_MUSB_PIO_ONLY +#ifndef CONFIG_USB_MUSB_PIO_ONLY pdev->dev.dma_mask = orig_dma_mask; #endif return 0; diff --git a/drivers/usb/musb-new/musb_core.h b/drivers/usb/musb-new/musb_core.h index 8727f64..c818040 100644 --- a/drivers/usb/musb-new/musb_core.h +++ b/drivers/usb/musb-new/musb_core.h @@ -97,7 +97,7 @@ struct musb_ep; #ifndef __UBOOT__ #define is_peripheral_capable() (1) #else -#ifdef CONFIG_MUSB_GADGET +#ifdef CONFIG_USB_MUSB_GADGET #define is_peripheral_capable() (1) #else #define is_peripheral_capable() (0) @@ -118,7 +118,7 @@ extern void musb_g_disconnect(struct musb *); #ifndef __UBOOT__ #define is_host_capable() (1) #else -#ifdef CONFIG_MUSB_HOST +#ifdef CONFIG_USB_MUSB_HOST #define is_host_capable() (1) #else #define is_host_capable() (0) diff --git a/drivers/usb/musb-new/musb_dma.h b/drivers/usb/musb-new/musb_dma.h index 3a97c4e..17fe89f 100644 --- a/drivers/usb/musb-new/musb_dma.h +++ b/drivers/usb/musb-new/musb_dma.h @@ -62,7 +62,7 @@ struct musb_hw_ep; #define DMA_ADDR_INVALID (~(dma_addr_t)0) -#ifndef CONFIG_MUSB_PIO_ONLY +#ifndef CONFIG_USB_MUSB_PIO_ONLY #define is_dma_capable() (1) #else #define is_dma_capable() (0) diff --git a/drivers/usb/musb-new/musb_gadget.c b/drivers/usb/musb-new/musb_gadget.c index 97acf93..309dc7f 100644 --- a/drivers/usb/musb-new/musb_gadget.c +++ b/drivers/usb/musb-new/musb_gadget.c @@ -99,7 +99,7 @@ #define is_buffer_mapped(req) (is_dma_capable() && \ (req->map_state != UN_MAPPED)) -#ifndef CONFIG_MUSB_PIO_ONLY +#ifndef CONFIG_USB_MUSB_PIO_ONLY /* Maps the buffer to dma */ static inline void map_dma_buffer(struct musb_request *request, @@ -382,7 +382,7 @@ static void txstate(struct musb *musb, struct musb_request *req) epnum, musb_ep->packet_sz, fifo_count, csr); -#ifndef CONFIG_MUSB_PIO_ONLY +#ifndef CONFIG_USB_MUSB_PIO_ONLY if (is_buffer_mapped(req)) { struct dma_controller *c = musb->dma_controller; size_t request_size; diff --git a/drivers/usb/musb-new/musb_uboot.c b/drivers/usb/musb-new/musb_uboot.c index 9b56e90..10f6b5d 100644 --- a/drivers/usb/musb-new/musb_uboot.c +++ b/drivers/usb/musb-new/musb_uboot.c @@ -15,7 +15,7 @@ #include "musb_gadget.h" #include "musb_uboot.h" -#ifdef CONFIG_MUSB_HOST +#ifdef CONFIG_USB_MUSB_HOST struct int_queue { struct usb_host_endpoint hep; struct urb urb; @@ -368,9 +368,9 @@ struct dm_usb_ops musb_usb_ops = { .reset_root_port = musb_reset_root_port, }; #endif /* CONFIG_DM_USB */ -#endif /* CONFIG_MUSB_HOST */ +#endif /* CONFIG_USB_MUSB_HOST */ -#ifdef CONFIG_MUSB_GADGET +#ifdef CONFIG_USB_MUSB_GADGET static struct musb *gadget; int usb_gadget_handle_interrupts(int index) @@ -420,7 +420,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) driver->unbind(&gadget->g); return 0; } -#endif /* CONFIG_MUSB_GADGET */ +#endif /* CONFIG_USB_MUSB_GADGET */ int musb_register(struct musb_hdrc_platform_data *plat, void *bdata, void *ctl_regs) @@ -428,12 +428,12 @@ int musb_register(struct musb_hdrc_platform_data *plat, void *bdata, struct musb **musbp; switch (plat->mode) { -#if defined(CONFIG_MUSB_HOST) && !defined(CONFIG_DM_USB) +#if defined(CONFIG_USB_MUSB_HOST) && !defined(CONFIG_DM_USB) case MUSB_HOST: musbp = &musb_host.host; break; #endif -#ifdef CONFIG_MUSB_GADGET +#ifdef CONFIG_USB_MUSB_GADGET case MUSB_PERIPHERAL: musbp = &gadget; break; diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c index 3a29b18..16a264a 100644 --- a/drivers/usb/musb-new/sunxi.c +++ b/drivers/usb/musb-new/sunxi.c @@ -200,6 +200,9 @@ static int sunxi_musb_enable(struct musb *musb) pr_debug("%s():\n", __func__); + musb_ep_select(musb->mregs, 0); + musb_writeb(musb->mregs, MUSB_FADDR, 0); + if (enabled) return 0; @@ -286,7 +289,7 @@ static struct musb_hdrc_config musb_config = { }; static struct musb_hdrc_platform_data musb_plat = { -#if defined(CONFIG_MUSB_HOST) +#if defined(CONFIG_USB_MUSB_HOST) .mode = MUSB_HOST, #else .mode = MUSB_PERIPHERAL, @@ -296,7 +299,7 @@ static struct musb_hdrc_platform_data musb_plat = { .platform_ops = &sunxi_musb_ops, }; -#ifdef CONFIG_MUSB_HOST +#ifdef CONFIG_USB_MUSB_HOST int musb_usb_probe(struct udevice *dev) { struct musb_host_data *host = dev_get_priv(dev); @@ -341,7 +344,7 @@ U_BOOT_DRIVER(usb_musb) = { void sunxi_musb_board_init(void) { -#ifdef CONFIG_MUSB_HOST +#ifdef CONFIG_USB_MUSB_HOST struct udevice *dev; /* diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile index 3c9ed98..bd2b7c5 100644 --- a/drivers/usb/musb/Makefile +++ b/drivers/usb/musb/Makefile @@ -5,8 +5,8 @@ # SPDX-License-Identifier: GPL-2.0+ # -obj-$(CONFIG_MUSB_HCD) += musb_hcd.o musb_core.o -obj-$(CONFIG_MUSB_UDC) += musb_udc.o musb_core.o +obj-$(CONFIG_USB_MUSB_HCD) += musb_hcd.o musb_core.o +obj-$(CONFIG_USB_MUSB_UDC) += musb_udc.o musb_core.o obj-$(CONFIG_USB_BLACKFIN) += blackfin_usb.o obj-$(CONFIG_USB_DAVINCI) += davinci.o obj-$(CONFIG_USB_OMAP3) += omap3.o diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 786909f..ea3996a 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c @@ -19,7 +19,7 @@ struct musb_regs *musbr; */ void musb_start(void) { -#if defined(CONFIG_MUSB_HCD) +#if defined(CONFIG_USB_MUSB_HCD) u8 devctl; u8 busctl; #endif @@ -32,7 +32,7 @@ void musb_start(void) /* put into basic highspeed mode and start session */ writeb(MUSB_POWER_HSENAB, &musbr->power); -#if defined(CONFIG_MUSB_HCD) +#if defined(CONFIG_USB_MUSB_HCD) /* Program PHY to use EXT VBUS if required */ if (musb_cfg.extvbus == 1) { busctl = musb_read_ulpi_buscontrol(musbr); @@ -81,7 +81,7 @@ void musb_configure_ep(const struct musb_epinfo *epinfo, u8 cnt) config_fifo(tx, idx, fifoaddr); csr = readw(&musbr->txcsr); -#if defined(CONFIG_MUSB_HCD) +#if defined(CONFIG_USB_MUSB_HCD) /* clear the data toggle bit */ writew(csr | MUSB_TXCSR_CLRDATATOG, &musbr->txcsr); #endif @@ -94,7 +94,7 @@ void musb_configure_ep(const struct musb_epinfo *epinfo, u8 cnt) config_fifo(rx, idx, fifoaddr); csr = readw(&musbr->rxcsr); -#if defined(CONFIG_MUSB_HCD) +#if defined(CONFIG_USB_MUSB_HCD) /* clear the data toggle bit */ writew(csr | MUSB_RXCSR_CLRDATATOG, &musbr->rxcsr); #endif diff --git a/drivers/usb/musb/musb_hcd.c b/drivers/usb/musb/musb_hcd.c index f0ba8aa..9a3b61a 100644 --- a/drivers/usb/musb/musb_hcd.c +++ b/drivers/usb/musb/musb_hcd.c @@ -117,7 +117,7 @@ static int wait_until_ep0_ready(struct usb_device *dev, u32 bit_mask) { u16 csr; int result = 1; - int timeout = CONFIG_MUSB_TIMEOUT; + int timeout = CONFIG_USB_MUSB_TIMEOUT; while (result > 0) { csr = readw(&musbr->txcsr); @@ -179,7 +179,7 @@ static int wait_until_ep0_ready(struct usb_device *dev, u32 bit_mask) static int wait_until_txep_ready(struct usb_device *dev, u8 ep) { u16 csr; - int timeout = CONFIG_MUSB_TIMEOUT; + int timeout = CONFIG_USB_MUSB_TIMEOUT; do { if (check_stall(ep, 1)) { @@ -211,7 +211,7 @@ static int wait_until_txep_ready(struct usb_device *dev, u8 ep) static int wait_until_rxep_ready(struct usb_device *dev, u8 ep) { u16 csr; - int timeout = CONFIG_MUSB_TIMEOUT; + int timeout = CONFIG_USB_MUSB_TIMEOUT; do { if (check_stall(ep, 0)) { diff --git a/drivers/usb/musb/musb_hcd.h b/drivers/usb/musb/musb_hcd.h index 0c8e75d..831957d 100644 --- a/drivers/usb/musb/musb_hcd.h +++ b/drivers/usb/musb/musb_hcd.h @@ -17,8 +17,8 @@ extern unsigned char new[]; #endif -#ifndef CONFIG_MUSB_TIMEOUT -# define CONFIG_MUSB_TIMEOUT 100000 +#ifndef CONFIG_USB_MUSB_TIMEOUT +# define CONFIG_USB_MUSB_TIMEOUT 100000 #endif /* This defines the endpoint number used for control transfers */ |