USB multi controller
Subsystems (14)
v4 cover USB multi controller
V4: Fixed build failures in fsl and mxs ehci code. Also rebased on the latest usb/master and did MAKEALL -a powerpc in addition to MAKEALL -a arm.
V3: Stephen ran into some problems applying this, as it seems my tree wasn't as clean as it should have been. Sorry for the inconvenience. This should now be fixed.
Hi all,
this is a follow up on the patch "USB: EHCI: Initialize multiple USB controllers at once" from Jim Lin. It takes some of the code but has undergone some heavy reworking.
When we remove the ifdef horror from the above mentioned patch it's mostly a big interface change to the usb subsystem. As this creates a lot of churn I've split this up into a series. Every patch is self contained so it doesn't break compiles and *should* not regress any functionality on it's own. At least the series is bisectable in case anything goes wrong. I've compile tested all the ARM configs.
Both the lowlevel usb and ehci interface change are backward compatible, so implementations that only use one controller can choose to ignore the new interface. All implementations are updated to work with the new function prototypes.
For Tegra I've included a patch to actually use the new ehci interface. Tom, Stephen, can I get an ACK from you for this, so Marek can take this through his USB tree?
All patches now rebased onto u-boot-usb/master.
Patch 3 also includes some cosmetic changes, to make the output of the usb commands more readable.
On my Colibri T20, with a total of 3 usb controllers of which 2 are enabled in the device tree, output now looks like this:
Tegra20 (Colibri) # usb start
(Re)start USB...
USB0: USB EHCI 1.00
scanning bus 0 for devices... 2 USB Device(s) found
USB1: USB EHCI 1.00
scanning bus 1 for devices... 2 USB Device(s) found
USB2: lowlevel init failed
scanning usb for storage devices... 1 Storage Device(s) found scanning usb for ethernet devices... 1 Ethernet Device(s) found
Tegra20 (Colibri) # usb tree
USB device tree:
1 Hub (480 Mb/s, 0mA)
| u-boot EHCI Host Controller
|
+-2 Mass Storage (480 Mb/s, 200mA)
SanDisk U3 Titanium 2845221DC342AE8F
3 Hub (480 Mb/s, 0mA)
| u-boot EHCI Host Controller
|
+-4 Vendor specific (480 Mb/s, 4mA)
ASIX Elec. Corp. AX88772B 000001
Lucas Stach (4):
usb: lowlevel interface change to support multiple controllers
usb: ehci: rework to take advantage of new lowlevel interface
usb: add support for multiple usb controllers
tegra20: port to new ehci interface
arch/arm/cpu/arm920t/s3c24x0/usb_ohci.c | 4 +- arch/arm/cpu/armv7/tegra20/usb.c | 15 +--- arch/arm/include/asm/arch-tegra20/usb.h | 4 +- arch/arm/include/asm/ehci-omap.h | 10 ++- arch/mips/cpu/mips32/au1x00/au1x00_usb_ohci.c | 4 +- arch/powerpc/cpu/mpc5xxx/usb_ohci.c | 4 +- arch/powerpc/cpu/ppc4xx/usb_ohci.c | 4 +- arch/sparc/cpu/leon3/usb_uhci.c | 4 +- arch/sparc/lib/bootm.c | 2 +- board/htkw/mcx/mcx.c | 6 +- board/mpl/common/usb_uhci.c | 4 +- board/technexion/twister/twister.c | 6 +- board/teejet/mt_ventoux/mt_ventoux.c | 6 +- board/ti/beagle/beagle.c | 6 +- board/ti/panda/panda.c | 6 +- common/cmd_usb.c | 16 +++- common/usb.c | 108 +++++++++++----------- common/usb_hub.c | 2 +- common/usb_storage.c | 2 +- drivers/usb/eth/usb_ether.c | 2 +- drivers/usb/host/ehci-armada100.c | 15 ++-- drivers/usb/host/ehci-atmel.c | 11 ++- drivers/usb/host/ehci-core.h | 29 ------ drivers/usb/host/ehci-exynos.c | 15 ++-- drivers/usb/host/ehci-fsl.c | 15 ++-- drivers/usb/host/ehci-hcd.c | 124 ++++++++++++++------------ drivers/usb/host/ehci-ixp4xx.c | 15 ++-- drivers/usb/host/ehci-marvell.c | 15 ++-- drivers/usb/host/ehci-mpc512x.c | 25 ++---- drivers/usb/host/ehci-mx5.c | 11 ++- drivers/usb/host/ehci-mx6.c | 11 ++- drivers/usb/host/ehci-mxc.c | 11 ++- drivers/usb/host/ehci-mxs.c | 20 +++-- drivers/usb/host/ehci-omap.c | 10 ++- drivers/usb/host/ehci-pci.c | 15 ++-- drivers/usb/host/ehci-ppc4xx.c | 11 ++- drivers/usb/host/ehci-tegra.c | 14 ++- drivers/usb/host/ehci-vct.c | 9 +- drivers/usb/host/ehci.h | 4 +- drivers/usb/host/isp116x-hcd.c | 4 +- drivers/usb/host/ohci-hcd.c | 4 +- drivers/usb/host/r8a66597-hcd.c | 4 +- drivers/usb/host/sl811-hcd.c | 4 +- drivers/usb/musb/musb_hcd.c | 4 +- include/usb.h | 10 ++- include/usb/mv_udc.h | 2 +- 46 Dateien ge?ndert, 309 Zeilen hinzugef?gt(+), 318 Zeilen entfernt(-) delete mode 100644 drivers/usb/host/ehci-core.h
Signature · 1 line
1.7.11.4
PATCH v4 1/4 usb: lowlevel interface change to support multiple controllers
Carry an index in the lowlevel usb functions to make specify the respective usb controller.
Also pass through an controller struct from lowlevel_init to the creation of the root usb device of this controller.
--- arch/arm/cpu/arm920t/s3c24x0/usb_ohci.c | 4 ++-- arch/mips/cpu/mips32/au1x00/au1x00_usb_ohci.c | 4 ++-- arch/powerpc/cpu/mpc5xxx/usb_ohci.c | 4 ++-- arch/powerpc/cpu/ppc4xx/usb_ohci.c | 4 ++-- arch/sparc/cpu/leon3/usb_uhci.c | 4 ++-- arch/sparc/lib/bootm.c | 2 +- board/mpl/common/usb_uhci.c | 4 ++-- common/usb.c | 10 ++++++---- common/usb_hub.c | 2 +- drivers/usb/host/ehci-hcd.c | 4 ++-- drivers/usb/host/isp116x-hcd.c | 4 ++-- drivers/usb/host/ohci-hcd.c | 4 ++-- drivers/usb/host/r8a66597-hcd.c | 4 ++-- drivers/usb/host/sl811-hcd.c | 4 ++-- drivers/usb/musb/musb_hcd.c | 4 ++-- include/usb.h | 10 +++++++--- include/usb/mv_udc.h | 2 +-
17 Dateien ge?ndert, 40 Zeilen hinzugef?gt(+), 34 Zeilen entfernt(-)
arch/arm/cpu/arm920t/s3c24x0/usb_ohci.c +2 -2
@@ -1659,7 +1659,7 @@ static void hc_release_ohci(struct ohci *ohci)*/ static char ohci_inited =0 ; -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) {struct s3c24x0_clock_power *clk_power =s3c24x0_get_base_clock_power ();struct s3c24x0_gpio *gpio =s3c24x0_get_base_gpio ();
@@ -1738,7 +1738,7 @@ int usb_lowlevel_init(void)return 0 ; } -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {struct s3c24x0_clock_power *clk_power =s3c24x0_get_base_clock_power ();
arch/mips/cpu/mips32/au1x00/au1x00_usb_ohci.c +2 -2
@@ -1565,7 +1565,7 @@ static void hc_release_ohci (ohci_t *ohci)*/ static char ohci_inited =0 ; -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) {u32 pin_func;u32 sys_freqctrl, sys_clksrc;
@@ -1707,7 +1707,7 @@ int usb_lowlevel_init(void)return -1 ; } -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {/* this gets called really early - before the controller has */ /* even been initialized! */
arch/powerpc/cpu/mpc5xxx/usb_ohci.c +2 -2
@@ -1561,7 +1561,7 @@ static void hc_release_ohci (ohci_t *ohci)*/ static char ohci_inited =0 ; -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) {/* Set the USB Clock */
@@ -1629,7 +1629,7 @@ int usb_lowlevel_init(void)return 0 ; } -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {/* this gets called really early - before the controller has */ /* even been initialized! */
arch/powerpc/cpu/ppc4xx/usb_ohci.c +2 -2
@@ -1566,7 +1566,7 @@ static void hc_release_ohci (ohci_t *ohci)*/ static char ohci_inited =0 ; -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) {memset (&gohci,0 ,sizeof (ohci_t));memset (&urb_priv,0 ,sizeof (urb_priv_t));
@@ -1624,7 +1624,7 @@ int usb_lowlevel_init(void)return 0 ; } -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {/* this gets called really early - before the controller has */ /* even been initialized! */
arch/sparc/cpu/leon3/usb_uhci.c +2 -2
@@ -706,7 +706,7 @@ void handle_usb_interrupt(void)/* init uhci */ -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) {unsigned char temp;ambapp_ahbdev ahbdev;
@@ -745,7 +745,7 @@ int usb_lowlevel_init(void)/* stop uhci */ -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {if (grusb_irq ==-1 )return 1 ;
arch/sparc/lib/bootm.c +1 -1
@@ -36,7 +36,7 @@ extern void srmmu_init_cpu(unsigned int entry);extern void prepare_bootargs (char *bootargs);#ifdef CONFIG_USB_UHCI -extern int usb_lowlevel_stop (void ); +extern int usb_lowlevel_stop (int index);#endif /* sparc kernel argument (the ROM vector) */
board/mpl/common/usb_uhci.c +2 -2
@@ -602,7 +602,7 @@ void handle_usb_interrupt(void)/* init uhci */ -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) {unsigned char temp;int busdevfunc;
@@ -632,7 +632,7 @@ int usb_lowlevel_init(void)/* stop uhci */ -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {if (irqvec==-1 )return 1 ;
common/usb.c +6 -4
@@ -76,6 +76,7 @@ static int running;static int asynch_allowed;char usb_started;/* flag for the started/stopped USB status */ +void *ctrl;/* goes away in a following commit, but don't break bisect */ /********************************************************************** * some forward declerations...
@@ -96,7 +97,7 @@ int usb_init(void)usb_hub_reset ();/* init low_level USB */ printf ("USB: " ); - result =usb_lowlevel_init (); + result =usb_lowlevel_init (0 , &ctrl);/* if lowlevel init is OK, scan the bus for devices * i.e. search HUBs and configure them */ if (result ==0 ) {
@@ -123,7 +124,7 @@ int usb_stop(void) asynch_allowed =1 ; usb_started =0 ;usb_hub_reset (); - res =usb_lowlevel_stop (); + res =usb_lowlevel_stop (0 ); }return res; }
@@ -754,7 +755,7 @@ struct usb_device *usb_get_dev_index(int index)/* returns a pointer of a new device structure or NULL, if * no device struct is available */ -struct usb_device *usb_alloc_new_device (void ) +struct usb_device *usb_alloc_new_device (void *controller) {int i;USB_PRINTF ("New Device %d\n" , dev_index);
@@ -768,6 +769,7 @@ struct usb_device *usb_alloc_new_device(void)for (i =0 ; i <USB_MAXCHILDREN ; i++) usb_dev[dev_index].children[i] =NULL ; usb_dev[dev_index].parent =NULL ; + usb_dev[dev_index].controller = controller; dev_index++;return &usb_dev[dev_index -1 ]; }
@@ -958,7 +960,7 @@ static void usb_scan_devices(void) } dev_index =0 ;/* device 0 is always present (root hub, so let it analyze) */ - dev =usb_alloc_new_device (); + dev =usb_alloc_new_device (ctrl);if (usb_new_device (dev))printf ("No USB Device found\n" );else
common/usb_hub.c +1 -1
@@ -244,7 +244,7 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)mdelay (200 );/* Allocate a new device struct for it */ - usb =usb_alloc_new_device (); + usb =usb_alloc_new_device (dev->controller);if (portstatus &USB_PORT_STAT_HIGH_SPEED ) usb->speed =USB_SPEED_HIGH ;
drivers/usb/host/ehci-hcd.c +2 -2
@@ -841,12 +841,12 @@ unknown:return -1 ; } -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {return ehci_hcd_stop (); } -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) {uint32_t reg;uint32_t cmd;
drivers/usb/host/isp116x-hcd.c +2 -2
@@ -1391,7 +1391,7 @@ int isp116x_check_id(struct isp116x *isp116x)return 0 ; } -int usb_lowlevel_init (void ) +int usb_lowlevel_init(int index, void **controller)) {struct isp116x *isp116x = &isp116x_dev;
@@ -1428,7 +1428,7 @@ int usb_lowlevel_init(void)return 0 ; } -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {struct isp116x *isp116x = &isp116x_dev;
drivers/usb/host/ohci-hcd.c +2 -2
@@ -1865,7 +1865,7 @@ static void hc_release_ohci(ohci_t *ohci)*/ static char ohci_inited =0 ; -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) {#ifdef CONFIG_PCI_OHCI pci_dev_t pdev;
@@ -1971,7 +1971,7 @@ int usb_lowlevel_init(void)return 0 ; } -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {/* this gets called really early - before the controller has */ /* even been initialized! */
drivers/usb/host/r8a66597-hcd.c +2 -2
@@ -908,7 +908,7 @@ int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,return 0 ; } -int usb_lowlevel_init (void ) +int usb_lowlevel_init(int index, void **controller)) {struct r8a66597 *r8a66597 = &gr8a66597;
@@ -931,7 +931,7 @@ int usb_lowlevel_init(void)return 0 ; } -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {disable_controller (&gr8a66597);
drivers/usb/host/sl811-hcd.c +2 -2
@@ -210,14 +210,14 @@ static int sl811_hc_reset(void)return 1 ; } -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) { root_hub_devnum =0 ;sl811_hc_reset ();return 0 ; } -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {sl811_hc_reset ();return 0 ;
drivers/usb/musb/musb_hcd.c +2 -2
@@ -1092,7 +1092,7 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,/* * This function initializes the usb controller module. */ -int usb_lowlevel_init (void ) +int usb_lowlevel_init (int index,void **controller) {u8 power;u32 timeout;
@@ -1144,7 +1144,7 @@ int usb_lowlevel_init(void)/* * This function stops the operation of the davinci usb module. */ -int usb_lowlevel_stop (void ) +int usb_lowlevel_stop (int index) {/* Reset the USB module */ musb_platform_deinit ();
include/usb.h +7 -3
@@ -134,6 +134,8 @@ struct usb_device {int portnr;struct usb_device *parent;struct usb_device *children[USB_MAXCHILDREN ]; + +void *controller;/* hardware controller private data */ };/**********************************************************************
@@ -147,8 +149,9 @@ struct usb_device {defined (CONFIG_USB_OMAP3 ) ||defined (CONFIG_USB_DA8XX ) || \ defined(CONFIG_USB_BLACKFIN) || defined(CONFIG_USB_AM35X) -int usb_lowlevel_init (void ); -int usb_lowlevel_stop (void ); +int usb_lowlevel_init (int index,void **controller); +int usb_lowlevel_stop (int index); +int submit_bulk_msg (struct usb_device *dev,unsigned long pipe,void *buffer,int transfer_len); int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
@@ -373,7 +376,8 @@ void usb_hub_reset(void);int hub_port_reset (struct usb_device *dev,int port,unsigned short *portstat); -struct usb_device *usb_alloc_new_device (void ); +struct usb_device *usb_alloc_new_device (void *controller); +int usb_new_device (struct usb_device *dev);#endif /*_USB_H_ */
include/usb/mv_udc.h +1 -1
@@ -147,5 +147,5 @@ struct ept_queue_item {#define INFO_BUFFER_ERROR (1 << 5)#define INFO_TX_ERROR (1 << 3) -extern int usb_lowlevel_init (void ); +extern int usb_lowlevel_init (int index,void **controller);#endif /* __MV_UDC_H__ */
Signature · 1 line
1.7.11.4
PATCH v4 2/4 usb: ehci: rework to take advantage of new lowlevel interface
In reply to Lucas StachKill off ehci-core.h
It was used to specify some static controller data. To support more than one controller being active at any time we have to carry the controller data ourselfes. Change the ehci interface accordingly.
NOTE: OMAP implemented the ehci stuff a bit backwards and should be fixed to do the same thing as other platforms. But the change for now is at least compile clean.
---
v2: fix build failures in ehci-fsl.c and ehci-mxs.c
--- arch/arm/include/asm/ehci-omap.h | 10 ++- board/htkw/mcx/mcx.c | 6 +- board/technexion/twister/twister.c | 6 +- board/teejet/mt_ventoux/mt_ventoux.c | 6 +- board/ti/beagle/beagle.c | 6 +- board/ti/panda/panda.c | 6 +- drivers/usb/host/ehci-armada100.c | 15 ++--- drivers/usb/host/ehci-atmel.c | 11 ++-- drivers/usb/host/ehci-core.h | 29 --------- drivers/usb/host/ehci-exynos.c | 15 ++--- drivers/usb/host/ehci-fsl.c | 15 ++--- drivers/usb/host/ehci-hcd.c | 120 +++++++++++++++++++---------------- drivers/usb/host/ehci-ixp4xx.c | 15 ++--- drivers/usb/host/ehci-marvell.c | 15 ++--- drivers/usb/host/ehci-mpc512x.c | 25 +++----- drivers/usb/host/ehci-mx5.c | 11 ++-- drivers/usb/host/ehci-mx6.c | 11 ++-- drivers/usb/host/ehci-mxc.c | 11 ++-- drivers/usb/host/ehci-mxs.c | 20 ++++-- drivers/usb/host/ehci-omap.c | 10 +-- drivers/usb/host/ehci-pci.c | 15 ++--- drivers/usb/host/ehci-ppc4xx.c | 11 ++-- drivers/usb/host/ehci-tegra.c | 9 ++- drivers/usb/host/ehci-vct.c | 9 ++- drivers/usb/host/ehci.h | 4 +- 25 Dateien ge?ndert, 195 Zeilen hinzugef?gt(+), 216 Zeilen entfernt(-) delete mode 100644 drivers/usb/host/ehci-core.h
arch/arm/include/asm/ehci-omap.h +9 -1
@@ -136,7 +136,15 @@ struct omap_ehci { u32 insreg08; /* 0xb0 */ }; -int omap_ehci_hcd_init (struct omap_usbhs_board_data *usbhs_pdata); +/* +* FIXME: forward declaration of this structs needed because omap got the +* ehci implementation backwards. move out ehci_hcd_x from board files +*/ +struct ehci_hccr ; +struct ehci_hcor ; + +int omap_ehci_hcd_init (struct omap_usbhs_board_data *usbhs_pdata, +struct ehci_hccr **hccr,struct ehci_hcor **hcor);int omap_ehci_hcd_stop (void );#endif /* _OMAP_COMMON_EHCI_H_ */
board/htkw/mcx/mcx.c +3 -3
@@ -46,12 +46,12 @@ static struct omap_usbhs_board_data usbhs_bdata = { .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, }; -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) { -return omap_ehci_hcd_init (&usbhs_bdata); +return omap_ehci_hcd_init (&usbhs_bdata, hccr, hcor); } -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return omap_ehci_hcd_stop (); }
board/technexion/twister/twister.c +3 -3
@@ -67,12 +67,12 @@ static struct omap_usbhs_board_data usbhs_bdata = { .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, }; -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) { -return omap_ehci_hcd_init (&usbhs_bdata); +return omap_ehci_hcd_init (&usbhs_bdata, hccr, hcor); } -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return omap_ehci_hcd_stop (); }
board/teejet/mt_ventoux/mt_ventoux.c +3 -3
@@ -67,12 +67,12 @@ static struct omap_usbhs_board_data usbhs_bdata = { .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, }; -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) { -return omap_ehci_hcd_init (&usbhs_bdata); +return omap_ehci_hcd_init (&usbhs_bdata, hccr, hcor); } -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return omap_ehci_hcd_stop (); }
board/ti/beagle/beagle.c +3 -3
@@ -502,12 +502,12 @@ static struct omap_usbhs_board_data usbhs_bdata = { .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED }; -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) { -return omap_ehci_hcd_init (&usbhs_bdata); +return omap_ehci_hcd_init (&usbhs_bdata, hccr, hcor); } -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return omap_ehci_hcd_stop (); }
board/ti/panda/panda.c +3 -3
@@ -192,7 +192,7 @@ static struct omap_usbhs_board_data usbhs_bdata = { .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, }; -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {int ret;unsigned int utmi_clk;
@@ -202,14 +202,14 @@ int ehci_hcd_init(void) utmi_clk |=HSUSBHOST_CLKCTRL_CLKSEL_UTMI_P1_MASK ;sr32 ((void *)CM_L3INIT_HSUSBHOST_CLKCTRL ,0 ,32 , utmi_clk); - ret =omap_ehci_hcd_init (&usbhs_bdata); + ret =omap_ehci_hcd_init (&usbhs_bdata, hccr, hcor);if (ret <0 )return ret;return 0 ; } -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return omap_ehci_hcd_stop (); }
drivers/usb/host/ehci-armada100.c +7 -8
@@ -31,7 +31,6 @@#include <asm/io.h> #include <usb.h> #include "ehci.h" -#include "ehci-core.h" #include <asm/arch/cpu.h> #include <asm/arch/armada100.h> #include <asm/arch/utmi-armada100.h>
@@ -39,18 +38,18 @@/* * EHCI host controller init */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {if (utmi_init () <0 )return -1 ; - hccr = (struct ehci_hccr *)(ARMD1_USB_HOST_BASE +0x100 ); - hcor = (struct ehci_hcor *)((uint32_t ) hccr - +HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)(ARMD1_USB_HOST_BASE +0x100 ); + *hcor = (struct ehci_hcor *)((uint32_t ) *hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));debug ("armada100-ehci: init hccr %x and hcor %x hc_length %d\n" , - (uint32_t )hccr, (uint32_t )hcor, - (uint32_t )HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + (uint32_t )*hccr, (uint32_t )*hcor, + (uint32_t )HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));return 0 ; }
@@ -58,7 +57,7 @@ int ehci_hcd_init(void)/* * EHCI host controller stop */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci-atmel.c +5 -6
@@ -31,14 +31,13 @@#include <asm/arch/clk.h> #include "ehci.h" -#include "ehci-core.h" /* Enable UTMI PLL time out 500us * 10 times as datasheet specified */ #define EN_UPLL_TIMEOUT 500UL -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC ;ulong start_time, tmp_time;
@@ -58,14 +57,14 @@ int ehci_hcd_init(void)/* Enable USB Host clock */ writel (1 <<ATMEL_ID_UHPHS , &pmc->pcer); - hccr = (struct ehci_hccr *)ATMEL_BASE_EHCI ; - hcor = (struct ehci_hcor *)((uint32_t )hccr + -HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)ATMEL_BASE_EHCI ; + *hcor = (struct ehci_hcor *)((uint32_t )*hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));return 0 ; } -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC ;ulong start_time, tmp_time;
drivers/usb/host/ehci-core.h deleted +0 -29
@@ -1,29 +0,0 @@ -/*- -* Copyright (c) 2007-2008, Juniper Networks, Inc. -* Copyright (c) 2008, Excito Elektronik i Sk?ne AB -* All rights reserved. -* -* 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 version 2 of -* the License. -* -* 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 -*/ - -#ifndef USB_EHCI_CORE_H -#define USB_EHCI_CORE_H - -extern int rootdev; -extern struct ehci_hccr *hccr; -extern volatile struct ehci_hcor *hcor; - -#endif
drivers/usb/host/ehci-exynos.c +7 -8
@@ -27,7 +27,6 @@#include <asm/arch/system.h> #include <asm/arch/power.h> #include "ehci.h" -#include "ehci-core.h" /* Setup the EHCI host controller. */ static void setup_usb_phy (struct exynos_usb_phy *usb)
@@ -85,20 +84,20 @@ static void reset_usb_phy(struct exynos_usb_phy *usb)* Create the appropriate control structures to manage * a new EHCI host controller. */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {struct exynos_usb_phy *usb; usb = (struct exynos_usb_phy *)samsung_get_base_usb_phy ();setup_usb_phy (usb); - hccr = (struct ehci_hccr *)samsung_get_base_usb_ehci (); - hcor = (struct ehci_hcor *)((uint32_t ) hccr - +HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)samsung_get_base_usb_ehci (); + *hcor = (struct ehci_hcor *)((uint32_t ) *hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));debug ("Exynos5-ehci: init hccr %x and hcor %x hc_length %d\n" , - (uint32_t )hccr, (uint32_t )hcor, - (uint32_t )HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + (uint32_t )*hccr, (uint32_t )*hcor, + (uint32_t )HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));return 0 ; }
@@ -107,7 +106,7 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the EHCI host controller. */ -int ehci_hcd_stop () +int ehci_hcd_stop (int index) {struct exynos_usb_phy *usb;
drivers/usb/host/ehci-fsl.c +7 -8
@@ -29,7 +29,6 @@#include <hwconfig.h> #include "ehci.h" -#include "ehci-core.h" /* * Create the appropriate control structures to manage
@@ -37,7 +36,7 @@* * Excerpts from linux ehci fsl driver. */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {struct usb_ehci *ehci;const char *phy_type =NULL ;
@@ -49,9 +48,9 @@ int ehci_hcd_init(void)#endif ehci = (struct usb_ehci *)CONFIG_SYS_FSL_USB_ADDR ; - hccr = (struct ehci_hccr *)((uint32_t )&ehci->caplength); - hcor = (struct ehci_hcor *)((uint32_t ) hccr + -HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)((uint32_t )&ehci->caplength); + *hcor = (struct ehci_hcor *)((uint32_t ) *hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));/* Set to Host mode */ setbits_le32 (&ehci->usbmode,CM_HOST );
@@ -82,14 +81,14 @@ int ehci_hcd_init(void)setbits_be32 (&ehci->control,UTMI_PHY_EN );udelay (1000 );/* delay required for PHY Clk to appear */ #endif -out_le32 (&(hcor->or_portsc[0 ]),PORT_PTS_UTMI ); +out_le32 (&(*hcor)->or_portsc[0 ],PORT_PTS_UTMI ); }else {#if defined(CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY )clrbits_be32 (&ehci->control,UTMI_PHY_EN );setbits_be32 (&ehci->control,PHY_CLK_SEL_ULPI );udelay (1000 );/* delay required for PHY Clk to appear */ #endif -out_le32 (&(hcor->or_portsc[0 ]),PORT_PTS_ULPI ); +out_le32 (&(*hcor)->or_portsc[0 ],PORT_PTS_ULPI ); }/* Enable interface. */
@@ -108,7 +107,7 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the the EHCI host controller. */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci-hcd.c +66 -54
330 lines not on this page · raw message
drivers/usb/host/ehci-ixp4xx.c +7 -8
@@ -23,20 +23,19 @@#include <usb.h> #include "ehci.h" -#include "ehci-core.h" /* * Create the appropriate control structures to manage * a new EHCI host controller. */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) { - hccr = (struct ehci_hccr *)(0xcd000100 ); - hcor = (struct ehci_hcor *)((uint32_t ) hccr - +HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)(0xcd000100 ); + *hcor = (struct ehci_hcor *)((uint32_t ) *hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));printf ("IXP4XX init hccr %x and hcor %x hc_length %d\n" , - (uint32_t )hccr, (uint32_t )hcor, - (uint32_t )HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + (uint32_t )*hccr, (uint32_t )*hcor, + (uint32_t )HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));return 0 ; }
@@ -44,7 +43,7 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the the EHCI host controller. */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci-marvell.c +7 -8
@@ -26,7 +26,6 @@#include <asm/io.h> #include <usb.h> #include "ehci.h" -#include "ehci-core.h" #include <asm/arch/cpu.h> #if defined(CONFIG_KIRKWOOD )
@@ -91,17 +90,17 @@ static void usb_brg_adrdec_setup(void)* Create the appropriate control structures to manage * a new EHCI host controller. */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {usb_brg_adrdec_setup (); - hccr = (struct ehci_hccr *)(MVUSB0_BASE +0x100 ); - hcor = (struct ehci_hcor *)((uint32_t ) hccr - +HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)(MVUSB0_BASE +0x100 ); + *hcor = (struct ehci_hcor *)((uint32_t ) *hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));debug ("ehci-marvell: init hccr %x and hcor %x hc_length %d\n" , - (uint32_t )hccr, (uint32_t )hcor, - (uint32_t )HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + (uint32_t )*hccr, (uint32_t )*hcor, + (uint32_t )HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));return 0 ; }
@@ -110,7 +109,7 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the the EHCI host controller. */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci-mpc512x.c +9 -16
@@ -33,7 +33,6 @@#include <usb/ehci-fsl.h> #include "ehci.h" -#include "ehci-core.h" static void fsl_setup_phy (volatile struct ehci_hcor *);static void fsl_platform_set_host_mode (volatile struct usb_ehci *ehci);
@@ -46,21 +45,21 @@ static void usb_platform_dr_init(volatile struct usb_ehci *ehci);* This code is derived from EHCI FSL USB Linux driver for MPC5121 * */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {volatile struct usb_ehci *ehci;/* Hook the memory mapped registers for EHCI-Controller */ ehci = (struct usb_ehci *)CONFIG_SYS_FSL_USB_ADDR ; - hccr = (struct ehci_hccr *)((uint32_t )&(ehci->caplength)); - hcor = (struct ehci_hcor *)((uint32_t ) hccr + -HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)((uint32_t )&(ehci->caplength)); + *hcor = (struct ehci_hcor *)((uint32_t ) *hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));/* configure interface for UTMI_WIDE */ usb_platform_dr_init (ehci);/* Init Phy USB0 to UTMI+ */ -fsl_setup_phy (hcor); +fsl_setup_phy (*hcor);/* Set to host mode */ fsl_platform_set_host_mode (ehci);
@@ -89,20 +88,14 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the the EHCI host controller. */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {volatile struct usb_ehci *ehci;int exit_status =0 ; -if (hcor) { -/* Unhook struct */ - hccr =NULL ; - hcor =NULL ; - -/* Reset the USB controller */ - ehci = (struct usb_ehci *)CONFIG_SYS_FSL_USB_ADDR ; - exit_status =reset_usb_controller (ehci); - } +/* Reset the USB controller */ + ehci = (struct usb_ehci *)CONFIG_SYS_FSL_USB_ADDR ; + exit_status =reset_usb_controller (ehci);return exit_status; }
drivers/usb/host/ehci-mx5.c +5 -6
@@ -25,7 +25,6 @@#include <asm/arch/iomux.h> #include "ehci.h" -#include "ehci-core.h" #define MX5_USBOTHER_REGS_OFFSET 0x800
@@ -206,7 +205,7 @@ void __board_ehci_hcd_postinit(struct usb_ehci *ehci, int port)void board_ehci_hcd_postinit (struct usb_ehci *ehci,int port) __attribute((weak,alias ("__board_ehci_hcd_postinit" ))); -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {struct usb_ehci *ehci;#ifdef CONFIG_MX53
@@ -230,9 +229,9 @@ int ehci_hcd_init(void) ehci = (struct usb_ehci *)(OTG_BASE_ADDR + (0x200 *CONFIG_MXC_USB_PORT )); - hccr = (struct ehci_hccr *)((uint32_t )&ehci->caplength); - hcor = (struct ehci_hcor *)((uint32_t )hccr + -HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)((uint32_t )&ehci->caplength); + *hcor = (struct ehci_hcor *)((uint32_t )*hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));setbits_le32 (&ehci->usbmode,CM_HOST );__raw_writel (CONFIG_MXC_USB_PORTSC , &ehci->portsc);
@@ -247,7 +246,7 @@ int ehci_hcd_init(void)return 0 ; } -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci-mx6.c +5 -6
@@ -25,7 +25,6 @@#include <asm/imx-common/iomux-v3.h> #include "ehci.h" -#include "ehci-core.h" #define USB_OTGREGS_OFFSET 0x000#define USB_H1REGS_OFFSET 0x200
@@ -160,7 +159,7 @@ static void usbh1_oc_config(void)__raw_writel (val, usbother_base +USB_H1_CTRL_OFFSET ); } -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {struct usb_ehci *ehci;
@@ -182,9 +181,9 @@ int ehci_hcd_init(void) ehci = (struct usb_ehci *)(USBOH3_USB_BASE_ADDR + (0x200 *CONFIG_MXC_USB_PORT )); - hccr = (struct ehci_hccr *)((uint32_t )&ehci->caplength); - hcor = (struct ehci_hcor *)((uint32_t )hccr + -HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)((uint32_t )&ehci->caplength); + *hcor = (struct ehci_hcor *)((uint32_t )*hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));setbits_le32 (&ehci->usbmode,CM_HOST );__raw_writel (CONFIG_MXC_USB_PORTSC , &ehci->portsc);
@@ -195,7 +194,7 @@ int ehci_hcd_init(void)return 0 ; } -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci-mxc.c +5 -6
@@ -25,7 +25,6 @@#include <errno.h> #include "ehci.h" -#include "ehci-core.h" #define USBCTRL_OTGBASE_OFFSET 0x600
@@ -106,7 +105,7 @@ static int mxc_set_usbcontrol(int port, unsigned int flags)return 0 ; } -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {struct usb_ehci *ehci;#ifdef CONFIG_MX31
@@ -121,9 +120,9 @@ int ehci_hcd_init(void) ehci = (struct usb_ehci *)(IMX_USB_BASE + (0x200 *CONFIG_MXC_USB_PORT )); - hccr = (struct ehci_hccr *)((uint32_t )&ehci->caplength); - hcor = (struct ehci_hcor *)((uint32_t ) hccr + -HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)((uint32_t )&ehci->caplength); + *hcor = (struct ehci_hcor *)((uint32_t ) *hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));setbits_le32 (&ehci->usbmode,CM_HOST );__raw_writel (CONFIG_MXC_USB_PORTSC , &ehci->portsc);mxc_set_usbcontrol (CONFIG_MXC_USB_PORT ,CONFIG_MXC_USB_FLAGS );
@@ -137,7 +136,7 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the the EHCI host controller. */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci-mxs.c +13 -7
@@ -27,7 +27,6 @@#include <asm/arch/regs-usb.h> #include <asm/arch/regs-usbphy.h> -#include "ehci-core.h" #include "ehci.h" #if (CONFIG_EHCI_MXS_PORT !=0 ) && (CONFIG_EHCI_MXS_PORT !=1 )
@@ -70,7 +69,7 @@ int mxs_ehci_get_port(struct ehci_mxs *mxs_usb, int port)#define HW_DIGCTL_CTRL_USB0_CLKGATE (1 << 2)#define HW_DIGCTL_CTRL_USB1_CLKGATE (1 << 16) -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {int ret;
@@ -107,28 +106,35 @@ int ehci_hcd_init(void) &ehci_mxs.phy_regs->hw_usbphy_ctrl_set); usb_base = ((uint32_t )ehci_mxs.usb_regs) +0x100 ; - hccr = (struct ehci_hccr *)usb_base; + *hccr = (struct ehci_hccr *)usb_base; - cap_base =ehci_readl (&hccr->cr_capbase); - hcor = (struct ehci_hcor *)(usb_base +HC_LENGTH (cap_base)); + cap_base =ehci_readl (&(*hccr)->cr_capbase); + *hcor = (struct ehci_hcor *)(usb_base +HC_LENGTH (cap_base));return 0 ; } -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {int ret; -uint32_t tmp; +uint32_t usb_base, cap_base, tmp;struct mxs_register_32 *digctl_ctrl = (struct mxs_register_32 *)HW_DIGCTL_CTRL ;struct mxs_clkctrl_regs *clkctrl_regs = (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE ; +struct ehci_hccr *hccr; +struct ehci_hcor *hcor; ret =mxs_ehci_get_port (&ehci_mxs,CONFIG_EHCI_MXS_PORT );if (ret)return ret;/* Stop the USB port */ + usb_base = ((uint32_t )ehci_mxs.usb_regs) +0x100 ; + hccr = (struct ehci_hccr *)usb_base; + cap_base =ehci_readl (&hccr->cr_capbase); + hcor = (struct ehci_hcor *)(usb_base +HC_LENGTH (cap_base)); + tmp =ehci_readl (&hcor->or_usbcmd); tmp &= ~CMD_RUN ;ehci_writel (tmp, &hcor->or_usbcmd);
drivers/usb/host/ehci-omap.c +6 -4
@@ -33,7 +33,8 @@#include <asm/gpio.h> #include <asm/arch/ehci.h> #include <asm/ehci-omap.h> -#include "ehci-core.h" + +#include "ehci.h" static struct omap_uhh *const uhh = (struct omap_uhh *)OMAP_UHH_BASE ;static struct omap_usbtll *const usbtll = (struct omap_usbtll *)OMAP_USBTLL_BASE ;
@@ -155,7 +156,8 @@ int omap_ehci_hcd_stop(void)* Based on "drivers/usb/host/ehci-omap.c" from Linux 3.1 * See there for additional Copyrights. */ -int omap_ehci_hcd_init (struct omap_usbhs_board_data *usbhs_pdata) +int omap_ehci_hcd_init (struct omap_usbhs_board_data *usbhs_pdata, +struct ehci_hccr **hccr,struct ehci_hcor **hcor) {int ret;unsigned int i, reg =0 , rev =0 ;
@@ -246,8 +248,8 @@ int omap_ehci_hcd_init(struct omap_usbhs_board_data *usbhs_pdata)if (is_ehci_phy_mode (usbhs_pdata->port_mode[i]))omap_ehci_soft_phy_reset (i); - hccr = (struct ehci_hccr *)(OMAP_EHCI_BASE ); - hcor = (struct ehci_hcor *)(OMAP_EHCI_BASE +0x10 ); + *hccr = (struct ehci_hccr *)(OMAP_EHCI_BASE ); + *hcor = (struct ehci_hcor *)(OMAP_EHCI_BASE +0x10 );debug ("OMAP EHCI init done\n" );return 0 ;
drivers/usb/host/ehci-pci.c +7 -8
@@ -23,7 +23,6 @@#include <usb.h> #include "ehci.h" -#include "ehci-core.h" #ifdef CONFIG_PCI_EHCI_DEVICE static struct pci_device_id ehci_pci_ids[] = {
@@ -39,7 +38,7 @@ static struct pci_device_id ehci_pci_ids[] = {* Create the appropriate control structures to manage * a new EHCI host controller. */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {pci_dev_t pdev;
@@ -49,14 +48,14 @@ int ehci_hcd_init(void)return -1 ; } - hccr = (struct ehci_hccr *)pci_map_bar (pdev, + *hccr = (struct ehci_hccr *)pci_map_bar (pdev,PCI_BASE_ADDRESS_0 ,PCI_REGION_MEM ); - hcor = (struct ehci_hcor *)((uint32_t ) hccr + -HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hcor = (struct ehci_hcor *)((uint32_t ) *hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));debug ("EHCI-PCI init hccr 0x%x and hcor 0x%x hc_length %d\n" , - (uint32_t )hccr, (uint32_t )hcor, - (uint32_t )HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + (uint32_t )*hccr, (uint32_t )*hcor, + (uint32_t )HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));return 0 ; }
@@ -65,7 +64,7 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the the EHCI host controller. */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci-ppc4xx.c +5 -6
@@ -23,17 +23,16 @@#include <usb.h> #include "ehci.h" -#include "ehci-core.h" /* * Create the appropriate control structures to manage * a new EHCI host controller. */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) { - hccr = (struct ehci_hccr *)(CONFIG_SYS_PPC4XX_USB_ADDR ); - hcor = (struct ehci_hcor *)((uint32_t ) hccr + -HC_LENGTH (ehci_readl (&hccr->cr_capbase))); + *hccr = (struct ehci_hccr *)(CONFIG_SYS_PPC4XX_USB_ADDR ); + *hcor = (struct ehci_hcor *)((uint32_t ) *hccr + +HC_LENGTH (ehci_readl (&(*hccr)->cr_capbase)));return 0 ; }
@@ -41,7 +40,7 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the the EHCI host controller. */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci-tegra.c +4 -5
@@ -24,7 +24,6 @@#include <usb.h> #include "ehci.h" -#include "ehci-core.h" #include <asm/errno.h> #include <asm/arch/usb.h>
@@ -50,7 +49,7 @@ void ehci_powerup_fixup(uint32_t *status_reg, uint32_t *reg)* Create the appropriate control structures to manage * a new EHCI host controller. */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {u32 our_hccr, our_hcor;
@@ -61,8 +60,8 @@ int ehci_hcd_init(void)if (tegrausb_start_port (0 , &our_hccr, &our_hcor))return -1 ; - hccr = (struct ehci_hccr *)our_hccr; - hcor = (struct ehci_hcor *)our_hcor; + *hccr = (struct ehci_hccr *)our_hccr; + *hcor = (struct ehci_hcor *)our_hcor;return 0 ; }
@@ -71,7 +70,7 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the the EHCI host controller. */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {tegrausb_stop_port ();return 0 ;
drivers/usb/host/ehci-vct.c +4 -5
@@ -21,7 +21,6 @@#include <usb.h> #include "ehci.h" -#include "ehci-core.h" int vct_ehci_hcd_init (u32 *hccr,u32 *hcor);
@@ -29,7 +28,7 @@ int vct_ehci_hcd_init(u32 *hccr, u32 *hcor);* Create the appropriate control structures to manage * a new EHCI host controller. */ -int ehci_hcd_init (void ) +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor) {int ret;u32 vct_hccr;
@@ -42,8 +41,8 @@ int ehci_hcd_init(void)if (ret)return ret; - hccr = (struct ehci_hccr *)vct_hccr; - hcor = (struct ehci_hcor *)vct_hcor; + *hccr = (struct ehci_hccr *)vct_hccr; + *hcor = (struct ehci_hcor *)vct_hcor;return 0 ; }
@@ -52,7 +51,7 @@ int ehci_hcd_init(void)* Destroy the appropriate control structures corresponding * the the EHCI host controller. */ -int ehci_hcd_stop (void ) +int ehci_hcd_stop (int index) {return 0 ; }
drivers/usb/host/ehci.h +2 -2
@@ -249,7 +249,7 @@ struct QH { };/* Low level init functions */ -int ehci_hcd_init (void ); -int ehci_hcd_stop (void ); +int ehci_hcd_init (int index,struct ehci_hccr **hccr,struct ehci_hcor **hcor); +int ehci_hcd_stop (int index);#endif /* USB_EHCI_H */
Signature · 1 line
1.7.11.4
PATCH v4 3/4 usb: add support for multiple usb controllers
In reply to Lucas StachAllows to initialize more than one USB controller at once.
v2: print message when controller stop fails
--- common/cmd_usb.c | 16 +++++-- common/usb.c | 106 +++++++++++++++++++++++--------------------- common/usb_storage.c | 2 +- drivers/usb/eth/usb_ether.c | 2 +-
4 Dateien ge?ndert, 70 Zeilen hinzugef?gt(+), 56 Zeilen entfernt(-)
common/cmd_usb.c +12 -4
@@ -517,8 +517,7 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])bootstage_mark_name (BOOTSTAGE_ID_USB_START ,"usb_start" );usb_stop ();printf ("(Re)start USB...\n" ); - i =usb_init (); -if (i >=0 ) { +if (usb_init () >=0 ) {#ifdef CONFIG_USB_STORAGE /* try to recognize storage devices immediately */ usb_stor_curr_dev =usb_stor_scan (1 );
@@ -527,6 +526,9 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])/* try to recognize ethernet devices immediately */ usb_ether_curr_dev =usb_host_eth_scan (1 );#endif +#ifdef CONFIG_USB_KEYBOARD +drv_usb_kbd_init (); +#endif }return 0 ; }
@@ -553,8 +555,14 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])return 1 ; }if (strncmp (argv[1 ],"tree" ,4 ) ==0 ) { -printf ("\nDevice Tree:\n" ); -usb_show_tree (usb_get_dev_index (0 )); +puts ("USB device tree:\n" ); +for (i =0 ; i <USB_MAX_DEVICE ; i++) { + dev =usb_get_dev_index (i); +if (dev ==NULL ) +break ; +if (dev->parent ==NULL ) +usb_show_tree (dev); + }return 0 ; }if (strncmp (argv[1 ],"inf" ,3 ) ==0 ) {
common/usb.c +56 -50
152 lines not on this page · raw message
common/usb_storage.c +1 -1
@@ -244,7 +244,7 @@ int usb_stor_scan(int mode)struct usb_device *dev;if (mode ==1 ) -printf (" scanning bus for storage devices... " ); +printf (" scanning usb for storage devices... " );usb_disable_asynch (1 );/* asynch transfer not allowed */
drivers/usb/eth/usb_ether.c +1 -1
@@ -123,7 +123,7 @@ int usb_host_eth_scan(int mode)if (mode ==1 ) -printf (" scanning bus for ethernet devices... " ); +printf (" scanning usb for ethernet devices... " ); old_async =usb_disable_asynch (1 );/* asynch transfer not allowed */
Signature · 1 line
1.7.11.4
PATCH v4 4/4 tegra20: port to new ehci interface
In reply to Lucas StachEHCI interface now supports more than one controller. Wire up our usb functions to use this new interface.
--- arch/arm/cpu/armv7/tegra20/usb.c | 15 ++++----------- arch/arm/include/asm/arch-tegra20/usb.h | 4 ++-- drivers/usb/host/ehci-tegra.c | 5 ++---
3 Dateien ge?ndert, 8 Zeilen hinzugef?gt(+), 16 Zeilen entfernt(-)
arch/arm/cpu/armv7/tegra20/usb.c +4 -11
@@ -77,7 +77,6 @@ struct fdt_usb {static struct fdt_usb port[USB_PORTS_MAX ];/* List of valid USB ports */ static unsigned port_count;/* Number of available ports */ -static int port_current;/* Current port (-1 = none) */ /* * This table has USB timing parameters for each Oscillator frequency we
@@ -346,30 +345,25 @@ static int add_port(struct fdt_usb *config, const u32 timing[])return 0 ; } -int tegrausb_start_port (unsigned portnum,u32 *hccr,u32 *hcor) +int tegrausb_start_port (int portnum,u32 *hccr,u32 *hcor) {struct usb_ctlr *usbctlr;if (portnum >= port_count)return -1 ; -tegrausb_stop_port ();set_host_mode (&port[portnum]); usbctlr = port[portnum].reg; *hccr = (u32)&usbctlr->cap_length; *hcor = (u32)&usbctlr->usb_cmd; - port_current = portnum;return 0 ; } -int tegrausb_stop_port (void ) +int tegrausb_stop_port (int portnum) {struct usb_ctlr *usbctlr; -if (port_current ==-1 ) -return -1 ; - - usbctlr = port[port_current].reg; + usbctlr = port[portnum].reg;/* Stop controller */ writel (0 , &usbctlr->usb_cmd);
@@ -378,7 +372,7 @@ int tegrausb_stop_port(void)/* Initiate controller reset */ writel (2 , &usbctlr->usb_cmd);udelay (1000 ); - port_current =-1 ; +return 0 ; }
@@ -454,7 +448,6 @@ int board_usb_init(const void *blob)return -1 ;set_host_mode (&config); } - port_current =-1 ;return 0 ; }
arch/arm/include/asm/arch-tegra20/usb.h +2 -2
@@ -240,13 +240,13 @@ int board_usb_init(const void *blob);* @param hcor returns start address of EHCI HCOR registers * @return 0 if ok, -1 on error (generally invalid port number) */ -int tegrausb_start_port (unsigned portnum,u32 *hccr,u32 *hcor); +int tegrausb_start_port (int portnum,u32 *hccr,u32 *hcor);/** * Stop the current port * * @return 0 if ok, -1 if no port was active */ -int tegrausb_stop_port (void ); +int tegrausb_stop_port (int portnum);#endif /* _TEGRA_USB_H_ */
drivers/usb/host/ehci-tegra.c +2 -3
@@ -57,7 +57,7 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)* Select the first port, as we don't have a way of selecting others * yet */ -if (tegrausb_start_port (0 , &our_hccr, &our_hcor)) +if (tegrausb_start_port (index, &our_hccr, &our_hcor))return -1 ; *hccr = (struct ehci_hccr *)our_hccr;
@@ -72,6 +72,5 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)*/ int ehci_hcd_stop (int index) { -tegrausb_stop_port (); -return 0 ; +return tegrausb_stop_port (index); }
Signature · 1 line
1.7.11.4
v4 cover USB multi controller
In reply to Lucas StachDear Lucas Stach,
Patchset doesn't apply ... rebase and repost please.
Quoted 111 lines
V4: Fixed build failures in fsl and mxs ehci code. Also rebased on the latest usb/master and did MAKEALL -a powerpc in addition to MAKEALL -a arm.
V3: Stephen ran into some problems applying this, as it seems my tree wasn't as clean as it should have been. Sorry for the inconvenience. This should now be fixed.
Hi all,
this is a follow up on the patch "USB: EHCI: Initialize multiple USB controllers at once" from Jim Lin. It takes some of the code but has undergone some heavy reworking.
When we remove the ifdef horror from the above mentioned patch it's mostly a big interface change to the usb subsystem. As this creates a lot of churn I've split this up into a series. Every patch is self contained so it doesn't break compiles and *should* not regress any functionality on it's own. At least the series is bisectable in case anything goes wrong. I've compile tested all the ARM configs.
Both the lowlevel usb and ehci interface change are backward compatible, so implementations that only use one controller can choose to ignore the new interface. All implementations are updated to work with the new function prototypes.
For Tegra I've included a patch to actually use the new ehci interface. Tom, Stephen, can I get an ACK from you for this, so Marek can take this through his USB tree?
All patches now rebased onto u-boot-usb/master.
Patch 3 also includes some cosmetic changes, to make the output of the usb commands more readable.
On my Colibri T20, with a total of 3 usb controllers of which 2 are enabled in the device tree, output now looks like this:
Tegra20 (Colibri) # usb start
(Re)start USB...
USB0: USB EHCI 1.00
scanning bus 0 for devices... 2 USB Device(s) found
USB1: USB EHCI 1.00
scanning bus 1 for devices... 2 USB Device(s) found
USB2: lowlevel init failed
scanning usb for storage devices... 1 Storage Device(s) found scanning usb for ethernet devices... 1 Ethernet Device(s) foundTegra20 (Colibri) # usb tree
USB device tree:
1 Hub (480 Mb/s, 0mA)| u-boot EHCI Host Controller
+-2 Mass Storage (480 Mb/s, 200mA)
SanDisk U3 Titanium 2845221DC342AE8F3 Hub (480 Mb/s, 0mA)
| u-boot EHCI Host Controller
+-4 Vendor specific (480 Mb/s, 4mA)
ASIX Elec. Corp. AX88772B 000001Lucas Stach (4):
usb: lowlevel interface change to support multiple controllers
usb: ehci: rework to take advantage of new lowlevel interface
usb: add support for multiple usb controllers
tegra20: port to new ehci interfacearch/arm/cpu/arm920t/s3c24x0/usb_ohci.c | 4 +- arch/arm/cpu/armv7/tegra20/usb.c | 15 +--- arch/arm/include/asm/arch-tegra20/usb.h | 4 +- arch/arm/include/asm/ehci-omap.h | 10 ++- arch/mips/cpu/mips32/au1x00/au1x00_usb_ohci.c | 4 +- arch/powerpc/cpu/mpc5xxx/usb_ohci.c | 4 +- arch/powerpc/cpu/ppc4xx/usb_ohci.c | 4 +- arch/sparc/cpu/leon3/usb_uhci.c | 4 +- arch/sparc/lib/bootm.c | 2 +- board/htkw/mcx/mcx.c | 6 +- board/mpl/common/usb_uhci.c | 4 +- board/technexion/twister/twister.c | 6 +- board/teejet/mt_ventoux/mt_ventoux.c | 6 +- board/ti/beagle/beagle.c | 6 +- board/ti/panda/panda.c | 6 +- common/cmd_usb.c | 16 +++- common/usb.c | 108 +++++++++++----------- common/usb_hub.c | 2 +- common/usb_storage.c | 2 +- drivers/usb/eth/usb_ether.c | 2 +- drivers/usb/host/ehci-armada100.c | 15 ++-- drivers/usb/host/ehci-atmel.c | 11 ++- drivers/usb/host/ehci-core.h | 29 ------ drivers/usb/host/ehci-exynos.c | 15 ++-- drivers/usb/host/ehci-fsl.c | 15 ++-- drivers/usb/host/ehci-hcd.c | 124 ++++++++++++++------------ drivers/usb/host/ehci-ixp4xx.c | 15 ++-- drivers/usb/host/ehci-marvell.c | 15 ++-- drivers/usb/host/ehci-mpc512x.c | 25 ++---- drivers/usb/host/ehci-mx5.c | 11 ++- drivers/usb/host/ehci-mx6.c | 11 ++- drivers/usb/host/ehci-mxc.c | 11 ++- drivers/usb/host/ehci-mxs.c | 20 +++-- drivers/usb/host/ehci-omap.c | 10 ++- drivers/usb/host/ehci-pci.c | 15 ++-- drivers/usb/host/ehci-ppc4xx.c | 11 ++- drivers/usb/host/ehci-tegra.c | 14 ++- drivers/usb/host/ehci-vct.c | 9 +- drivers/usb/host/ehci.h | 4 +- drivers/usb/host/isp116x-hcd.c | 4 +-
Quoted 8 lines
drivers/usb/host/ohci-hcd.c | 4 +- drivers/usb/host/r8a66597-hcd.c | 4 +- drivers/usb/host/sl811-hcd.c | 4 +- drivers/usb/musb/musb_hcd.c | 4 +- include/usb.h | 10 ++- include/usb/mv_udc.h | 2 +- 46 Dateien ge?ndert, 309 Zeilen hinzugef?gt(+), 318 Zeilen entfernt(-) delete mode 100644 drivers/usb/host/ehci-core.h
Best regards,
Marek Vasut