mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-19 05:31:32 +00:00
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:
parent
5527efe501
commit
c7e3b2b586
17 changed files with 40 additions and 34 deletions
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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! */
|
||||||
|
|
|
@ -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! */
|
||||||
|
|
|
@ -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! */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
10
common/usb.c
10
common/usb.c
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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! */
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
|
@ -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__ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue