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.

Signed-off-by: Lucas Stach <dev@lynxeye.de>
Reviewed-by: Marek Vasut <marex@denx.de>
This commit is contained in:
Lucas Stach 2012-09-26 00:14:34 +02:00 committed by Tom Rini
parent 5527efe501
commit c7e3b2b586
17 changed files with 40 additions and 34 deletions

View File

@ -1659,7 +1659,7 @@ static void hc_release_ohci(struct ohci *ohci)
*/ */
static char ohci_inited = 0; 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_clock_power *clk_power = s3c24x0_get_base_clock_power();
struct s3c24x0_gpio *gpio = s3c24x0_get_base_gpio(); struct s3c24x0_gpio *gpio = s3c24x0_get_base_gpio();
@ -1738,7 +1738,7 @@ int usb_lowlevel_init(void)
return 0; return 0;
} }
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power(); struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();

View File

@ -1565,7 +1565,7 @@ static void hc_release_ohci (ohci_t *ohci)
*/ */
static char ohci_inited = 0; static char ohci_inited = 0;
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller)
{ {
u32 pin_func; u32 pin_func;
u32 sys_freqctrl, sys_clksrc; u32 sys_freqctrl, sys_clksrc;
@ -1707,7 +1707,7 @@ int usb_lowlevel_init(void)
return -1; return -1;
} }
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
/* this gets called really early - before the controller has */ /* this gets called really early - before the controller has */
/* even been initialized! */ /* even been initialized! */

View File

@ -1561,7 +1561,7 @@ static void hc_release_ohci (ohci_t *ohci)
*/ */
static char ohci_inited = 0; static char ohci_inited = 0;
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller)
{ {
/* Set the USB Clock */ /* Set the USB Clock */
@ -1629,7 +1629,7 @@ int usb_lowlevel_init(void)
return 0; return 0;
} }
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
/* this gets called really early - before the controller has */ /* this gets called really early - before the controller has */
/* even been initialized! */ /* even been initialized! */

View File

@ -1566,7 +1566,7 @@ static void hc_release_ohci (ohci_t *ohci)
*/ */
static char ohci_inited = 0; 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 (&gohci, 0, sizeof (ohci_t));
memset (&urb_priv, 0, sizeof (urb_priv_t)); memset (&urb_priv, 0, sizeof (urb_priv_t));
@ -1624,7 +1624,7 @@ int usb_lowlevel_init(void)
return 0; return 0;
} }
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
/* this gets called really early - before the controller has */ /* this gets called really early - before the controller has */
/* even been initialized! */ /* even been initialized! */

View File

@ -706,7 +706,7 @@ void handle_usb_interrupt(void)
/* init uhci /* init uhci
*/ */
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller)
{ {
unsigned char temp; unsigned char temp;
ambapp_ahbdev ahbdev; ambapp_ahbdev ahbdev;
@ -745,7 +745,7 @@ int usb_lowlevel_init(void)
/* stop uhci /* stop uhci
*/ */
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
if (grusb_irq == -1) if (grusb_irq == -1)
return 1; return 1;

View File

@ -36,7 +36,7 @@ extern void srmmu_init_cpu(unsigned int entry);
extern void prepare_bootargs(char *bootargs); extern void prepare_bootargs(char *bootargs);
#ifdef CONFIG_USB_UHCI #ifdef CONFIG_USB_UHCI
extern int usb_lowlevel_stop(void); extern int usb_lowlevel_stop(int index);
#endif #endif
/* sparc kernel argument (the ROM vector) */ /* sparc kernel argument (the ROM vector) */

View File

@ -602,7 +602,7 @@ void handle_usb_interrupt(void)
/* init uhci /* init uhci
*/ */
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller)
{ {
unsigned char temp; unsigned char temp;
int busdevfunc; int busdevfunc;
@ -632,7 +632,7 @@ int usb_lowlevel_init(void)
/* stop uhci /* stop uhci
*/ */
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
if(irqvec==-1) if(irqvec==-1)
return 1; return 1;

View File

@ -76,6 +76,7 @@ static int running;
static int asynch_allowed; static int asynch_allowed;
char usb_started; /* flag for the started/stopped USB status */ 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... * some forward declerations...
@ -96,7 +97,7 @@ int usb_init(void)
usb_hub_reset(); usb_hub_reset();
/* init low_level USB */ /* init low_level USB */
printf("USB: "); printf("USB: ");
result = usb_lowlevel_init(); result = usb_lowlevel_init(0, &ctrl);
/* if lowlevel init is OK, scan the bus for devices /* if lowlevel init is OK, scan the bus for devices
* i.e. search HUBs and configure them */ * i.e. search HUBs and configure them */
if (result == 0) { if (result == 0) {
@ -123,7 +124,7 @@ int usb_stop(void)
asynch_allowed = 1; asynch_allowed = 1;
usb_started = 0; usb_started = 0;
usb_hub_reset(); usb_hub_reset();
res = usb_lowlevel_stop(); res = usb_lowlevel_stop(0);
} }
return res; 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 /* returns a pointer of a new device structure or NULL, if
* no device struct is available * no device struct is available
*/ */
struct usb_device *usb_alloc_new_device(void) struct usb_device *usb_alloc_new_device(void *controller)
{ {
int i; int i;
USB_PRINTF("New Device %d\n", dev_index); 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++) for (i = 0; i < USB_MAXCHILDREN; i++)
usb_dev[dev_index].children[i] = NULL; usb_dev[dev_index].children[i] = NULL;
usb_dev[dev_index].parent = NULL; usb_dev[dev_index].parent = NULL;
usb_dev[dev_index].controller = controller;
dev_index++; dev_index++;
return &usb_dev[dev_index - 1]; return &usb_dev[dev_index - 1];
} }
@ -958,7 +960,7 @@ static void usb_scan_devices(void)
} }
dev_index = 0; dev_index = 0;
/* device 0 is always present (root hub, so let it analyze) */ /* 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)) if (usb_new_device(dev))
printf("No USB Device found\n"); printf("No USB Device found\n");
else else

View File

@ -244,7 +244,7 @@ void usb_hub_port_connect_change(struct usb_device *dev, int port)
mdelay(200); mdelay(200);
/* Allocate a new device struct for it */ /* 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) if (portstatus & USB_PORT_STAT_HIGH_SPEED)
usb->speed = USB_SPEED_HIGH; usb->speed = USB_SPEED_HIGH;

View File

@ -829,12 +829,12 @@ unknown:
return -1; return -1;
} }
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
return ehci_hcd_stop(); return ehci_hcd_stop();
} }
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller)
{ {
uint32_t reg; uint32_t reg;
uint32_t cmd; uint32_t cmd;

View File

@ -1391,7 +1391,7 @@ int isp116x_check_id(struct isp116x *isp116x)
return 0; return 0;
} }
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller))
{ {
struct isp116x *isp116x = &isp116x_dev; struct isp116x *isp116x = &isp116x_dev;
@ -1428,7 +1428,7 @@ int usb_lowlevel_init(void)
return 0; return 0;
} }
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
struct isp116x *isp116x = &isp116x_dev; struct isp116x *isp116x = &isp116x_dev;

View File

@ -1865,7 +1865,7 @@ static void hc_release_ohci(ohci_t *ohci)
*/ */
static char ohci_inited = 0; static char ohci_inited = 0;
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller)
{ {
#ifdef CONFIG_PCI_OHCI #ifdef CONFIG_PCI_OHCI
pci_dev_t pdev; pci_dev_t pdev;
@ -1971,7 +1971,7 @@ int usb_lowlevel_init(void)
return 0; return 0;
} }
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
/* this gets called really early - before the controller has */ /* this gets called really early - before the controller has */
/* even been initialized! */ /* even been initialized! */

View File

@ -908,7 +908,7 @@ int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
return 0; return 0;
} }
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller))
{ {
struct r8a66597 *r8a66597 = &gr8a66597; struct r8a66597 *r8a66597 = &gr8a66597;
@ -931,7 +931,7 @@ int usb_lowlevel_init(void)
return 0; return 0;
} }
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
disable_controller(&gr8a66597); disable_controller(&gr8a66597);

View File

@ -210,14 +210,14 @@ static int sl811_hc_reset(void)
return 1; return 1;
} }
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller)
{ {
root_hub_devnum = 0; root_hub_devnum = 0;
sl811_hc_reset(); sl811_hc_reset();
return 0; return 0;
} }
int usb_lowlevel_stop(void) int usb_lowlevel_stop(int index)
{ {
sl811_hc_reset(); sl811_hc_reset();
return 0; return 0;

View File

@ -1092,7 +1092,7 @@ int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
/* /*
* This function initializes the usb controller module. * This function initializes the usb controller module.
*/ */
int usb_lowlevel_init(void) int usb_lowlevel_init(int index, void **controller)
{ {
u8 power; u8 power;
u32 timeout; u32 timeout;
@ -1144,7 +1144,7 @@ int usb_lowlevel_init(void)
/* /*
* This function stops the operation of the davinci usb module. * 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 */ /* Reset the USB module */
musb_platform_deinit(); musb_platform_deinit();

View File

@ -140,6 +140,8 @@ struct usb_device {
int portnr; int portnr;
struct usb_device *parent; struct usb_device *parent;
struct usb_device *children[USB_MAXCHILDREN]; struct usb_device *children[USB_MAXCHILDREN];
void *controller; /* hardware controller private data */
}; };
/********************************************************************** /**********************************************************************
@ -153,8 +155,9 @@ struct usb_device {
defined(CONFIG_USB_OMAP3) || defined(CONFIG_USB_DA8XX) || \ defined(CONFIG_USB_OMAP3) || defined(CONFIG_USB_DA8XX) || \
defined(CONFIG_USB_BLACKFIN) || defined(CONFIG_USB_AM35X) defined(CONFIG_USB_BLACKFIN) || defined(CONFIG_USB_AM35X)
int usb_lowlevel_init(void); int usb_lowlevel_init(int index, void **controller);
int usb_lowlevel_stop(void); int usb_lowlevel_stop(int index);
int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
void *buffer, int transfer_len); void *buffer, int transfer_len);
int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer, int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
@ -382,7 +385,8 @@ void usb_hub_reset(void);
int hub_port_reset(struct usb_device *dev, int port, int hub_port_reset(struct usb_device *dev, int port,
unsigned short *portstat); 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); int usb_new_device(struct usb_device *dev);
#endif /*_USB_H_ */ #endif /*_USB_H_ */

View File

@ -147,5 +147,5 @@ struct ept_queue_item {
#define INFO_BUFFER_ERROR (1 << 5) #define INFO_BUFFER_ERROR (1 << 5)
#define INFO_TX_ERROR (1 << 3) #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__ */ #endif /* __MV_UDC_H__ */