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
					
				|  | @ -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(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -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! */ | ||||
|  |  | |||
|  | @ -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! */ | ||||
|  |  | |||
|  | @ -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! */ | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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) */ | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
							
								
								
									
										10
									
								
								common/usb.c
								
								
								
								
							
							
						
						
									
										10
									
								
								common/usb.c
								
								
								
								
							|  | @ -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 | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -829,12 +829,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; | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
|  | @ -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! */ | ||||
|  |  | |||
|  | @ -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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -140,6 +140,8 @@ struct usb_device { | |||
| 	int portnr; | ||||
| 	struct usb_device *parent; | ||||
| 	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_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, | ||||
|  | @ -382,7 +385,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_ */ | ||||
|  |  | |||
|  | @ -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__ */ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue