More cleanup for the delta board and the generic usb_ohci driver. Added
CFG_USB_BOARD_INIT and CFG_USB_CPU_INIT for enabling board and cpu specific initialization and cleanup hooks respectively.
This commit is contained in:
		
							parent
							
								
									3e326ece9e
								
							
						
					
					
						commit
						24e37645e7
					
				|  | @ -1,10 +1,6 @@ | ||||||
| /*
 | /*
 | ||||||
|  * (C) Copyright 2002 |  * (C) Copyright 2006 | ||||||
|  * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net |  * DENX Software Engineering | ||||||
|  * |  | ||||||
|  * (C) Copyright 2002 |  | ||||||
|  * Sysgo Real-Time Solutions, GmbH <www.elinos.com> |  | ||||||
|  * Marius Groeger <mgroeger@sysgo.de> |  | ||||||
|  * |  * | ||||||
|  * See file CREDITS for list of people who contributed to this |  * See file CREDITS for list of people who contributed to this | ||||||
|  * project. |  * project. | ||||||
|  | @ -98,53 +94,6 @@ int board_late_init(void) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| /* board dependant usb stuff */ |  | ||||||
| int usb_board_init() |  | ||||||
| { |  | ||||||
| 	/*
 |  | ||||||
| 	 * Enable USB host clock. |  | ||||||
| 	 */ |  | ||||||
| 	CKENA |= (CKENA_2_USBHOST |  CKENA_20_UDC); |  | ||||||
| 	udelay(100); |  | ||||||
| 
 |  | ||||||
| 	/* Configure Port 2 for Host (USB Client Registers) */ |  | ||||||
| 	UP2OCR = 0x3000c; |  | ||||||
| 
 |  | ||||||
| #if 0 |  | ||||||
| 	GPIO2_2 = 0x801; /* USBHPEN - Alt. Fkt. 1 */ |  | ||||||
| 	GPIO3_2 = 0x801; /* USBHPWR - Alt. Fkt. 1 */ |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	UHCHR |= UHCHR_FHR; |  | ||||||
| 	wait_ms(11);	/* udelay(11); */ |  | ||||||
| 	UHCHR &= ~UHCHR_FHR; |  | ||||||
| 
 |  | ||||||
| 	UHCHR |= UHCHR_FSBIR; |  | ||||||
| 	while (UHCHR & UHCHR_FSBIR) |  | ||||||
| 		udelay(1); |  | ||||||
| 
 |  | ||||||
| #if 0 |  | ||||||
| 	UHCHR |= UHCHR_PCPL; /* USBHPEN is active low */ |  | ||||||
| 	UHCHR |= UHCHR_PSPL; /* USBHPWR is active low */ |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	UHCHR &= ~UHCHR_SSEP0; |  | ||||||
| 	UHCHR &= ~UHCHR_SSEP1; |  | ||||||
| 	UHCHR &= ~UHCHR_SSE; |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int usb_board_stop() |  | ||||||
| { |  | ||||||
| 	/* may not want to do this */ |  | ||||||
| 	/* CKENA &= ~(CKENA_2_USBHOST |  CKENA_20_UDC); */ |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * Magic Key Handling, mainly copied from board/lwmon/lwmon.c |  * Magic Key Handling, mainly copied from board/lwmon/lwmon.c | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | @ -26,7 +26,7 @@ include $(TOPDIR)/config.mk | ||||||
| LIB	= lib$(CPU).a | LIB	= lib$(CPU).a | ||||||
| 
 | 
 | ||||||
| START	= start.o | START	= start.o | ||||||
| OBJS	= serial.o interrupts.o cpu.o i2c.o pxafb.o mmc.o | OBJS	= serial.o interrupts.o cpu.o i2c.o pxafb.o mmc.o usb.o | ||||||
| 
 | 
 | ||||||
| all:	.depend $(START) $(LIB) | all:	.depend $(START) $(LIB) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,71 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2006 | ||||||
|  |  * Markus Klotzbuecher, DENX Software Engineering <mk@denx.de> | ||||||
|  |  * | ||||||
|  |  * See file CREDITS for list of people who contributed to this | ||||||
|  |  * project. | ||||||
|  |  * | ||||||
|  |  * 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; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <common.h> | ||||||
|  | #include <asm/arch/pxa-regs.h> | ||||||
|  | 
 | ||||||
|  | #ifdef CFG_USB_CPU_INIT | ||||||
|  | # ifdef CONFIG_CPU_MONAHANS | ||||||
|  | int usb_cpu_init() | ||||||
|  | { | ||||||
|  | 	/* Enable USB host clock. */ | ||||||
|  | 	CKENA |= (CKENA_2_USBHOST |  CKENA_20_UDC); | ||||||
|  | 	udelay(100); | ||||||
|  | 
 | ||||||
|  | 	/* Configure Port 2 for Host (USB Client Registers) */ | ||||||
|  | 	UP2OCR = 0x3000c; | ||||||
|  | 
 | ||||||
|  | #if 0 | ||||||
|  | 	GPIO2_2 = 0x801; /* USBHPEN - Alt. Fkt. 1 */ | ||||||
|  | 	GPIO3_2 = 0x801; /* USBHPWR - Alt. Fkt. 1 */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	UHCHR |= UHCHR_FHR; | ||||||
|  | 	wait_ms(11); | ||||||
|  | 	UHCHR &= ~UHCHR_FHR; | ||||||
|  | 
 | ||||||
|  | 	UHCHR |= UHCHR_FSBIR; | ||||||
|  | 	while (UHCHR & UHCHR_FSBIR) | ||||||
|  | 		udelay(1); | ||||||
|  | 
 | ||||||
|  | #if 0 | ||||||
|  | 	UHCHR |= UHCHR_PCPL; /* USBHPEN is active low */ | ||||||
|  | 	UHCHR |= UHCHR_PSPL; /* USBHPWR is active low */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	UHCHR &= ~UHCHR_SSEP0; | ||||||
|  | 	UHCHR &= ~UHCHR_SSEP1; | ||||||
|  | 	UHCHR &= ~UHCHR_SSE; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int usb_cpu_stop() | ||||||
|  | { | ||||||
|  | 	/* may not want to do this */ | ||||||
|  | 	/* CKENA &= ~(CKENA_2_USBHOST |  CKENA_20_UDC); */ | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | # endif /* CONFIG_CPU_MONAHANS */ | ||||||
|  | #endif /* CFG_USB_CPU_INIT */ | ||||||
|  | @ -51,7 +51,10 @@ | ||||||
| #include <usb.h> | #include <usb.h> | ||||||
| #include "usb_ohci.h" | #include "usb_ohci.h" | ||||||
| 
 | 
 | ||||||
| /* #define OHCI_USE_NPS		/\* force NoPowerSwitching mode *\/ */ | #ifdef CONFIG_ARM920T | ||||||
|  | # define OHCI_USE_NPS		/* force NoPowerSwitching mode */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #undef OHCI_VERBOSE_DEBUG	/* not always helpful */ | #undef OHCI_VERBOSE_DEBUG	/* not always helpful */ | ||||||
| 
 | 
 | ||||||
| /* For initializing controller (mask in an HCFS mode too) */ | /* For initializing controller (mask in an HCFS mode too) */ | ||||||
|  | @ -310,9 +313,6 @@ static void ohci_dump_roothub (ohci_t *controller, int verbose) | ||||||
| 	ndp = (temp & RH_A_NDP); | 	ndp = (temp & RH_A_NDP); | ||||||
| #ifdef CONFIG_AT91C_PQFP_UHPBUG | #ifdef CONFIG_AT91C_PQFP_UHPBUG | ||||||
| 	ndp = (ndp == 2) ? 1:0; | 	ndp = (ndp == 2) ? 1:0; | ||||||
| #endif |  | ||||||
| #if 0 /* def CONFIG_CPU_MONAHANS */
 |  | ||||||
| 		data_buf [2] = (data_buf [2] == 2) ? 3:0; |  | ||||||
| #endif | #endif | ||||||
| 	if (verbose) { | 	if (verbose) { | ||||||
| 		dbg ("roothub.a: %08x POTPGT=%d%s%s%s%s%s NDP=%d", temp, | 		dbg ("roothub.a: %08x POTPGT=%d%s%s%s%s%s NDP=%d", temp, | ||||||
|  | @ -1150,19 +1150,13 @@ pkt_print(dev, pipe, buffer, transfer_len, cmd, "SUB(rh)", usb_pipein(pipe)); | ||||||
| #ifdef CONFIG_AT91C_PQFP_UHPBUG | #ifdef CONFIG_AT91C_PQFP_UHPBUG | ||||||
| 		data_buf [2] = (data_buf [2] == 2) ? 1:0; | 		data_buf [2] = (data_buf [2] == 2) ? 1:0; | ||||||
| #endif | #endif | ||||||
| #if 0 /* def CONFIG_CPU_MONAHANS */
 |  | ||||||
| 		data_buf [2] = (data_buf [2] == 2) ? 3:0; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 		data_buf [3] = 0; | 		data_buf [3] = 0; | ||||||
| 		if (temp & RH_A_PSM)	/* per-port power switching? */ | 		if (temp & RH_A_PSM)	/* per-port power switching? */ | ||||||
| 			data_buf [3] |= 0x1; | 			data_buf [3] |= 0x1; | ||||||
| 		if (temp & RH_A_NOCP)	/* no overcurrent reporting? */ | 		if (temp & RH_A_NOCP)	/* no overcurrent reporting? */ | ||||||
| 			data_buf [3] |= 0x10; | 			data_buf [3] |= 0x10; | ||||||
| #if 1 |  | ||||||
| 		else if (temp & RH_A_OCPM)	/* per-port overcurrent reporting? */ | 		else if (temp & RH_A_OCPM)	/* per-port overcurrent reporting? */ | ||||||
| 			data_buf [3] |= 0x8; | 			data_buf [3] |= 0x8; | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
| 		/* corresponds to data_buf[4-7] */ | 		/* corresponds to data_buf[4-7] */ | ||||||
| 		datab [1] = 0; | 		datab [1] = 0; | ||||||
|  | @ -1557,10 +1551,18 @@ static char ohci_inited = 0; | ||||||
| 
 | 
 | ||||||
| int usb_lowlevel_init(void) | int usb_lowlevel_init(void) | ||||||
| { | { | ||||||
| 	/* do board dependant init */ | 
 | ||||||
|  | #if CFG_USB_CPU_INIT | ||||||
|  | 	/* cpu dependant init */ | ||||||
|  | 	if(usb_cpu_init()) | ||||||
|  | 		return -1; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if CFG_USB_BOARD_INIT | ||||||
|  | 	/*  board dependant init */ | ||||||
| 	if(usb_board_init()) | 	if(usb_board_init()) | ||||||
| 		return -1; | 		return -1; | ||||||
| 
 | #endif | ||||||
| 	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)); | ||||||
| 
 | 
 | ||||||
|  | @ -1588,28 +1590,43 @@ int usb_lowlevel_init(void) | ||||||
| 	gohci.disabled = 1; | 	gohci.disabled = 1; | ||||||
| 	gohci.sleeping = 0; | 	gohci.sleeping = 0; | ||||||
| 	gohci.irq = -1; | 	gohci.irq = -1; | ||||||
| 	gohci.regs = (struct ohci_regs *)OHCI_REGS_BASE; | 	gohci.regs = (struct ohci_regs *)CFG_USB_OHCI_REGS_BASE; | ||||||
| 
 | 
 | ||||||
| 	gohci.flags = 0; | 	gohci.flags = 0; | ||||||
| 	gohci.slot_name = "delta/zylonite"; | 	gohci.slot_name = CFG_USB_SLOT_NAME; | ||||||
| 
 | 
 | ||||||
| 	if (hc_reset (&gohci) < 0) { | 	if (hc_reset (&gohci) < 0) { | ||||||
| 		hc_release_ohci (&gohci); | 		hc_release_ohci (&gohci); | ||||||
| 		err ("can't reset usb-%s", gohci.slot_name); | 		err ("can't reset usb-%s", gohci.slot_name); | ||||||
| 		/* Initialization failed disable clocks */ | 		/* Initialization failed disable clocks */ | ||||||
| 		CKENA &= ~(CKENA_2_USBHOST |  CKENA_20_UDC); | #if CFG_USB_BOARD_INIT | ||||||
|  | 		/* board dependant cleanup */ | ||||||
|  | 		usb_board_stop(); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if CFG_USB_CPU_INIT | ||||||
|  | 		/* cpu dependant cleanup */ | ||||||
|  | 		usb_cpu_stop(); | ||||||
|  | #endif | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* FIXME this is a second HC reset; why?? */ | 	/* FIXME this is a second HC reset; why?? */ | ||||||
| 	/* writel(gohci.hc_control = OHCI_USB_RESET, &gohci.regs->control);
 | 	/* writel(gohci.hc_control = OHCI_USB_RESET, &gohci.regs->control);
 | ||||||
| 	   wait_ms(10); */ | 	   wait_ms(10); */ | ||||||
| 
 |  | ||||||
| 	if (hc_start (&gohci) < 0) { | 	if (hc_start (&gohci) < 0) { | ||||||
| 		err ("can't start usb-%s", gohci.slot_name); | 		err ("can't start usb-%s", gohci.slot_name); | ||||||
| 		hc_release_ohci (&gohci); | 		hc_release_ohci (&gohci); | ||||||
| 		/* Initialization failed */ | 		/* Initialization failed */ | ||||||
| 		CKENA &= ~(CKENA_2_USBHOST |  CKENA_20_UDC); | #if CFG_USB_BOARD_INIT | ||||||
|  | 		/* board dependant cleanup */ | ||||||
|  | 		usb_board_stop(); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if CFG_USB_CPU_INIT | ||||||
|  | 		/* cpu dependant cleanup */ | ||||||
|  | 		usb_cpu_stop(); | ||||||
|  | #endif | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -1632,9 +1649,17 @@ int usb_lowlevel_stop(void) | ||||||
| 	/* call hc_release_ohci() here ? */ | 	/* call hc_release_ohci() here ? */ | ||||||
| 	hc_reset (&gohci); | 	hc_reset (&gohci); | ||||||
| 
 | 
 | ||||||
|  | #if CFG_USB_BOARD_INIT | ||||||
| 	/* board dependant cleanup */ | 	/* board dependant cleanup */ | ||||||
| 	if(usb_board_stop()) | 	if(usb_board_stop()) | ||||||
| 		return -1; | 		return -1; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if CFG_USB_CPU_INIT | ||||||
|  | 	/* cpu dependant cleanup */ | ||||||
|  | 	if(usb_cpu_stop()) | ||||||
|  | 		return -1; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -8,8 +8,16 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /* functions for doing board specific setup/cleanup */ | /* functions for doing board specific setup/cleanup */ | ||||||
|  | #ifdef CFG_USB_BOARD_INIT | ||||||
| extern int usb_board_init(void); | extern int usb_board_init(void); | ||||||
| extern int usb_board_stop(void); | extern int usb_board_stop(void); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CFG_USB_CPU_INIT | ||||||
|  | extern int usb_cpu_init(void); | ||||||
|  | extern int usb_cpu_stop(void); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| static int cc_to_error[16] = { | static int cc_to_error[16] = { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -102,13 +102,17 @@ | ||||||
| 				     | CFG_CMD_IMLS)) | 				     | CFG_CMD_IMLS)) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 
 | /* USB */ | ||||||
| #define CONFIG_USB_OHCI         1 | #define CONFIG_USB_OHCI         1 | ||||||
| #define CONFIG_USB_STORAGE      1 | #define CONFIG_USB_STORAGE      1 | ||||||
| #define CONFIG_DOS_PARTITION    1 | #define CONFIG_DOS_PARTITION    1 | ||||||
| 
 | 
 | ||||||
| #define LITTLEENDIAN            1       /* used by usb_ohci.c  */ | #undef CFG_USB_BOARD_INIT | ||||||
|  | #define CFG_USB_CPU_INIT	1 | ||||||
|  | #define CFG_USB_OHCI_REGS_BASE	OHCI_REGS_BASE | ||||||
|  | #define CFG_USB_SLOT_NAME	"delta" | ||||||
| 
 | 
 | ||||||
|  | #define LITTLEENDIAN            1       /* used by usb_ohci.c  */ | ||||||
| 
 | 
 | ||||||
| /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ | /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ | ||||||
| #include <cmd_confdefs.h> | #include <cmd_confdefs.h> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue