Merge branch 'master-sync' of git://git.denx.de/u-boot-arm
This commit is contained in:
		
						commit
						a84b655fab
					
				
							
								
								
									
										4
									
								
								MAKEALL
								
								
								
								
							
							
						
						
									
										4
									
								
								MAKEALL
								
								
								
								
							|  | @ -574,6 +574,10 @@ LIST_ARM9="			\ | ||||||
| 	sheevaplug		\ | 	sheevaplug		\ | ||||||
| 	smdk2400		\ | 	smdk2400		\ | ||||||
| 	smdk2410		\ | 	smdk2410		\ | ||||||
|  | 	spear300		\ | ||||||
|  | 	spear310		\ | ||||||
|  | 	spear320		\ | ||||||
|  | 	spear600		\ | ||||||
| 	trab			\ | 	trab			\ | ||||||
| 	VCMA9			\ | 	VCMA9			\ | ||||||
| 	versatile		\ | 	versatile		\ | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										8
									
								
								Makefile
								
								
								
								
							|  | @ -3036,6 +3036,14 @@ smdk2400_config	:	unconfig | ||||||
| smdk2410_config	:	unconfig | smdk2410_config	:	unconfig | ||||||
| 	@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0 | 	@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0 | ||||||
| 
 | 
 | ||||||
|  | spear300_config \ | ||||||
|  | spear310_config \ | ||||||
|  | spear320_config :	unconfig | ||||||
|  | 	@$(MKCONFIG) -n $@ -t $(@:_config=) spear3xx arm arm926ejs $(@:_config=) spear spear | ||||||
|  | 
 | ||||||
|  | spear600_config :	unconfig | ||||||
|  | 	@$(MKCONFIG) -n $@ -t $(@:_config=) spear6xx arm arm926ejs $(@:_config=) spear spear | ||||||
|  | 
 | ||||||
| SX1_stdout_serial_config \ | SX1_stdout_serial_config \ | ||||||
| SX1_config:		unconfig | SX1_config:		unconfig | ||||||
| 	@mkdir -p $(obj)include | 	@mkdir -p $(obj)include | ||||||
|  |  | ||||||
|  | @ -219,6 +219,32 @@ u32 get_board_rev(void) | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_MISC_INIT_R | ||||||
|  | int misc_init_r(void) | ||||||
|  | { | ||||||
|  | 	char *str; | ||||||
|  | 	char buf[32]; | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * Normally the processor clock has a divisor of 2. | ||||||
|  | 	 * In some cases this this needs to be set to 4. | ||||||
|  | 	 * Check the user has set environment mdiv to 4 to change the divisor. | ||||||
|  | 	 */ | ||||||
|  | 	if ((str = getenv("mdiv")) && (strcmp(str, "4") == 0)) { | ||||||
|  | 		at91_sys_write(AT91_PMC_MCKR, | ||||||
|  | 			(at91_sys_read(AT91_PMC_MCKR) & ~AT91_PMC_MDIV) | | ||||||
|  | 			AT91SAM9_PMC_MDIV_4); | ||||||
|  | 		at91_clock_init(0); | ||||||
|  | 		serial_setbrg(); | ||||||
|  | 		/* Notify the user that the clock is not default */ | ||||||
|  | 		printf("Setting master clock to %s MHz\n", | ||||||
|  | 			strmhz(buf, get_mck_clk_rate())); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | #endif /* CONFIG_MISC_INIT_R */ | ||||||
|  | 
 | ||||||
| int board_init(void) | int board_init(void) | ||||||
| { | { | ||||||
| 	/* Peripheral Clock Enable Register */ | 	/* Peripheral Clock Enable Register */ | ||||||
|  |  | ||||||
|  | @ -0,0 +1,54 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2006
 | ||||||
|  | # Wolfgang Denk, DENX Software Engineering, wd@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 $(TOPDIR)/config.mk | ||||||
|  | 
 | ||||||
|  | ifneq ($(OBJTREE),$(SRCTREE)) | ||||||
|  | $(shell mkdir -p $(obj)board/$(VENDOR)/common) | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | LIB	= $(obj)lib$(VENDOR).a | ||||||
|  | 
 | ||||||
|  | COBJS	:= spr_misc.o | ||||||
|  | SOBJS	:= spr_lowlevel_init.o | ||||||
|  | 
 | ||||||
|  | SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) | ||||||
|  | OBJS	:= $(addprefix $(obj),$(COBJS)) | ||||||
|  | SOBJS	:= $(addprefix $(obj),$(SOBJS)) | ||||||
|  | 
 | ||||||
|  | $(LIB):	$(obj).depend $(OBJS) $(SOBJS) | ||||||
|  | 	$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | 	rm -f $(SOBJS) $(OBJS) | ||||||
|  | 
 | ||||||
|  | distclean:	clean | ||||||
|  | 	rm -f $(LIB) core *.bak $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | # This is for $(obj).depend target
 | ||||||
|  | include $(SRCTREE)/rules.mk | ||||||
|  | 
 | ||||||
|  | sinclude $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | @ -0,0 +1,195 @@ | ||||||
|  | /* | ||||||
|  |  * (C) Copyright 2006 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com.
 | ||||||
|  |  * | ||||||
|  |  * 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 <config.h> | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |  * platform specific initializations are already done in Xloader | ||||||
|  |  * Initializations already done include | ||||||
|  |  * DDR, PLLs, IP's clock enable and reset release etc | ||||||
|  |  */ | ||||||
|  | .globl lowlevel_init
 | ||||||
|  | lowlevel_init: | ||||||
|  | 	/* By default, U-Boot switches CPU to low-vector */ | ||||||
|  | 	/* Revert this as we work in high vector even in U-Boot */ | ||||||
|  | 	mrc	p15, 0, r0, c1, c0, 0 | ||||||
|  | 	orr	r0, r0, #0x00002000 | ||||||
|  | 	mcr	p15, 0, r0, c1, c0, 0 | ||||||
|  | 	mov	pc, lr | ||||||
|  | 
 | ||||||
|  | /* void setfreq(unsigned int device, unsigned int frequency) */ | ||||||
|  | .global setfreq
 | ||||||
|  | setfreq: | ||||||
|  | 	stmfd 	sp!,{r14} | ||||||
|  | 	stmfd 	sp!,{r0-r12} | ||||||
|  | 
 | ||||||
|  | 	mov  	r8,sp | ||||||
|  | 	ldr 	sp,SRAM_STACK_V | ||||||
|  | 
 | ||||||
|  | 	/* Saving the function arguements for later use */ | ||||||
|  | 	mov  	r4,r0 | ||||||
|  | 	mov  	r5,r1 | ||||||
|  | 
 | ||||||
|  | 	/* Putting DDR into self refresh */ | ||||||
|  | 	ldr 	r0,DDR_07_V | ||||||
|  | 	ldr	r1,[r0] | ||||||
|  | 	ldr	r2,DDR_ACTIVE_V | ||||||
|  | 	bic	r1, r1, r2 | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 	ldr 	r0,DDR_57_V | ||||||
|  | 	ldr	r1,[r0] | ||||||
|  | 	ldr	r2,CYCLES_MASK_V | ||||||
|  | 	bic	r1, r1, r2 | ||||||
|  | 	ldr	r2,REFRESH_CYCLES_V | ||||||
|  | 	orr	r1, r1, r2, lsl #16 | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 	ldr 	r0,DDR_07_V | ||||||
|  | 	ldr	r1,[r0] | ||||||
|  | 	ldr	r2,SREFRESH_MASK_V | ||||||
|  | 	orr	r1, r1, r2 | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 
 | ||||||
|  | 	/* flush pipeline */ | ||||||
|  | 	b	flush | ||||||
|  | 	.align 5
 | ||||||
|  | flush: | ||||||
|  | 	/* Delay to ensure self refresh mode */ | ||||||
|  | 	ldr	r0,SREFRESH_DELAY_V | ||||||
|  | delay: | ||||||
|  | 	sub	r0,r0,#1 | ||||||
|  | 	cmp	r0,#0 | ||||||
|  | 	bne	delay | ||||||
|  | 
 | ||||||
|  | 	/* Putting system in slow mode */ | ||||||
|  | 	ldr	r0,SCCTRL_V | ||||||
|  | 	mov	r1,#2 | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 
 | ||||||
|  | 	/* Changing PLL(1/2) frequency */ | ||||||
|  | 	mov	r0,r4 | ||||||
|  | 	mov	r1,r5 | ||||||
|  | 
 | ||||||
|  | 	cmp	r4,#0 | ||||||
|  | 	beq	pll1_freq | ||||||
|  | 
 | ||||||
|  | 	/* Change PLL2 (DDR frequency) */ | ||||||
|  | 	ldr	r6,PLL2_FREQ_V | ||||||
|  | 	ldr	r7,PLL2_CNTL_V | ||||||
|  | 	b	pll2_freq | ||||||
|  | 
 | ||||||
|  | pll1_freq: | ||||||
|  | 	/* Change PLL1 (CPU frequency) */ | ||||||
|  | 	ldr	r6,PLL1_FREQ_V | ||||||
|  | 	ldr	r7,PLL1_CNTL_V | ||||||
|  | 
 | ||||||
|  | pll2_freq: | ||||||
|  | 	mov	r0,r6 | ||||||
|  | 	ldr	r1,[r0] | ||||||
|  | 	ldr	r2,PLLFREQ_MASK_V | ||||||
|  | 	bic	r1,r1,r2 | ||||||
|  | 	mov	r2,r5,lsr#1 | ||||||
|  | 	orr	r1,r1,r2,lsl#24 | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 
 | ||||||
|  | 	mov	r0,r7 | ||||||
|  | 	ldr	r1,P1C0A_V | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 	ldr	r1,P1C0E_V | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 	ldr	r1,P1C06_V | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 	ldr	r1,P1C0E_V | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 
 | ||||||
|  | lock: | ||||||
|  | 	ldr	r1,[r0] | ||||||
|  | 	and	r1,r1,#1 | ||||||
|  | 	cmp	r1,#0 | ||||||
|  | 	beq	lock | ||||||
|  | 
 | ||||||
|  | 	/* Putting system back to normal mode */ | ||||||
|  | 	ldr	r0,SCCTRL_V | ||||||
|  | 	mov	r1,#4 | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 
 | ||||||
|  | 	/* Putting DDR back to normal */ | ||||||
|  | 	ldr	r0,DDR_07_V | ||||||
|  | 	ldr	r1,[R0] | ||||||
|  | 	ldr	r2,SREFRESH_MASK_V | ||||||
|  | 	bic	r1, r1, r2 | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 	ldr	r2,DDR_ACTIVE_V | ||||||
|  | 	orr	r1, r1, r2 | ||||||
|  | 	str	r1,[r0] | ||||||
|  | 
 | ||||||
|  | 	/* Delay to ensure self refresh mode */ | ||||||
|  | 	ldr	r0,SREFRESH_DELAY_V | ||||||
|  | 1: | ||||||
|  | 	sub	r0,r0,#1 | ||||||
|  | 	cmp	r0,#0 | ||||||
|  | 	bne	1b | ||||||
|  | 
 | ||||||
|  | 	mov	sp,r8 | ||||||
|  | 	/* Resuming back to code */ | ||||||
|  | 	ldmia	sp!,{r0-r12} | ||||||
|  | 	ldmia	sp!,{pc} | ||||||
|  | 
 | ||||||
|  | SCCTRL_V: | ||||||
|  | 	.word 0xfca00000
 | ||||||
|  | PLL1_FREQ_V: | ||||||
|  | 	.word 0xfca8000C
 | ||||||
|  | PLL1_CNTL_V: | ||||||
|  | 	.word 0xfca80008
 | ||||||
|  | PLL2_FREQ_V: | ||||||
|  | 	.word 0xfca80018
 | ||||||
|  | PLL2_CNTL_V: | ||||||
|  | 	.word 0xfca80014
 | ||||||
|  | PLLFREQ_MASK_V: | ||||||
|  | 	.word 0xff000000
 | ||||||
|  | P1C0A_V: | ||||||
|  | 	.word 0x1C0A
 | ||||||
|  | P1C0E_V: | ||||||
|  | 	.word 0x1C0E
 | ||||||
|  | P1C06_V: | ||||||
|  | 	.word 0x1C06
 | ||||||
|  | 
 | ||||||
|  | SREFRESH_DELAY_V: | ||||||
|  | 	.word 0x9999
 | ||||||
|  | SRAM_STACK_V: | ||||||
|  | 	.word 0xD2800600
 | ||||||
|  | DDR_07_V: | ||||||
|  | 	.word 0xfc60001c
 | ||||||
|  | DDR_ACTIVE_V: | ||||||
|  | 	.word 0x01000000
 | ||||||
|  | DDR_57_V: | ||||||
|  | 	.word 0xfc6000e4
 | ||||||
|  | CYCLES_MASK_V: | ||||||
|  | 	.word 0xffff0000
 | ||||||
|  | REFRESH_CYCLES_V: | ||||||
|  | 	.word 0xf0f0
 | ||||||
|  | SREFRESH_MASK_V: | ||||||
|  | 	.word 0x00010000
 | ||||||
|  | 
 | ||||||
|  | .global setfreq_sz
 | ||||||
|  | setfreq_sz: | ||||||
|  | 	.word setfreq_sz - setfreq | ||||||
|  | @ -0,0 +1,296 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 <command.h> | ||||||
|  | #include <i2c.h> | ||||||
|  | #include <net.h> | ||||||
|  | #include <asm/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_emi.h> | ||||||
|  | #include <asm/arch/spr_xloader_table.h> | ||||||
|  | #include <asm/arch/spr_defs.h> | ||||||
|  | 
 | ||||||
|  | #define CPU		0 | ||||||
|  | #define DDR		1 | ||||||
|  | #define SRAM_REL	0xD2801000 | ||||||
|  | 
 | ||||||
|  | DECLARE_GLOBAL_DATA_PTR; | ||||||
|  | static struct chip_data chip_data; | ||||||
|  | 
 | ||||||
|  | int dram_init(void) | ||||||
|  | { | ||||||
|  | 	struct xloader_table *xloader_tb = | ||||||
|  | 	    (struct xloader_table *)XLOADER_TABLE_ADDRESS; | ||||||
|  | 	struct xloader_table_1_1 *table_1_1; | ||||||
|  | 	struct xloader_table_1_2 *table_1_2; | ||||||
|  | 	struct chip_data *chip = &chip_data; | ||||||
|  | 
 | ||||||
|  | 	gd->bd->bi_dram[0].start = PHYS_SDRAM_1; | ||||||
|  | 	gd->bd->bi_dram[0].size = get_ram_size(PHYS_SDRAM_1, | ||||||
|  | 					       PHYS_SDRAM_1_MAXSIZE); | ||||||
|  | 
 | ||||||
|  | 	if (XLOADER_TABLE_VERSION_1_1 == xloader_tb->table_version) { | ||||||
|  | 		table_1_1 = &xloader_tb->table.table_1_1; | ||||||
|  | 		chip->dramfreq = table_1_1->ddrfreq; | ||||||
|  | 		chip->dramtype = table_1_1->ddrtype; | ||||||
|  | 
 | ||||||
|  | 	} else if (XLOADER_TABLE_VERSION_1_2 == xloader_tb->table_version) { | ||||||
|  | 		table_1_2 = &xloader_tb->table.table_1_2; | ||||||
|  | 		chip->dramfreq = table_1_2->ddrfreq; | ||||||
|  | 		chip->dramtype = table_1_2->ddrtype; | ||||||
|  | 	} else { | ||||||
|  | 		chip->dramfreq = -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int misc_init_r(void) | ||||||
|  | { | ||||||
|  | #if defined(CONFIG_CMD_NET) | ||||||
|  | 	uchar mac_id[6]; | ||||||
|  | 
 | ||||||
|  | 	if (!eth_getenv_enetaddr("ethaddr", mac_id) && !i2c_read_mac(mac_id)) | ||||||
|  | 		eth_setenv_enetaddr("ethaddr", mac_id); | ||||||
|  | #endif | ||||||
|  | 	setenv("verify", "n"); | ||||||
|  | 
 | ||||||
|  | #if defined(CONFIG_SPEAR_USBTTY) | ||||||
|  | 	setenv("stdin", "usbtty"); | ||||||
|  | 	setenv("stdout", "usbtty"); | ||||||
|  | 	setenv("stderr", "usbtty"); | ||||||
|  | #endif | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_SPEAR_EMI | ||||||
|  | struct cust_emi_para { | ||||||
|  | 	unsigned int tap; | ||||||
|  | 	unsigned int tsdp; | ||||||
|  | 	unsigned int tdpw; | ||||||
|  | 	unsigned int tdpr; | ||||||
|  | 	unsigned int tdcs; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* EMI timing setting of m28w640hc of linux kernel */ | ||||||
|  | const struct cust_emi_para emi_timing_m28w640hc = { | ||||||
|  | 	.tap = 0x10, | ||||||
|  | 	.tsdp = 0x05, | ||||||
|  | 	.tdpw = 0x0a, | ||||||
|  | 	.tdpr = 0x0a, | ||||||
|  | 	.tdcs = 0x05, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* EMI timing setting of bootrom */ | ||||||
|  | const struct cust_emi_para emi_timing_bootrom = { | ||||||
|  | 	.tap = 0xf, | ||||||
|  | 	.tsdp = 0x0, | ||||||
|  | 	.tdpw = 0xff, | ||||||
|  | 	.tdpr = 0x111, | ||||||
|  | 	.tdcs = 0x02, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void spear_emi_init(void) | ||||||
|  | { | ||||||
|  | 	const struct cust_emi_para *p = &emi_timing_m28w640hc; | ||||||
|  | 	struct emi_regs *emi_regs_p = (struct emi_regs *)CONFIG_SPEAR_EMIBASE; | ||||||
|  | 	unsigned int cs; | ||||||
|  | 	unsigned int val, tmp; | ||||||
|  | 
 | ||||||
|  | 	val = readl(CONFIG_SPEAR_RASBASE); | ||||||
|  | 
 | ||||||
|  | 	if (val & EMI_ACKMSK) | ||||||
|  | 		tmp = 0x3f; | ||||||
|  | 	else | ||||||
|  | 		tmp = 0x0; | ||||||
|  | 
 | ||||||
|  | 	writel(tmp, &emi_regs_p->ack); | ||||||
|  | 
 | ||||||
|  | 	for (cs = 0; cs < CONFIG_SYS_MAX_FLASH_BANKS; cs++) { | ||||||
|  | 		writel(p->tap, &emi_regs_p->bank_regs[cs].tap); | ||||||
|  | 		writel(p->tsdp, &emi_regs_p->bank_regs[cs].tsdp); | ||||||
|  | 		writel(p->tdpw, &emi_regs_p->bank_regs[cs].tdpw); | ||||||
|  | 		writel(p->tdpr, &emi_regs_p->bank_regs[cs].tdpr); | ||||||
|  | 		writel(p->tdcs, &emi_regs_p->bank_regs[cs].tdcs); | ||||||
|  | 		writel(EMI_CNTL_ENBBYTERW | ((val & 0x18) >> 3), | ||||||
|  | 		       &emi_regs_p->bank_regs[cs].control); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | int spear_board_init(ulong mach_type) | ||||||
|  | { | ||||||
|  | 	struct xloader_table *xloader_tb = | ||||||
|  | 	    (struct xloader_table *)XLOADER_TABLE_ADDRESS; | ||||||
|  | 	struct xloader_table_1_2 *table_1_2; | ||||||
|  | 	struct chip_data *chip = &chip_data; | ||||||
|  | 
 | ||||||
|  | 	gd->bd->bi_arch_number = mach_type; | ||||||
|  | 
 | ||||||
|  | 	/* adress of boot parameters */ | ||||||
|  | 	gd->bd->bi_boot_params = CONFIG_BOOT_PARAMS_ADDR; | ||||||
|  | 
 | ||||||
|  | 	/* CPU is initialized to work at 333MHz in Xloader */ | ||||||
|  | 	chip->cpufreq = 333; | ||||||
|  | 
 | ||||||
|  | 	if (XLOADER_TABLE_VERSION_1_2 == xloader_tb->table_version) { | ||||||
|  | 		table_1_2 = &xloader_tb->table.table_1_2; | ||||||
|  | 		memcpy(chip->version, table_1_2->version, | ||||||
|  | 		       sizeof(chip->version)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_SPEAR_EMI | ||||||
|  | 	spear_emi_init(); | ||||||
|  | #endif | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int i2c_read_mac(uchar *buffer) | ||||||
|  | { | ||||||
|  | 	u8 buf[2]; | ||||||
|  | 
 | ||||||
|  | 	i2c_read(CONFIG_I2C_CHIPADDRESS, MAGIC_OFF, 1, buf, MAGIC_LEN); | ||||||
|  | 
 | ||||||
|  | 	/* Check if mac in i2c memory is valid */ | ||||||
|  | 	if ((buf[0] == MAGIC_BYTE0) && (buf[1] == MAGIC_BYTE1)) { | ||||||
|  | 		/* Valid mac address is saved in i2c eeprom */ | ||||||
|  | 		i2c_read(CONFIG_I2C_CHIPADDRESS, MAC_OFF, 1, buffer, MAC_LEN); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int write_mac(uchar *mac) | ||||||
|  | { | ||||||
|  | 	u8 buf[2]; | ||||||
|  | 
 | ||||||
|  | 	buf[0] = (u8)MAGIC_BYTE0; | ||||||
|  | 	buf[1] = (u8)MAGIC_BYTE1; | ||||||
|  | 	i2c_write(CONFIG_I2C_CHIPADDRESS, MAGIC_OFF, 1, buf, MAGIC_LEN); | ||||||
|  | 
 | ||||||
|  | 	buf[0] = (u8)~MAGIC_BYTE0; | ||||||
|  | 	buf[1] = (u8)~MAGIC_BYTE1; | ||||||
|  | 
 | ||||||
|  | 	i2c_read(CONFIG_I2C_CHIPADDRESS, MAGIC_OFF, 1, buf, MAGIC_LEN); | ||||||
|  | 
 | ||||||
|  | 	/* check if valid MAC address is saved in I2C EEPROM or not? */ | ||||||
|  | 	if ((buf[0] == MAGIC_BYTE0) && (buf[1] == MAGIC_BYTE1)) { | ||||||
|  | 		i2c_write(CONFIG_I2C_CHIPADDRESS, MAC_OFF, 1, mac, MAC_LEN); | ||||||
|  | 		puts("I2C EEPROM written with mac address \n"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	puts("I2C EEPROM writing failed \n"); | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int do_chip_config(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) | ||||||
|  | { | ||||||
|  | 	void (*sram_setfreq) (unsigned int, unsigned int); | ||||||
|  | 	struct chip_data *chip = &chip_data; | ||||||
|  | 	unsigned char mac[6]; | ||||||
|  | 	unsigned int reg, frequency; | ||||||
|  | 	char *s, *e; | ||||||
|  | 	char i2c_mac[20]; | ||||||
|  | 
 | ||||||
|  | 	if ((argc > 3) || (argc < 2)) { | ||||||
|  | 		cmd_usage(cmdtp); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if ((!strcmp(argv[1], "cpufreq")) || (!strcmp(argv[1], "ddrfreq"))) { | ||||||
|  | 
 | ||||||
|  | 		frequency = simple_strtoul(argv[2], NULL, 0); | ||||||
|  | 
 | ||||||
|  | 		if (frequency > 333) { | ||||||
|  | 			printf("Frequency is limited to 333MHz\n"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		sram_setfreq = memcpy((void *)SRAM_REL, setfreq, setfreq_sz); | ||||||
|  | 
 | ||||||
|  | 		if (!strcmp(argv[1], "cpufreq")) { | ||||||
|  | 			sram_setfreq(CPU, frequency); | ||||||
|  | 			printf("CPU frequency changed to %u\n", frequency); | ||||||
|  | 
 | ||||||
|  | 			chip->cpufreq = frequency; | ||||||
|  | 		} else { | ||||||
|  | 			sram_setfreq(DDR, frequency); | ||||||
|  | 			printf("DDR frequency changed to %u\n", frequency); | ||||||
|  | 
 | ||||||
|  | 			chip->dramfreq = frequency; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return 0; | ||||||
|  | 	} else if (!strcmp(argv[1], "ethaddr")) { | ||||||
|  | 
 | ||||||
|  | 		s = argv[2]; | ||||||
|  | 		for (reg = 0; reg < 6; ++reg) { | ||||||
|  | 			mac[reg] = s ? simple_strtoul(s, &e, 16) : 0; | ||||||
|  | 			if (s) | ||||||
|  | 				s = (*e) ? e + 1 : e; | ||||||
|  | 		} | ||||||
|  | 		write_mac(mac); | ||||||
|  | 
 | ||||||
|  | 		return 0; | ||||||
|  | 	} else if (!strcmp(argv[1], "print")) { | ||||||
|  | 
 | ||||||
|  | 		if (chip->cpufreq == -1) | ||||||
|  | 			printf("CPU Freq    = Not Known\n"); | ||||||
|  | 		else | ||||||
|  | 			printf("CPU Freq    = %d MHz\n", chip->cpufreq); | ||||||
|  | 
 | ||||||
|  | 		if (chip->dramfreq == -1) | ||||||
|  | 			printf("DDR Freq    = Not Known\n"); | ||||||
|  | 		else | ||||||
|  | 			printf("DDR Freq    = %d MHz\n", chip->dramfreq); | ||||||
|  | 
 | ||||||
|  | 		if (chip->dramtype == DDRMOBILE) | ||||||
|  | 			printf("DDR Type    = MOBILE\n"); | ||||||
|  | 		else if (chip->dramtype == DDR2) | ||||||
|  | 			printf("DDR Type    = DDR2\n"); | ||||||
|  | 		else | ||||||
|  | 			printf("DDR Type    = Not Known\n"); | ||||||
|  | 
 | ||||||
|  | 		if (!i2c_read_mac(mac)) { | ||||||
|  | 			sprintf(i2c_mac, "%pM", mac); | ||||||
|  | 			printf("Ethaddr (from i2c mem) = %s\n", i2c_mac); | ||||||
|  | 		} else { | ||||||
|  | 			printf("Ethaddr (from i2c mem) = Not set\n"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		printf("Xloader Rev = %s\n", chip->version); | ||||||
|  | 
 | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cmd_usage(cmdtp); | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | U_BOOT_CMD(chip_config, 3, 1, do_chip_config, | ||||||
|  | 	   "configure chip", | ||||||
|  | 	   "chip_config cpufreq/ddrfreq frequency\n" | ||||||
|  | 	   "chip_config print"); | ||||||
|  | @ -0,0 +1,51 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2000-2004
 | ||||||
|  | # Wolfgang Denk, DENX Software Engineering, wd@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 $(TOPDIR)/config.mk | ||||||
|  | 
 | ||||||
|  | LIB	= $(obj)lib$(BOARD).a | ||||||
|  | 
 | ||||||
|  | COBJS	:= spear300.o | ||||||
|  | SOBJS	:= | ||||||
|  | 
 | ||||||
|  | SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) | ||||||
|  | OBJS	:= $(addprefix $(obj),$(COBJS)) | ||||||
|  | SOBJS	:= $(addprefix $(obj),$(SOBJS)) | ||||||
|  | 
 | ||||||
|  | $(LIB):	$(obj).depend $(OBJS) $(SOBJS) | ||||||
|  | 	$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | 	rm -f $(SOBJS) $(OBJS) | ||||||
|  | 
 | ||||||
|  | distclean:	clean | ||||||
|  | 	rm -f $(LIB) core *.bak $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | 
 | ||||||
|  | # defines $(obj).depend target
 | ||||||
|  | include $(SRCTREE)/rules.mk | ||||||
|  | 
 | ||||||
|  | sinclude $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | @ -0,0 +1,39 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2009
 | ||||||
|  | # Vipin Kumar, ST Microelectronics <vipin.kumar@st.com>
 | ||||||
|  | #
 | ||||||
|  | # 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
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | 
 | ||||||
|  | TEXT_BASE = 0x00700000 | ||||||
|  | 
 | ||||||
|  | ALL += $(obj)u-boot.img | ||||||
|  | 
 | ||||||
|  | # Environment variables in NAND
 | ||||||
|  | ifeq ($(ENV),NAND) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_ENV_IS_IN_NAND | ||||||
|  | else | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_ENV_IS_IN_FLASH | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | ifeq ($(CONSOLE),USB) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_SPEAR_USBTTY | ||||||
|  | endif | ||||||
|  | @ -0,0 +1,58 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 <nand.h> | ||||||
|  | #include <asm/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_defs.h> | ||||||
|  | #include <asm/arch/spr_misc.h> | ||||||
|  | #include <asm/arch/spr_nand.h> | ||||||
|  | 
 | ||||||
|  | int board_init(void) | ||||||
|  | { | ||||||
|  | 	return spear_board_init(MACH_TYPE_SPEAR300); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * board_nand_init - Board specific NAND initialization | ||||||
|  |  * @nand:	mtd private chip structure | ||||||
|  |  * | ||||||
|  |  * Called by nand_init_chip to initialize the board specific functions | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | int board_nand_init(struct nand_chip *nand) | ||||||
|  | { | ||||||
|  | 	struct misc_regs *const misc_regs_p = | ||||||
|  | 	    (struct misc_regs *)CONFIG_SPEAR_MISCBASE; | ||||||
|  | 
 | ||||||
|  | 	if (((readl(&misc_regs_p->auto_cfg_reg) & MISC_SOCCFGMSK) == | ||||||
|  | 	     MISC_SOCCFG30) || | ||||||
|  | 	    ((readl(&misc_regs_p->auto_cfg_reg) & MISC_SOCCFGMSK) == | ||||||
|  | 	     MISC_SOCCFG31)) { | ||||||
|  | 
 | ||||||
|  | 		return spear_nand_init(nand); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,51 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2000-2004
 | ||||||
|  | # Wolfgang Denk, DENX Software Engineering, wd@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 $(TOPDIR)/config.mk | ||||||
|  | 
 | ||||||
|  | LIB	= $(obj)lib$(BOARD).a | ||||||
|  | 
 | ||||||
|  | COBJS	:= spear310.o | ||||||
|  | SOBJS	:= | ||||||
|  | 
 | ||||||
|  | SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) | ||||||
|  | OBJS	:= $(addprefix $(obj),$(COBJS)) | ||||||
|  | SOBJS	:= $(addprefix $(obj),$(SOBJS)) | ||||||
|  | 
 | ||||||
|  | $(LIB):	$(obj).depend $(OBJS) $(SOBJS) | ||||||
|  | 	$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | 	rm -f $(SOBJS) $(OBJS) | ||||||
|  | 
 | ||||||
|  | distclean:	clean | ||||||
|  | 	rm -f $(LIB) core *.bak $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | 
 | ||||||
|  | # defines $(obj).depend target
 | ||||||
|  | include $(SRCTREE)/rules.mk | ||||||
|  | 
 | ||||||
|  | sinclude $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | @ -0,0 +1,44 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2009
 | ||||||
|  | # Vipin Kumar, ST Microelectronics <vipin.kumar@st.com>
 | ||||||
|  | #
 | ||||||
|  | # 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
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | 
 | ||||||
|  | TEXT_BASE = 0x00700000 | ||||||
|  | 
 | ||||||
|  | ALL += $(obj)u-boot.img | ||||||
|  | 
 | ||||||
|  | # Environment variables in NAND
 | ||||||
|  | ifeq ($(ENV),NAND) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_ENV_IS_IN_NAND | ||||||
|  | else | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_ENV_IS_IN_FLASH | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Support parallel flash
 | ||||||
|  | ifeq ($(FLASH),PNOR) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_FLASH_PNOR | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | ifeq ($(CONSOLE),USB) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_SPEAR_USBTTY | ||||||
|  | endif | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Ryan Chen, ST Micoelectronics, ryan.chen@st.com. | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 <nand.h> | ||||||
|  | #include <asm/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_defs.h> | ||||||
|  | #include <asm/arch/spr_misc.h> | ||||||
|  | #include <asm/arch/spr_nand.h> | ||||||
|  | 
 | ||||||
|  | int board_init(void) | ||||||
|  | { | ||||||
|  | 	return spear_board_init(MACH_TYPE_SPEAR300); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * board_nand_init - Board specific NAND initialization | ||||||
|  |  * @nand:	mtd private chip structure | ||||||
|  |  * | ||||||
|  |  * Called by nand_init_chip to initialize the board specific functions | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | int board_nand_init(struct nand_chip *nand) | ||||||
|  | { | ||||||
|  | 	struct misc_regs *const misc_regs_p = | ||||||
|  | 	    (struct misc_regs *)CONFIG_SPEAR_MISCBASE; | ||||||
|  | 
 | ||||||
|  | 	if (((readl(&misc_regs_p->auto_cfg_reg) & MISC_SOCCFGMSK) == | ||||||
|  | 	     MISC_SOCCFG30) || | ||||||
|  | 	    ((readl(&misc_regs_p->auto_cfg_reg) & MISC_SOCCFGMSK) == | ||||||
|  | 	     MISC_SOCCFG31)) { | ||||||
|  | 
 | ||||||
|  | 		return spear_nand_init(nand); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,51 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2000-2004
 | ||||||
|  | # Wolfgang Denk, DENX Software Engineering, wd@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 $(TOPDIR)/config.mk | ||||||
|  | 
 | ||||||
|  | LIB	= $(obj)lib$(BOARD).a | ||||||
|  | 
 | ||||||
|  | COBJS	:= spear320.o | ||||||
|  | SOBJS	:= | ||||||
|  | 
 | ||||||
|  | SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) | ||||||
|  | OBJS	:= $(addprefix $(obj),$(COBJS)) | ||||||
|  | SOBJS	:= $(addprefix $(obj),$(SOBJS)) | ||||||
|  | 
 | ||||||
|  | $(LIB):	$(obj).depend $(OBJS) $(SOBJS) | ||||||
|  | 	$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | 	rm -f $(SOBJS) $(OBJS) | ||||||
|  | 
 | ||||||
|  | distclean:	clean | ||||||
|  | 	rm -f $(LIB) core *.bak $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | 
 | ||||||
|  | # defines $(obj).depend target
 | ||||||
|  | include $(SRCTREE)/rules.mk | ||||||
|  | 
 | ||||||
|  | sinclude $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | @ -0,0 +1,44 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2009
 | ||||||
|  | # Vipin Kumar, ST Microelectronics <vipin.kumar@st.com>
 | ||||||
|  | #
 | ||||||
|  | # 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
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | 
 | ||||||
|  | TEXT_BASE = 0x00700000 | ||||||
|  | 
 | ||||||
|  | ALL += $(obj)u-boot.img | ||||||
|  | 
 | ||||||
|  | # Environment variables in NAND
 | ||||||
|  | ifeq ($(ENV),NAND) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_ENV_IS_IN_NAND | ||||||
|  | else | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_ENV_IS_IN_FLASH | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | # Support parallel flash
 | ||||||
|  | ifeq ($(FLASH),PNOR) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_FLASH_PNOR | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | ifeq ($(CONSOLE),USB) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_SPEAR_USBTTY | ||||||
|  | endif | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Ryan Chen, ST Micoelectronics, ryan.chen@st.com. | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 <nand.h> | ||||||
|  | #include <asm/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_defs.h> | ||||||
|  | #include <asm/arch/spr_misc.h> | ||||||
|  | #include <asm/arch/spr_nand.h> | ||||||
|  | 
 | ||||||
|  | int board_init(void) | ||||||
|  | { | ||||||
|  | 	return spear_board_init(MACH_TYPE_SPEAR300); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * board_nand_init - Board specific NAND initialization | ||||||
|  |  * @nand:	mtd private chip structure | ||||||
|  |  * | ||||||
|  |  * Called by nand_init_chip to initialize the board specific functions | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | int board_nand_init(struct nand_chip *nand) | ||||||
|  | { | ||||||
|  | 	struct misc_regs *const misc_regs_p = | ||||||
|  | 	    (struct misc_regs *)CONFIG_SPEAR_MISCBASE; | ||||||
|  | 
 | ||||||
|  | 	if (((readl(&misc_regs_p->auto_cfg_reg) & MISC_SOCCFGMSK) == | ||||||
|  | 	     MISC_SOCCFG30) || | ||||||
|  | 	    ((readl(&misc_regs_p->auto_cfg_reg) & MISC_SOCCFGMSK) == | ||||||
|  | 	     MISC_SOCCFG31)) { | ||||||
|  | 
 | ||||||
|  | 		return spear_nand_init(nand); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,51 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2000-2004
 | ||||||
|  | # Wolfgang Denk, DENX Software Engineering, wd@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 $(TOPDIR)/config.mk | ||||||
|  | 
 | ||||||
|  | LIB	= $(obj)lib$(BOARD).a | ||||||
|  | 
 | ||||||
|  | COBJS	:= spear600.o | ||||||
|  | SOBJS	:= | ||||||
|  | 
 | ||||||
|  | SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) | ||||||
|  | OBJS	:= $(addprefix $(obj),$(COBJS)) | ||||||
|  | SOBJS	:= $(addprefix $(obj),$(SOBJS)) | ||||||
|  | 
 | ||||||
|  | $(LIB):	$(obj).depend $(OBJS) $(SOBJS) | ||||||
|  | 	$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | 	rm -f $(SOBJS) $(OBJS) | ||||||
|  | 
 | ||||||
|  | distclean:	clean | ||||||
|  | 	rm -f $(LIB) core *.bak $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | 
 | ||||||
|  | # defines $(obj).depend target
 | ||||||
|  | include $(SRCTREE)/rules.mk | ||||||
|  | 
 | ||||||
|  | sinclude $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | @ -0,0 +1,39 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2009
 | ||||||
|  | # Vipin Kumar, ST Microelectronics <vipin.kumar@st.com>
 | ||||||
|  | #
 | ||||||
|  | # 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
 | ||||||
|  | #
 | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | 
 | ||||||
|  | TEXT_BASE = 0x00700000 | ||||||
|  | 
 | ||||||
|  | ALL += $(obj)u-boot.img | ||||||
|  | 
 | ||||||
|  | # Environment variables in NAND
 | ||||||
|  | ifeq ($(ENV),NAND) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_ENV_IS_IN_NAND | ||||||
|  | else | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_ENV_IS_IN_FLASH | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | ifeq ($(CONSOLE),USB) | ||||||
|  | PLATFORM_RELFLAGS += -DCONFIG_SPEAR_USBTTY | ||||||
|  | endif | ||||||
|  | @ -0,0 +1,53 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 <nand.h> | ||||||
|  | #include <asm/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_defs.h> | ||||||
|  | #include <asm/arch/spr_misc.h> | ||||||
|  | #include <asm/arch/spr_nand.h> | ||||||
|  | 
 | ||||||
|  | int board_init(void) | ||||||
|  | { | ||||||
|  | 	return spear_board_init(MACH_TYPE_SPEAR600); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * board_nand_init - Board specific NAND initialization | ||||||
|  |  * @nand:	mtd private chip structure | ||||||
|  |  * | ||||||
|  |  * Called by nand_init_chip to initialize the board specific functions | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | int board_nand_init(struct nand_chip *nand) | ||||||
|  | { | ||||||
|  | 	struct misc_regs *const misc_regs_p = | ||||||
|  | 	    (struct misc_regs *)CONFIG_SPEAR_MISCBASE; | ||||||
|  | 
 | ||||||
|  | 	if (!(readl(&misc_regs_p->auto_cfg_reg) & MISC_NANDDIS)) | ||||||
|  | 		return spear_nand_init(nand); | ||||||
|  | 
 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | @ -26,8 +26,8 @@ include $(TOPDIR)/config.mk | ||||||
| 
 | 
 | ||||||
| LIB	= $(obj)lib$(SOC).a | LIB	= $(obj)lib$(SOC).a | ||||||
| 
 | 
 | ||||||
| COBJS-y	= dram.o | COBJS-y	= cpu.o | ||||||
| COBJS-y	+= cpu.o | COBJS-y	+= dram.o | ||||||
| COBJS-y	+= mpp.o | COBJS-y	+= mpp.o | ||||||
| COBJS-y	+= timer.o | COBJS-y	+= timer.o | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,52 @@ | ||||||
|  | #
 | ||||||
|  | # (C) Copyright 2000-2006
 | ||||||
|  | # Wolfgang Denk, DENX Software Engineering, wd@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 $(TOPDIR)/config.mk | ||||||
|  | 
 | ||||||
|  | LIB	= $(obj)lib$(SOC).a | ||||||
|  | 
 | ||||||
|  | COBJS	:= reset.o \
 | ||||||
|  | 	   timer.o | ||||||
|  | SOBJS	:= | ||||||
|  | 
 | ||||||
|  | SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) | ||||||
|  | OBJS	:= $(addprefix $(obj),$(COBJS)) | ||||||
|  | SOBJS	:= $(addprefix $(obj),$(SOBJS)) | ||||||
|  | 
 | ||||||
|  | $(LIB):	$(obj).depend $(OBJS) $(SOBJS) | ||||||
|  | 	$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) | ||||||
|  | 
 | ||||||
|  | clean: | ||||||
|  | 	rm -f $(SOBJS) $(OBJS) | ||||||
|  | 
 | ||||||
|  | distclean:	clean | ||||||
|  | 	rm -f $(LIB) core *.bak $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | 
 | ||||||
|  | # defines $(obj).depend target
 | ||||||
|  | include $(SRCTREE)/rules.mk | ||||||
|  | 
 | ||||||
|  | sinclude $(obj).depend | ||||||
|  | 
 | ||||||
|  | #########################################################################
 | ||||||
|  | @ -0,0 +1,54 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_syscntl.h> | ||||||
|  | 
 | ||||||
|  | void reset_cpu(ulong ignored) | ||||||
|  | { | ||||||
|  | 	struct syscntl_regs *syscntl_regs_p = | ||||||
|  | 	    (struct syscntl_regs *)CONFIG_SPEAR_SYSCNTLBASE; | ||||||
|  | 
 | ||||||
|  | 	printf("System is going to reboot ...\n"); | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * This 1 second delay will allow the above message | ||||||
|  | 	 * to be printed before reset | ||||||
|  | 	 */ | ||||||
|  | 	udelay((1000 * 1000)); | ||||||
|  | 
 | ||||||
|  | 	/* Going into slow mode before resetting SOC */ | ||||||
|  | 	writel(0x02, &syscntl_regs_p->scctrl); | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * Writing any value to the system status register will | ||||||
|  | 	 * reset the SoC | ||||||
|  | 	 */ | ||||||
|  | 	writel(0x00, &syscntl_regs_p->scsysstat); | ||||||
|  | 
 | ||||||
|  | 	/* system will restart */ | ||||||
|  | 	while (1) | ||||||
|  | 		; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,153 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_gpt.h> | ||||||
|  | #include <asm/arch/spr_misc.h> | ||||||
|  | 
 | ||||||
|  | #define GPT_RESOLUTION	(CONFIG_SPEAR_HZ_CLOCK / CONFIG_SPEAR_HZ) | ||||||
|  | #define READ_TIMER()	(readl(&gpt_regs_p->count) & GPT_FREE_RUNNING) | ||||||
|  | 
 | ||||||
|  | static struct gpt_regs *const gpt_regs_p = | ||||||
|  |     (struct gpt_regs *)CONFIG_SPEAR_TIMERBASE; | ||||||
|  | 
 | ||||||
|  | static struct misc_regs *const misc_regs_p = | ||||||
|  |     (struct misc_regs *)CONFIG_SPEAR_MISCBASE; | ||||||
|  | 
 | ||||||
|  | static ulong timestamp; | ||||||
|  | static ulong lastdec; | ||||||
|  | 
 | ||||||
|  | int timer_init(void) | ||||||
|  | { | ||||||
|  | 	u32 synth; | ||||||
|  | 
 | ||||||
|  | 	/* Prescaler setting */ | ||||||
|  | #if defined(CONFIG_SPEAR3XX) | ||||||
|  | 	writel(MISC_PRSC_CFG, &misc_regs_p->prsc2_clk_cfg); | ||||||
|  | 	synth = MISC_GPT4SYNTH; | ||||||
|  | #elif defined(CONFIG_SPEAR600) | ||||||
|  | 	writel(MISC_PRSC_CFG, &misc_regs_p->prsc1_clk_cfg); | ||||||
|  | 	synth = MISC_GPT3SYNTH; | ||||||
|  | #else | ||||||
|  | # error Incorrect config. Can only be spear{600|300|310|320} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 	writel(readl(&misc_regs_p->periph_clk_cfg) | synth, | ||||||
|  | 	       &misc_regs_p->periph_clk_cfg); | ||||||
|  | 
 | ||||||
|  | 	/* disable timers */ | ||||||
|  | 	writel(GPT_PRESCALER_1 | GPT_MODE_AUTO_RELOAD, &gpt_regs_p->control); | ||||||
|  | 
 | ||||||
|  | 	/* load value for free running */ | ||||||
|  | 	writel(GPT_FREE_RUNNING, &gpt_regs_p->compare); | ||||||
|  | 
 | ||||||
|  | 	/* auto reload, start timer */ | ||||||
|  | 	writel(readl(&gpt_regs_p->control) | GPT_ENABLE, &gpt_regs_p->control); | ||||||
|  | 
 | ||||||
|  | 	reset_timer_masked(); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * timer without interrupts | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | void reset_timer(void) | ||||||
|  | { | ||||||
|  | 	reset_timer_masked(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ulong get_timer(ulong base) | ||||||
|  | { | ||||||
|  | 	return (get_timer_masked() / GPT_RESOLUTION) - base; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void set_timer(ulong t) | ||||||
|  | { | ||||||
|  | 	timestamp = t; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void __udelay(unsigned long usec) | ||||||
|  | { | ||||||
|  | 	ulong tmo; | ||||||
|  | 	ulong start = get_timer_masked(); | ||||||
|  | 	ulong tenudelcnt = CONFIG_SPEAR_HZ_CLOCK / (1000 * 100); | ||||||
|  | 	ulong rndoff; | ||||||
|  | 
 | ||||||
|  | 	rndoff = (usec % 10) ? 1 : 0; | ||||||
|  | 
 | ||||||
|  | 	/* tenudelcnt timer tick gives 10 microsecconds delay */ | ||||||
|  | 	tmo = ((usec / 10) + rndoff) * tenudelcnt; | ||||||
|  | 
 | ||||||
|  | 	while ((ulong) (get_timer_masked() - start) < tmo) | ||||||
|  | 		; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void reset_timer_masked(void) | ||||||
|  | { | ||||||
|  | 	/* reset time */ | ||||||
|  | 	lastdec = READ_TIMER(); | ||||||
|  | 	timestamp = 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ulong get_timer_masked(void) | ||||||
|  | { | ||||||
|  | 	ulong now = READ_TIMER(); | ||||||
|  | 
 | ||||||
|  | 	if (now >= lastdec) { | ||||||
|  | 		/* normal mode */ | ||||||
|  | 		timestamp += now - lastdec; | ||||||
|  | 	} else { | ||||||
|  | 		/* we have an overflow ... */ | ||||||
|  | 		timestamp += now + GPT_FREE_RUNNING - lastdec; | ||||||
|  | 	} | ||||||
|  | 	lastdec = now; | ||||||
|  | 
 | ||||||
|  | 	return timestamp; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void udelay_masked(unsigned long usec) | ||||||
|  | { | ||||||
|  | 	return udelay(usec); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * This function is derived from PowerPC code (read timebase as long long). | ||||||
|  |  * On ARM it just returns the timer value. | ||||||
|  |  */ | ||||||
|  | unsigned long long get_ticks(void) | ||||||
|  | { | ||||||
|  | 	return get_timer(0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * This function is derived from PowerPC code (timebase clock frequency). | ||||||
|  |  * On ARM it returns the number of timer ticks per second. | ||||||
|  |  */ | ||||||
|  | ulong get_tbclk(void) | ||||||
|  | { | ||||||
|  | 	return CONFIG_SPEAR_HZ; | ||||||
|  | } | ||||||
|  | @ -28,9 +28,9 @@ include $(TOPDIR)/config.mk | ||||||
| 
 | 
 | ||||||
| LIB	= $(obj)lib$(SOC).a | LIB	= $(obj)lib$(SOC).a | ||||||
| 
 | 
 | ||||||
| SOBJS	= reset.o | SOBJS	= cache.o | ||||||
|  | SOBJS	+= reset.o | ||||||
| 
 | 
 | ||||||
| COBJS	+= cache.o |  | ||||||
| COBJS	+= clock.o | COBJS	+= clock.o | ||||||
| COBJS	+= cpu_info.o | COBJS	+= cpu_info.o | ||||||
| COBJS	+= timer.o | COBJS	+= timer.o | ||||||
|  |  | ||||||
|  | @ -0,0 +1,120 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (C) 2009 Samsung Electronics | ||||||
|  |  * Minkyu Kang <mk7.kang@samsung.com>
 | ||||||
|  |  * | ||||||
|  |  * based on cpu/arm_cortexa8/omap3/cache.S | ||||||
|  |  * | ||||||
|  |  * 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 <asm/arch/cpu.h> | ||||||
|  | 
 | ||||||
|  | .align 5
 | ||||||
|  | .global invalidate_dcache
 | ||||||
|  | .global l2_cache_enable
 | ||||||
|  | .global l2_cache_disable
 | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  |  * invalidate_dcache() | ||||||
|  |  * Invalidate the whole D-cache. | ||||||
|  |  * | ||||||
|  |  * Corrupted registers: r0-r5, r7, r9-r11 | ||||||
|  |  */ | ||||||
|  | invalidate_dcache: | ||||||
|  | 	stmfd	r13!, {r0 - r5, r7, r9 - r12, r14} | ||||||
|  | 
 | ||||||
|  | 	cmp	r0, #0xC100			@ check if the cpu is s5pc100
 | ||||||
|  | 
 | ||||||
|  | 	beq	finished_inval			@ s5pc100 doesn't need this
 | ||||||
|  | 						@ routine
 | ||||||
|  | 	mrc	p15, 1, r0, c0, c0, 1		@ read clidr
 | ||||||
|  | 	ands	r3, r0, #0x7000000		@ extract loc from clidr
 | ||||||
|  | 	mov	r3, r3, lsr #23			@ left align loc bit field
 | ||||||
|  | 	beq	finished_inval			@ if loc is 0, then no need to
 | ||||||
|  | 						@ clean
 | ||||||
|  | 	mov	r10, #0				@ start clean at cache level 0
 | ||||||
|  | inval_loop1: | ||||||
|  | 	add	r2, r10, r10, lsr #1		@ work out 3x current cache
 | ||||||
|  | 						@ level
 | ||||||
|  | 	mov	r1, r0, lsr r2			@ extract cache type bits from
 | ||||||
|  | 						@ clidr
 | ||||||
|  | 	and	r1, r1, #7			@ mask of the bits for current
 | ||||||
|  | 						@ cache only
 | ||||||
|  | 	cmp	r1, #2				@ see what cache we have at
 | ||||||
|  | 						@ this level
 | ||||||
|  | 	blt	skip_inval			@ skip if no cache, or just
 | ||||||
|  | 						@ i-cache
 | ||||||
|  | 	mcr	p15, 2, r10, c0, c0, 0		@ select current cache level
 | ||||||
|  | 						@ in cssr
 | ||||||
|  | 	mov	r2, #0				@ operand for mcr SBZ
 | ||||||
|  | 	mcr	p15, 0, r2, c7, c5, 4		@ flush prefetch buffer to
 | ||||||
|  | 						@ sych the new cssr&csidr,
 | ||||||
|  | 						@ with armv7 this is 'isb',
 | ||||||
|  | 						@ but we compile with armv5
 | ||||||
|  | 	mrc	p15, 1, r1, c0, c0, 0		@ read the new csidr
 | ||||||
|  | 	and	r2, r1, #7			@ extract the length of the
 | ||||||
|  | 						@ cache lines
 | ||||||
|  | 	add	r2, r2, #4			@ add 4 (line length offset)
 | ||||||
|  | 	ldr	r4, =0x3ff | ||||||
|  | 	ands	r4, r4, r1, lsr #3		@ find maximum number on the
 | ||||||
|  | 						@ way size
 | ||||||
|  | 	clz	r5, r4				@ find bit position of way
 | ||||||
|  | 						@ size increment
 | ||||||
|  | 	ldr	r7, =0x7fff | ||||||
|  | 	ands	r7, r7, r1, lsr #13		@ extract max number of the
 | ||||||
|  | 						@ index size
 | ||||||
|  | inval_loop2: | ||||||
|  | 	mov	r9, r4				@ create working copy of max
 | ||||||
|  | 						@ way size
 | ||||||
|  | inval_loop3: | ||||||
|  | 	orr	r11, r10, r9, lsl r5		@ factor way and cache number
 | ||||||
|  | 						@ into r11
 | ||||||
|  | 	orr	r11, r11, r7, lsl r2		@ factor index number into r11
 | ||||||
|  | 	mcr	p15, 0, r11, c7, c6, 2		@ invalidate by set/way
 | ||||||
|  | 	subs	r9, r9, #1			@ decrement the way
 | ||||||
|  | 	bge	inval_loop3 | ||||||
|  | 	subs	r7, r7, #1			@ decrement the index
 | ||||||
|  | 	bge	inval_loop2 | ||||||
|  | skip_inval: | ||||||
|  | 	add	r10, r10, #2			@ increment cache number
 | ||||||
|  | 	cmp	r3, r10 | ||||||
|  | 	bgt	inval_loop1 | ||||||
|  | finished_inval: | ||||||
|  | 	mov	r10, #0				@ swith back to cache level 0
 | ||||||
|  | 	mcr	p15, 2, r10, c0, c0, 0		@ select current cache level
 | ||||||
|  | 						@ in cssr
 | ||||||
|  | 	mcr	p15, 0, r10, c7, c5, 4		@ flush prefetch buffer,
 | ||||||
|  | 						@ with armv7 this is 'isb',
 | ||||||
|  | 						@ but we compile with armv5
 | ||||||
|  | 
 | ||||||
|  | 	ldmfd	r13!, {r0 - r5, r7, r9 - r12, pc} | ||||||
|  | 
 | ||||||
|  | l2_cache_enable: | ||||||
|  | 	push	{r0, r1, r2, lr} | ||||||
|  | 	mrc	15, 0, r3, cr1, cr0, 1 | ||||||
|  | 	orr	r3, r3, #2 | ||||||
|  | 	mcr	15, 0, r3, cr1, cr0, 1 | ||||||
|  | 	pop	{r1, r2, r3, pc} | ||||||
|  | 
 | ||||||
|  | l2_cache_disable: | ||||||
|  | 	push	{r0, r1, r2, lr} | ||||||
|  | 	mrc	15, 0, r3, cr1, cr0, 1 | ||||||
|  | 	bic	r3, r3, #2 | ||||||
|  | 	mcr	15, 0, r3, cr1, cr0, 1 | ||||||
|  | 	pop	{r1, r2, r3, pc} | ||||||
|  | @ -0,0 +1,48 @@ | ||||||
|  | 
 | ||||||
|  | SPEAr (Structured Processor Enhanced Architecture). | ||||||
|  | 
 | ||||||
|  | SPEAr600 is also known as SPEArPlus and SPEAr300 is also known as SPEArBasic | ||||||
|  | 
 | ||||||
|  | The SPEAr SoC family embeds a customizable logic that can be programmed | ||||||
|  | one-time by a customer at silicon mask level (i.e. not at runtime!). | ||||||
|  | 
 | ||||||
|  | We are now adding the support in u-boot for two SoC: SPEAr600 and SPEAr3xx. | ||||||
|  | 
 | ||||||
|  | All 4 SoCs share common peripherals. | ||||||
|  | 
 | ||||||
|  | 1. ARM926ejs core based (sp600 has two cores, the 2nd handled only in Linux) | ||||||
|  | 2. FastEthernet (sp600 has Gbit version, but same controller - GMAC) | ||||||
|  | 3. USB Host | ||||||
|  | 4. USB Device | ||||||
|  | 5. NAND controller (FSMC) | ||||||
|  | 6. Serial NOR ctrl | ||||||
|  | 7. I2C | ||||||
|  | 8. SPI | ||||||
|  | 9. CLCD | ||||||
|  | 10. others .. | ||||||
|  | 
 | ||||||
|  | Everything is supported in Linux. | ||||||
|  | u-boot is not currently supporting all peripeharls (just a few as listed below). | ||||||
|  | 1. USB Device | ||||||
|  | 2. NAND controller (FSMC) | ||||||
|  | 3. Serial Memory Interface | ||||||
|  | 4. EMI (Parallel NOR interface) | ||||||
|  | 4. I2C | ||||||
|  | 5. UART | ||||||
|  | 
 | ||||||
|  | Build options | ||||||
|  | 	make spear600_config | ||||||
|  | 	make spear300_config | ||||||
|  | 	make spear310_config | ||||||
|  | 	make spear320_config | ||||||
|  | 
 | ||||||
|  | Further options | ||||||
|  | 	make ENV=NAND (supported by all 4 SoCs) | ||||||
|  | 	- This option generates a uboot image that saves environment inn NAND | ||||||
|  | 
 | ||||||
|  | 	make CONSOLE=USB (supported by all 4 SoCs) | ||||||
|  | 	- This option generates a uboot image for using usbdevice as a tty i/f | ||||||
|  | 
 | ||||||
|  | 	make FLASH=PNOR (supported by SPEAr310 and SPEAr320) | ||||||
|  | 	- This option generates a uboot image that supports emi controller for | ||||||
|  | 	CFI compliant parallel NOR flash | ||||||
|  | @ -3,9 +3,23 @@ | ||||||
|  * |  * | ||||||
|  * Marvell Orion SoC GPIO handling. |  * Marvell Orion SoC GPIO handling. | ||||||
|  * |  * | ||||||
|  * This file is licensed under the terms of the GNU General Public |  * See file CREDITS for list of people who contributed to this | ||||||
|  * License version 2.  This program is licensed "as is" without any |  * project. | ||||||
|  * warranty of any kind, whether express or implied. |  * | ||||||
|  |  * 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., 51 Franklin Street, Fifth Floor, Boston, | ||||||
|  |  * MA 02110-1301 USA | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
|  | @ -37,6 +37,7 @@ COBJS-$(CONFIG_PCA9564_I2C) += pca9564_i2c.o | ||||||
| COBJS-$(CONFIG_DRIVER_S3C24X0_I2C) += s3c24x0_i2c.o | COBJS-$(CONFIG_DRIVER_S3C24X0_I2C) += s3c24x0_i2c.o | ||||||
| COBJS-$(CONFIG_S3C44B0_I2C) += s3c44b0_i2c.o | COBJS-$(CONFIG_S3C44B0_I2C) += s3c44b0_i2c.o | ||||||
| COBJS-$(CONFIG_SOFT_I2C) += soft_i2c.o | COBJS-$(CONFIG_SOFT_I2C) += soft_i2c.o | ||||||
|  | COBJS-$(CONFIG_SPEAR_I2C) += spr_i2c.o | ||||||
| COBJS-$(CONFIG_TSI108_I2C) += tsi108_i2c.o | COBJS-$(CONFIG_TSI108_I2C) += tsi108_i2c.o | ||||||
| 
 | 
 | ||||||
| COBJS	:= $(COBJS-y) | COBJS	:= $(COBJS-y) | ||||||
|  |  | ||||||
|  | @ -5,16 +5,29 @@ | ||||||
|  * |  * | ||||||
|  * Based on: |  * Based on: | ||||||
|  * Author: Mark A. Greer <mgreer@mvista.com> |  * Author: Mark A. Greer <mgreer@mvista.com> | ||||||
|  |  * 2005 (c) MontaVista, Software, Inc. | ||||||
|  * |  * | ||||||
|  * 2005 (c) MontaVista, Software, Inc.  This file is licensed under |  * See file CREDITS for list of people who contributed to this | ||||||
|  * the terms of the GNU General Public License version 2.  This program |  * project. | ||||||
|  * is licensed "as is" without any warranty of any kind, whether express |  * | ||||||
|  * or implied. |  * 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., 51 Franklin Street, Fifth Floor, Boston, | ||||||
|  |  * MA 02110-1301 USA | ||||||
|  * |  * | ||||||
|  * ported from Linux to u-boot |  * ported from Linux to u-boot | ||||||
|  * (C) Copyright 2009 |  * (C) Copyright 2009 | ||||||
|  * Heiko Schocher, DENX Software Engineering, hs@denx.de. |  * Heiko Schocher, DENX Software Engineering, hs@denx.de. | ||||||
|  * |  | ||||||
|  */ |  */ | ||||||
| #include <common.h> | #include <common.h> | ||||||
| #include <i2c.h> | #include <i2c.h> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,331 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_i2c.h> | ||||||
|  | 
 | ||||||
|  | static struct i2c_regs *const i2c_regs_p = | ||||||
|  |     (struct i2c_regs *)CONFIG_SYS_I2C_BASE; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * set_speed - Set the i2c speed mode (standard, high, fast) | ||||||
|  |  * @i2c_spd:	required i2c speed mode | ||||||
|  |  * | ||||||
|  |  * Set the i2c speed mode (standard, high, fast) | ||||||
|  |  */ | ||||||
|  | static void set_speed(int i2c_spd) | ||||||
|  | { | ||||||
|  | 	unsigned int cntl; | ||||||
|  | 	unsigned int hcnt, lcnt; | ||||||
|  | 	unsigned int high, low; | ||||||
|  | 
 | ||||||
|  | 	cntl = (readl(&i2c_regs_p->ic_con) & (~IC_CON_SPD_MSK)); | ||||||
|  | 
 | ||||||
|  | 	switch (i2c_spd) { | ||||||
|  | 	case IC_SPEED_MODE_MAX: | ||||||
|  | 		cntl |= IC_CON_SPD_HS; | ||||||
|  | 		high = MIN_HS_SCL_HIGHTIME; | ||||||
|  | 		low = MIN_HS_SCL_LOWTIME; | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case IC_SPEED_MODE_STANDARD: | ||||||
|  | 		cntl |= IC_CON_SPD_SS; | ||||||
|  | 		high = MIN_SS_SCL_HIGHTIME; | ||||||
|  | 		low = MIN_SS_SCL_LOWTIME; | ||||||
|  | 		break; | ||||||
|  | 
 | ||||||
|  | 	case IC_SPEED_MODE_FAST: | ||||||
|  | 	default: | ||||||
|  | 		cntl |= IC_CON_SPD_FS; | ||||||
|  | 		high = MIN_FS_SCL_HIGHTIME; | ||||||
|  | 		low = MIN_FS_SCL_LOWTIME; | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	writel(cntl, &i2c_regs_p->ic_con); | ||||||
|  | 
 | ||||||
|  | 	hcnt = (IC_CLK * high) / NANO_TO_MICRO; | ||||||
|  | 	writel(hcnt, &i2c_regs_p->ic_fs_scl_hcnt); | ||||||
|  | 
 | ||||||
|  | 	lcnt = (IC_CLK * low) / NANO_TO_MICRO; | ||||||
|  | 	writel(lcnt, &i2c_regs_p->ic_fs_scl_lcnt); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * i2c_set_bus_speed - Set the i2c speed | ||||||
|  |  * @speed:	required i2c speed | ||||||
|  |  * | ||||||
|  |  * Set the i2c speed. | ||||||
|  |  */ | ||||||
|  | void i2c_set_bus_speed(int speed) | ||||||
|  | { | ||||||
|  | 	if (speed >= I2C_MAX_SPEED) | ||||||
|  | 		set_speed(IC_SPEED_MODE_MAX); | ||||||
|  | 	else if (speed >= I2C_FAST_SPEED) | ||||||
|  | 		set_speed(IC_SPEED_MODE_FAST); | ||||||
|  | 	else | ||||||
|  | 		set_speed(IC_SPEED_MODE_STANDARD); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * i2c_get_bus_speed - Gets the i2c speed | ||||||
|  |  * | ||||||
|  |  * Gets the i2c speed. | ||||||
|  |  */ | ||||||
|  | int i2c_get_bus_speed(void) | ||||||
|  | { | ||||||
|  | 	u32 cntl; | ||||||
|  | 
 | ||||||
|  | 	cntl = (readl(&i2c_regs_p->ic_con) & IC_CON_SPD_MSK); | ||||||
|  | 
 | ||||||
|  | 	if (cntl == IC_CON_SPD_HS) | ||||||
|  | 		return I2C_MAX_SPEED; | ||||||
|  | 	else if (cntl == IC_CON_SPD_FS) | ||||||
|  | 		return I2C_FAST_SPEED; | ||||||
|  | 	else if (cntl == IC_CON_SPD_SS) | ||||||
|  | 		return I2C_STANDARD_SPEED; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * i2c_init - Init function | ||||||
|  |  * @speed:	required i2c speed | ||||||
|  |  * @slaveadd:	slave address for the spear device | ||||||
|  |  * | ||||||
|  |  * Initialization function. | ||||||
|  |  */ | ||||||
|  | void i2c_init(int speed, int slaveadd) | ||||||
|  | { | ||||||
|  | 	unsigned int enbl; | ||||||
|  | 
 | ||||||
|  | 	/* Disable i2c */ | ||||||
|  | 	enbl = readl(&i2c_regs_p->ic_enable); | ||||||
|  | 	enbl &= ~IC_ENABLE_0B; | ||||||
|  | 	writel(enbl, &i2c_regs_p->ic_enable); | ||||||
|  | 
 | ||||||
|  | 	writel((IC_CON_SD | IC_CON_SPD_FS | IC_CON_MM), &i2c_regs_p->ic_con); | ||||||
|  | 	writel(IC_RX_TL, &i2c_regs_p->ic_rx_tl); | ||||||
|  | 	writel(IC_TX_TL, &i2c_regs_p->ic_tx_tl); | ||||||
|  | 	i2c_set_bus_speed(speed); | ||||||
|  | 	writel(IC_STOP_DET, &i2c_regs_p->ic_intr_mask); | ||||||
|  | 	writel(slaveadd, &i2c_regs_p->ic_sar); | ||||||
|  | 
 | ||||||
|  | 	/* Enable i2c */ | ||||||
|  | 	enbl = readl(&i2c_regs_p->ic_enable); | ||||||
|  | 	enbl |= IC_ENABLE_0B; | ||||||
|  | 	writel(enbl, &i2c_regs_p->ic_enable); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * i2c_setaddress - Sets the target slave address | ||||||
|  |  * @i2c_addr:	target i2c address | ||||||
|  |  * | ||||||
|  |  * Sets the target slave address. | ||||||
|  |  */ | ||||||
|  | static void i2c_setaddress(unsigned int i2c_addr) | ||||||
|  | { | ||||||
|  | 	writel(i2c_addr, &i2c_regs_p->ic_tar); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * i2c_flush_rxfifo - Flushes the i2c RX FIFO | ||||||
|  |  * | ||||||
|  |  * Flushes the i2c RX FIFO | ||||||
|  |  */ | ||||||
|  | static void i2c_flush_rxfifo(void) | ||||||
|  | { | ||||||
|  | 	while (readl(&i2c_regs_p->ic_status) & IC_STATUS_RFNE) | ||||||
|  | 		readl(&i2c_regs_p->ic_cmd_data); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * i2c_wait_for_bb - Waits for bus busy | ||||||
|  |  * | ||||||
|  |  * Waits for bus busy | ||||||
|  |  */ | ||||||
|  | static int i2c_wait_for_bb(void) | ||||||
|  | { | ||||||
|  | 	unsigned long start_time_bb = get_timer(0); | ||||||
|  | 
 | ||||||
|  | 	while ((readl(&i2c_regs_p->ic_status) & IC_STATUS_MA) || | ||||||
|  | 	       !(readl(&i2c_regs_p->ic_status) & IC_STATUS_TFE)) { | ||||||
|  | 
 | ||||||
|  | 		/* Evaluate timeout */ | ||||||
|  | 		if (get_timer(start_time_bb) > (unsigned long)(I2C_BYTE_TO_BB)) | ||||||
|  | 			return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* check parameters for i2c_read and i2c_write */ | ||||||
|  | static int check_params(uint addr, int alen, uchar *buffer, int len) | ||||||
|  | { | ||||||
|  | 	if (buffer == NULL) { | ||||||
|  | 		printf("Buffer is invalid\n"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (alen > 1) { | ||||||
|  | 		printf("addr len %d not supported\n", alen); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (addr + len > 256) { | ||||||
|  | 		printf("address out of range\n"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int i2c_xfer_init(uchar chip, uint addr) | ||||||
|  | { | ||||||
|  | 	if (i2c_wait_for_bb()) { | ||||||
|  | 		printf("Timed out waiting for bus\n"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	i2c_setaddress(chip); | ||||||
|  | 	writel(addr, &i2c_regs_p->ic_cmd_data); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int i2c_xfer_finish(void) | ||||||
|  | { | ||||||
|  | 	ulong start_stop_det = get_timer(0); | ||||||
|  | 
 | ||||||
|  | 	while (1) { | ||||||
|  | 		if ((readl(&i2c_regs_p->ic_raw_intr_stat) & IC_STOP_DET)) { | ||||||
|  | 			readl(&i2c_regs_p->ic_clr_stop_det); | ||||||
|  | 			break; | ||||||
|  | 		} else if (get_timer(start_stop_det) > I2C_STOPDET_TO) { | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (i2c_wait_for_bb()) { | ||||||
|  | 		printf("Timed out waiting for bus\n"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	i2c_flush_rxfifo(); | ||||||
|  | 
 | ||||||
|  | 	/* Wait for read/write operation to complete on actual memory */ | ||||||
|  | 	udelay(10000); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * i2c_read - Read from i2c memory | ||||||
|  |  * @chip:	target i2c address | ||||||
|  |  * @addr:	address to read from | ||||||
|  |  * @alen: | ||||||
|  |  * @buffer:	buffer for read data | ||||||
|  |  * @len:	no of bytes to be read | ||||||
|  |  * | ||||||
|  |  * Read from i2c memory. | ||||||
|  |  */ | ||||||
|  | int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) | ||||||
|  | { | ||||||
|  | 	unsigned long start_time_rx; | ||||||
|  | 
 | ||||||
|  | 	if (check_params(addr, alen, buffer, len)) | ||||||
|  | 		return 1; | ||||||
|  | 
 | ||||||
|  | 	if (i2c_xfer_init(chip, addr)) | ||||||
|  | 		return 1; | ||||||
|  | 
 | ||||||
|  | 	start_time_rx = get_timer(0); | ||||||
|  | 	while (len) { | ||||||
|  | 		writel(IC_CMD, &i2c_regs_p->ic_cmd_data); | ||||||
|  | 
 | ||||||
|  | 		if (readl(&i2c_regs_p->ic_status) & IC_STATUS_RFNE) { | ||||||
|  | 			*buffer++ = (uchar)readl(&i2c_regs_p->ic_cmd_data); | ||||||
|  | 			len--; | ||||||
|  | 			start_time_rx = get_timer(0); | ||||||
|  | 
 | ||||||
|  | 		} else if (get_timer(start_time_rx) > I2C_BYTE_TO) { | ||||||
|  | 				printf("Timed out. i2c read Failed\n"); | ||||||
|  | 				return 1; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return i2c_xfer_finish(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * i2c_write - Write to i2c memory | ||||||
|  |  * @chip:	target i2c address | ||||||
|  |  * @addr:	address to read from | ||||||
|  |  * @alen: | ||||||
|  |  * @buffer:	buffer for read data | ||||||
|  |  * @len:	no of bytes to be read | ||||||
|  |  * | ||||||
|  |  * Write to i2c memory. | ||||||
|  |  */ | ||||||
|  | int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len) | ||||||
|  | { | ||||||
|  | 	int nb = len; | ||||||
|  | 	unsigned long start_time_tx; | ||||||
|  | 
 | ||||||
|  | 	if (check_params(addr, alen, buffer, len)) | ||||||
|  | 		return 1; | ||||||
|  | 
 | ||||||
|  | 	if (i2c_xfer_init(chip, addr)) | ||||||
|  | 		return 1; | ||||||
|  | 
 | ||||||
|  | 	start_time_tx = get_timer(0); | ||||||
|  | 	while (len) { | ||||||
|  | 		if (readl(&i2c_regs_p->ic_status) & IC_STATUS_TFNF) { | ||||||
|  | 			writel(*buffer, &i2c_regs_p->ic_cmd_data); | ||||||
|  | 			buffer++; | ||||||
|  | 			len--; | ||||||
|  | 			start_time_tx = get_timer(0); | ||||||
|  | 
 | ||||||
|  | 		} else if (get_timer(start_time_tx) > (nb * I2C_BYTE_TO)) { | ||||||
|  | 				printf("Timed out. i2c write Failed\n"); | ||||||
|  | 				return 1; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return i2c_xfer_finish(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * i2c_probe - Probe the i2c chip | ||||||
|  |  */ | ||||||
|  | int i2c_probe(uchar chip) | ||||||
|  | { | ||||||
|  | 	u32 tmp; | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * Try to read the first location of the chip. | ||||||
|  | 	 */ | ||||||
|  | 	return i2c_read(chip, 0, 1, (uchar *)&tmp, 1); | ||||||
|  | } | ||||||
|  | @ -34,6 +34,7 @@ COBJS-$(CONFIG_FLASH_CFI_MTD) += cfi_mtd.o | ||||||
| COBJS-$(CONFIG_HAS_DATAFLASH) += dataflash.o | COBJS-$(CONFIG_HAS_DATAFLASH) += dataflash.o | ||||||
| COBJS-$(CONFIG_FLASH_CFI_LEGACY) += jedec_flash.o | COBJS-$(CONFIG_FLASH_CFI_LEGACY) += jedec_flash.o | ||||||
| COBJS-$(CONFIG_MW_EEPROM) += mw_eeprom.o | COBJS-$(CONFIG_MW_EEPROM) += mw_eeprom.o | ||||||
|  | COBJS-$(CONFIG_SPEARSMI) += spr_smi.o | ||||||
| 
 | 
 | ||||||
| COBJS	:= $(COBJS-y) | COBJS	:= $(COBJS-y) | ||||||
| SRCS	:= $(COBJS:.o=.c) | SRCS	:= $(COBJS:.o=.c) | ||||||
|  |  | ||||||
|  | @ -47,6 +47,7 @@ COBJS-$(CONFIG_NAND_NDFC) += ndfc.o | ||||||
| COBJS-$(CONFIG_NAND_NOMADIK) += nomadik.o | COBJS-$(CONFIG_NAND_NOMADIK) += nomadik.o | ||||||
| COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o | COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o | ||||||
| COBJS-$(CONFIG_NAND_S3C64XX) += s3c64xx.o | COBJS-$(CONFIG_NAND_S3C64XX) += s3c64xx.o | ||||||
|  | COBJS-$(CONFIG_NAND_SPEAR) += spr_nand.o | ||||||
| COBJS-$(CONFIG_NAND_OMAP_GPMC) += omap_gpmc.o | COBJS-$(CONFIG_NAND_OMAP_GPMC) += omap_gpmc.o | ||||||
| COBJS-$(CONFIG_NAND_PLAT) += nand_plat.o | COBJS-$(CONFIG_NAND_PLAT) += nand_plat.o | ||||||
| endif | endif | ||||||
|  |  | ||||||
|  | @ -0,0 +1,124 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 <nand.h> | ||||||
|  | #include <linux/mtd/nand_ecc.h> | ||||||
|  | #include <asm/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_nand.h> | ||||||
|  | 
 | ||||||
|  | static struct fsmc_regs *const fsmc_regs_p = | ||||||
|  |     (struct fsmc_regs *)CONFIG_SPEAR_FSMCBASE; | ||||||
|  | 
 | ||||||
|  | static struct nand_ecclayout spear_nand_ecclayout = { | ||||||
|  | 	.eccbytes = 24, | ||||||
|  | 	.eccpos = {2, 3, 4, 18, 19, 20, 34, 35, 36, 50, 51, 52, | ||||||
|  | 		   66, 67, 68, 82, 83, 84, 98, 99, 100, 114, 115, 116}, | ||||||
|  | 	.oobfree = { | ||||||
|  | 		    {.offset = 8, .length = 8}, | ||||||
|  | 		    {.offset = 24, .length = 8}, | ||||||
|  | 		    {.offset = 40, .length = 8}, | ||||||
|  | 		    {.offset = 56, .length = 8}, | ||||||
|  | 		    {.offset = 72, .length = 8}, | ||||||
|  | 		    {.offset = 88, .length = 8}, | ||||||
|  | 		    {.offset = 104, .length = 8}, | ||||||
|  | 		    {.offset = 120, .length = 8} | ||||||
|  | 		    } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static void spear_nand_hwcontrol(struct mtd_info *mtd, int cmd, uint ctrl) | ||||||
|  | { | ||||||
|  | 	struct nand_chip *this = mtd->priv; | ||||||
|  | 	ulong IO_ADDR_W; | ||||||
|  | 
 | ||||||
|  | 	if (ctrl & NAND_CTRL_CHANGE) { | ||||||
|  | 		IO_ADDR_W = (ulong)this->IO_ADDR_W; | ||||||
|  | 
 | ||||||
|  | 		IO_ADDR_W &= ~(CONFIG_SYS_NAND_CLE | CONFIG_SYS_NAND_ALE); | ||||||
|  | 		if (ctrl & NAND_CLE) | ||||||
|  | 			IO_ADDR_W |= CONFIG_SYS_NAND_CLE; | ||||||
|  | 		if (ctrl & NAND_ALE) | ||||||
|  | 			IO_ADDR_W |= CONFIG_SYS_NAND_ALE; | ||||||
|  | 
 | ||||||
|  | 		if (ctrl & NAND_NCE) { | ||||||
|  | 			writel(readl(&fsmc_regs_p->genmemctrl_pc) | | ||||||
|  | 			       FSMC_ENABLE, &fsmc_regs_p->genmemctrl_pc); | ||||||
|  | 		} else { | ||||||
|  | 			writel(readl(&fsmc_regs_p->genmemctrl_pc) & | ||||||
|  | 			       ~FSMC_ENABLE, &fsmc_regs_p->genmemctrl_pc); | ||||||
|  | 		} | ||||||
|  | 		this->IO_ADDR_W = (void *)IO_ADDR_W; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (cmd != NAND_CMD_NONE) | ||||||
|  | 		writeb(cmd, this->IO_ADDR_W); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int spear_read_hwecc(struct mtd_info *mtd, | ||||||
|  | 			    const u_char *data, u_char ecc[3]) | ||||||
|  | { | ||||||
|  | 	u_int ecc_tmp; | ||||||
|  | 
 | ||||||
|  | 	/* read the h/w ECC */ | ||||||
|  | 	ecc_tmp = readl(&fsmc_regs_p->genmemctrl_ecc); | ||||||
|  | 
 | ||||||
|  | 	ecc[0] = (u_char) (ecc_tmp & 0xFF); | ||||||
|  | 	ecc[1] = (u_char) ((ecc_tmp & 0xFF00) >> 8); | ||||||
|  | 	ecc[2] = (u_char) ((ecc_tmp & 0xFF0000) >> 16); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void spear_enable_hwecc(struct mtd_info *mtd, int mode) | ||||||
|  | { | ||||||
|  | 	writel(readl(&fsmc_regs_p->genmemctrl_pc) & ~0x80, | ||||||
|  | 	       &fsmc_regs_p->genmemctrl_pc); | ||||||
|  | 	writel(readl(&fsmc_regs_p->genmemctrl_pc) & ~FSMC_ECCEN, | ||||||
|  | 	       &fsmc_regs_p->genmemctrl_pc); | ||||||
|  | 	writel(readl(&fsmc_regs_p->genmemctrl_pc) | FSMC_ECCEN, | ||||||
|  | 	       &fsmc_regs_p->genmemctrl_pc); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int spear_nand_init(struct nand_chip *nand) | ||||||
|  | { | ||||||
|  | 	writel(FSMC_DEVWID_8 | FSMC_DEVTYPE_NAND | FSMC_ENABLE | FSMC_WAITON, | ||||||
|  | 	       &fsmc_regs_p->genmemctrl_pc); | ||||||
|  | 	writel(readl(&fsmc_regs_p->genmemctrl_pc) | FSMC_TCLR_1 | FSMC_TAR_1, | ||||||
|  | 	       &fsmc_regs_p->genmemctrl_pc); | ||||||
|  | 	writel(FSMC_THIZ_1 | FSMC_THOLD_4 | FSMC_TWAIT_6 | FSMC_TSET_0, | ||||||
|  | 	       &fsmc_regs_p->genmemctrl_comm); | ||||||
|  | 	writel(FSMC_THIZ_1 | FSMC_THOLD_4 | FSMC_TWAIT_6 | FSMC_TSET_0, | ||||||
|  | 	       &fsmc_regs_p->genmemctrl_attrib); | ||||||
|  | 
 | ||||||
|  | 	nand->options = 0; | ||||||
|  | 	nand->ecc.mode = NAND_ECC_HW; | ||||||
|  | 	nand->ecc.layout = &spear_nand_ecclayout; | ||||||
|  | 	nand->ecc.size = 512; | ||||||
|  | 	nand->ecc.bytes = 3; | ||||||
|  | 	nand->ecc.calculate = spear_read_hwecc; | ||||||
|  | 	nand->ecc.hwctl = spear_enable_hwecc; | ||||||
|  | 	nand->ecc.correct = nand_correct_data; | ||||||
|  | 	nand->cmd_ctrl = spear_nand_hwcontrol; | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,523 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 <flash.h> | ||||||
|  | #include <linux/err.h> | ||||||
|  | 
 | ||||||
|  | #include <asm/io.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_smi.h> | ||||||
|  | 
 | ||||||
|  | #if !defined(CONFIG_SYS_NO_FLASH) | ||||||
|  | 
 | ||||||
|  | static struct smi_regs *const smicntl = | ||||||
|  |     (struct smi_regs * const)CONFIG_SYS_SMI_BASE; | ||||||
|  | static ulong bank_base[CONFIG_SYS_MAX_FLASH_BANKS] = | ||||||
|  |     CONFIG_SYS_FLASH_ADDR_BASE; | ||||||
|  | flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; | ||||||
|  | 
 | ||||||
|  | #define ST_M25Pxx_ID		0x00002020 | ||||||
|  | 
 | ||||||
|  | static struct flash_dev flash_ids[] = { | ||||||
|  | 	{0x10, 0x10000, 2},	/* 64K Byte */ | ||||||
|  | 	{0x11, 0x20000, 4},	/* 128K Byte */ | ||||||
|  | 	{0x12, 0x40000, 4},	/* 256K Byte */ | ||||||
|  | 	{0x13, 0x80000, 8},	/* 512K Byte */ | ||||||
|  | 	{0x14, 0x100000, 16},	/* 1M Byte */ | ||||||
|  | 	{0x15, 0x200000, 32},	/* 2M Byte */ | ||||||
|  | 	{0x16, 0x400000, 64},	/* 4M Byte */ | ||||||
|  | 	{0x17, 0x800000, 128},	/* 8M Byte */ | ||||||
|  | 	{0x18, 0x1000000, 64},	/* 16M Byte */ | ||||||
|  | 	{0x00,} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * smi_wait_xfer_finish - Wait until TFF is set in status register | ||||||
|  |  * @timeout:	 timeout in milliseconds | ||||||
|  |  * | ||||||
|  |  * Wait until TFF is set in status register | ||||||
|  |  */ | ||||||
|  | static void smi_wait_xfer_finish(int timeout) | ||||||
|  | { | ||||||
|  | 	while (timeout--) { | ||||||
|  | 		if (readl(&smicntl->smi_sr) & TFF) | ||||||
|  | 			break; | ||||||
|  | 		udelay(1000); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * smi_read_id - Read flash id | ||||||
|  |  * @info:	 flash_info structure pointer | ||||||
|  |  * @banknum:	 bank number | ||||||
|  |  * | ||||||
|  |  * Read the flash id present at bank #banknum | ||||||
|  |  */ | ||||||
|  | static unsigned int smi_read_id(flash_info_t *info, int banknum) | ||||||
|  | { | ||||||
|  | 	unsigned int value; | ||||||
|  | 
 | ||||||
|  | 	writel(readl(&smicntl->smi_cr1) | SW_MODE, &smicntl->smi_cr1); | ||||||
|  | 	writel(READ_ID, &smicntl->smi_tr); | ||||||
|  | 	writel((banknum << BANKSEL_SHIFT) | SEND | TX_LEN_1 | RX_LEN_3, | ||||||
|  | 	       &smicntl->smi_cr2); | ||||||
|  | 	smi_wait_xfer_finish(XFER_FINISH_TOUT); | ||||||
|  | 
 | ||||||
|  | 	value = (readl(&smicntl->smi_rr) & 0x00FFFFFF); | ||||||
|  | 
 | ||||||
|  | 	writel(readl(&smicntl->smi_sr) & ~TFF, &smicntl->smi_sr); | ||||||
|  | 	writel(readl(&smicntl->smi_cr1) & ~SW_MODE, &smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 	return value; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * flash_get_size - Detect the SMI flash by reading the ID. | ||||||
|  |  * @base:	 Base address of the flash area bank #banknum | ||||||
|  |  * @banknum:	 Bank number | ||||||
|  |  * | ||||||
|  |  * Detect the SMI flash by reading the ID. Initializes the flash_info structure | ||||||
|  |  * with size, sector count etc. | ||||||
|  |  */ | ||||||
|  | static ulong flash_get_size(ulong base, int banknum) | ||||||
|  | { | ||||||
|  | 	flash_info_t *info = &flash_info[banknum]; | ||||||
|  | 	struct flash_dev *dev; | ||||||
|  | 	unsigned int value; | ||||||
|  | 	unsigned int density; | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	value = smi_read_id(info, banknum); | ||||||
|  | 	density = (value >> 16) & 0xff; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0, dev = &flash_ids[0]; dev->density != 0x0; | ||||||
|  | 	     i++, dev = &flash_ids[i]) { | ||||||
|  | 		if (dev->density == density) { | ||||||
|  | 			info->size = dev->size; | ||||||
|  | 			info->sector_count = dev->sector_count; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (dev->density == 0x0) | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
|  | 	info->flash_id = value & 0xffff; | ||||||
|  | 	info->start[0] = base; | ||||||
|  | 
 | ||||||
|  | 	return info->size; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * smi_read_sr - Read status register of SMI | ||||||
|  |  * @bank:	 bank number | ||||||
|  |  * | ||||||
|  |  * This routine will get the status register of the flash chip present at the | ||||||
|  |  * given bank | ||||||
|  |  */ | ||||||
|  | static unsigned int smi_read_sr(int bank) | ||||||
|  | { | ||||||
|  | 	u32 ctrlreg1; | ||||||
|  | 
 | ||||||
|  | 	/* store the CTRL REG1 state */ | ||||||
|  | 	ctrlreg1 = readl(&smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 	/* Program SMI in HW Mode */ | ||||||
|  | 	writel(readl(&smicntl->smi_cr1) & ~(SW_MODE | WB_MODE), | ||||||
|  | 	       &smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 	/* Performing a RSR instruction in HW mode */ | ||||||
|  | 	writel((bank << BANKSEL_SHIFT) | RD_STATUS_REG, &smicntl->smi_cr2); | ||||||
|  | 
 | ||||||
|  | 	smi_wait_xfer_finish(XFER_FINISH_TOUT); | ||||||
|  | 
 | ||||||
|  | 	/* Restore the CTRL REG1 state */ | ||||||
|  | 	writel(ctrlreg1, &smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 	return readl(&smicntl->smi_sr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * smi_wait_till_ready - Wait till last operation is over. | ||||||
|  |  * @bank:	 bank number shifted. | ||||||
|  |  * @timeout:	 timeout in milliseconds. | ||||||
|  |  * | ||||||
|  |  * This routine checks for WIP(write in progress)bit in Status register(SMSR-b0) | ||||||
|  |  * The routine checks for #timeout loops, each at interval of 1 milli-second. | ||||||
|  |  * If successful the routine returns 0. | ||||||
|  |  */ | ||||||
|  | static int smi_wait_till_ready(int bank, int timeout) | ||||||
|  | { | ||||||
|  | 	int count; | ||||||
|  | 	unsigned int sr; | ||||||
|  | 
 | ||||||
|  | 	/* One chip guarantees max 5 msec wait here after page writes,
 | ||||||
|  | 	   but potentially three seconds (!) after page erase. */ | ||||||
|  | 	for (count = 0; count < timeout; count++) { | ||||||
|  | 
 | ||||||
|  | 		sr = smi_read_sr(bank); | ||||||
|  | 		if (sr < 0) | ||||||
|  | 			break; | ||||||
|  | 		else if (!(sr & WIP_BIT)) | ||||||
|  | 			return 0; | ||||||
|  | 
 | ||||||
|  | 		/* Try again after 1m-sec */ | ||||||
|  | 		udelay(1000); | ||||||
|  | 	} | ||||||
|  | 	printf("SMI controller is still in wait, timeout=%d\n", timeout); | ||||||
|  | 	return -EIO; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * smi_write_enable - Enable the flash to do write operation | ||||||
|  |  * @bank:	 bank number | ||||||
|  |  * | ||||||
|  |  * Set write enable latch with Write Enable command. | ||||||
|  |  * Returns negative if error occurred. | ||||||
|  |  */ | ||||||
|  | static int smi_write_enable(int bank) | ||||||
|  | { | ||||||
|  | 	u32 ctrlreg1; | ||||||
|  | 	int timeout = WMODE_TOUT; | ||||||
|  | 
 | ||||||
|  | 	/* Store the CTRL REG1 state */ | ||||||
|  | 	ctrlreg1 = readl(&smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 	/* Program SMI in H/W Mode */ | ||||||
|  | 	writel(readl(&smicntl->smi_cr1) & ~SW_MODE, &smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 	/* Give the Flash, Write Enable command */ | ||||||
|  | 	writel((bank << BANKSEL_SHIFT) | WE, &smicntl->smi_cr2); | ||||||
|  | 
 | ||||||
|  | 	smi_wait_xfer_finish(XFER_FINISH_TOUT); | ||||||
|  | 
 | ||||||
|  | 	/* Restore the CTRL REG1 state */ | ||||||
|  | 	writel(ctrlreg1, &smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 	while (timeout--) { | ||||||
|  | 		if (smi_read_sr(bank) & (1 << (bank + WM_SHIFT))) | ||||||
|  | 			break; | ||||||
|  | 		udelay(1000); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (timeout) | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * smi_init - SMI initialization routine | ||||||
|  |  * | ||||||
|  |  * SMI initialization routine. Sets SMI control register1. | ||||||
|  |  */ | ||||||
|  | static void smi_init(void) | ||||||
|  | { | ||||||
|  | 	/* Setting the fast mode values. SMI working at 166/4 = 41.5 MHz */ | ||||||
|  | 	writel(HOLD1 | FAST_MODE | BANK_EN | DSEL_TIME | PRESCAL4, | ||||||
|  | 	       &smicntl->smi_cr1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * smi_sector_erase - Erase flash sector | ||||||
|  |  * @info:	 flash_info structure pointer | ||||||
|  |  * @sector:	 sector number | ||||||
|  |  * | ||||||
|  |  * Set write enable latch with Write Enable command. | ||||||
|  |  * Returns negative if error occurred. | ||||||
|  |  */ | ||||||
|  | static int smi_sector_erase(flash_info_t *info, unsigned int sector) | ||||||
|  | { | ||||||
|  | 	int bank; | ||||||
|  | 	unsigned int sect_add; | ||||||
|  | 	unsigned int instruction; | ||||||
|  | 
 | ||||||
|  | 	switch (info->start[0]) { | ||||||
|  | 	case SMIBANK0_BASE: | ||||||
|  | 		bank = BANK0; | ||||||
|  | 		break; | ||||||
|  | 	case SMIBANK1_BASE: | ||||||
|  | 		bank = BANK1; | ||||||
|  | 		break; | ||||||
|  | 	case SMIBANK2_BASE: | ||||||
|  | 		bank = BANK2; | ||||||
|  | 		break; | ||||||
|  | 	case SMIBANK3_BASE: | ||||||
|  | 		bank = BANK3; | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	sect_add = sector * (info->size / info->sector_count); | ||||||
|  | 	instruction = ((sect_add >> 8) & 0x0000FF00) | SECTOR_ERASE; | ||||||
|  | 
 | ||||||
|  | 	writel(readl(&smicntl->smi_sr) & ~(ERF1 | ERF2), &smicntl->smi_sr); | ||||||
|  | 
 | ||||||
|  | 	if (info->flash_id == ST_M25Pxx_ID) { | ||||||
|  | 		/* Wait until finished previous write command. */ | ||||||
|  | 		if (smi_wait_till_ready(bank, CONFIG_SYS_FLASH_ERASE_TOUT)) | ||||||
|  | 			return -EBUSY; | ||||||
|  | 
 | ||||||
|  | 		/* Send write enable, before erase commands. */ | ||||||
|  | 		if (smi_write_enable(bank)) | ||||||
|  | 			return -EIO; | ||||||
|  | 
 | ||||||
|  | 		/* Put SMI in SW mode */ | ||||||
|  | 		writel(readl(&smicntl->smi_cr1) | SW_MODE, &smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 		/* Send Sector Erase command in SW Mode */ | ||||||
|  | 		writel(instruction, &smicntl->smi_tr); | ||||||
|  | 		writel((bank << BANKSEL_SHIFT) | SEND | TX_LEN_4, | ||||||
|  | 		       &smicntl->smi_cr2); | ||||||
|  | 		smi_wait_xfer_finish(XFER_FINISH_TOUT); | ||||||
|  | 
 | ||||||
|  | 		if (smi_wait_till_ready(bank, CONFIG_SYS_FLASH_ERASE_TOUT)) | ||||||
|  | 			return -EBUSY; | ||||||
|  | 
 | ||||||
|  | 		/* Put SMI in HW mode */ | ||||||
|  | 		writel(readl(&smicntl->smi_cr1) & ~SW_MODE, | ||||||
|  | 		       &smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 		return 0; | ||||||
|  | 	} else { | ||||||
|  | 		/* Put SMI in HW mode */ | ||||||
|  | 		writel(readl(&smicntl->smi_cr1) & ~SW_MODE, | ||||||
|  | 		       &smicntl->smi_cr1); | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * smi_write - Write to SMI flash | ||||||
|  |  * @src_addr:	 source buffer | ||||||
|  |  * @dst_addr:	 destination buffer | ||||||
|  |  * @length:	 length to write in words | ||||||
|  |  * @bank:	 bank base address | ||||||
|  |  * | ||||||
|  |  * Write to SMI flash | ||||||
|  |  */ | ||||||
|  | static int smi_write(unsigned int *src_addr, unsigned int *dst_addr, | ||||||
|  | 		     unsigned int length, ulong bank_addr) | ||||||
|  | { | ||||||
|  | 	int banknum; | ||||||
|  | 	unsigned int WM; | ||||||
|  | 
 | ||||||
|  | 	switch (bank_addr) { | ||||||
|  | 	case SMIBANK0_BASE: | ||||||
|  | 		banknum = BANK0; | ||||||
|  | 		WM = WM0; | ||||||
|  | 		break; | ||||||
|  | 	case SMIBANK1_BASE: | ||||||
|  | 		banknum = BANK1; | ||||||
|  | 		WM = WM1; | ||||||
|  | 		break; | ||||||
|  | 	case SMIBANK2_BASE: | ||||||
|  | 		banknum = BANK2; | ||||||
|  | 		WM = WM2; | ||||||
|  | 		break; | ||||||
|  | 	case SMIBANK3_BASE: | ||||||
|  | 		banknum = BANK3; | ||||||
|  | 		WM = WM3; | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (smi_wait_till_ready(banknum, CONFIG_SYS_FLASH_WRITE_TOUT)) | ||||||
|  | 		return -EBUSY; | ||||||
|  | 
 | ||||||
|  | 	/* Set SMI in Hardware Mode */ | ||||||
|  | 	writel(readl(&smicntl->smi_cr1) & ~SW_MODE, &smicntl->smi_cr1); | ||||||
|  | 
 | ||||||
|  | 	if (smi_write_enable(banknum)) | ||||||
|  | 		return -EIO; | ||||||
|  | 
 | ||||||
|  | 	/* Perform the write command */ | ||||||
|  | 	while (length--) { | ||||||
|  | 		if (((ulong) (dst_addr) % SFLASH_PAGE_SIZE) == 0) { | ||||||
|  | 			if (smi_wait_till_ready(banknum, | ||||||
|  | 						CONFIG_SYS_FLASH_WRITE_TOUT)) | ||||||
|  | 				return -EBUSY; | ||||||
|  | 
 | ||||||
|  | 			if (smi_write_enable(banknum)) | ||||||
|  | 				return -EIO; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		*dst_addr++ = *src_addr++; | ||||||
|  | 
 | ||||||
|  | 		if ((readl(&smicntl->smi_sr) & (ERF1 | ERF2))) | ||||||
|  | 			return -EIO; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (smi_wait_till_ready(banknum, CONFIG_SYS_FLASH_WRITE_TOUT)) | ||||||
|  | 		return -EBUSY; | ||||||
|  | 
 | ||||||
|  | 	writel(readl(&smicntl->smi_sr) & ~(WCF), &smicntl->smi_sr); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * write_buff - Write to SMI flash | ||||||
|  |  * @info:	 flash info structure | ||||||
|  |  * @src:	 source buffer | ||||||
|  |  * @dest_addr:	 destination buffer | ||||||
|  |  * @length:	 length to write in words | ||||||
|  |  * | ||||||
|  |  * Write to SMI flash | ||||||
|  |  */ | ||||||
|  | int write_buff(flash_info_t *info, uchar *src, ulong dest_addr, ulong length) | ||||||
|  | { | ||||||
|  | 	return smi_write((unsigned int *)src, (unsigned int *)dest_addr, | ||||||
|  | 		  (length + 3) / 4, info->start[0]); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * flash_init - SMI flash initialization | ||||||
|  |  * | ||||||
|  |  * SMI flash initialization | ||||||
|  |  */ | ||||||
|  | unsigned long flash_init(void) | ||||||
|  | { | ||||||
|  | 	unsigned long size = 0; | ||||||
|  | 	int i, j; | ||||||
|  | 
 | ||||||
|  | 	smi_init(); | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) { | ||||||
|  | 		flash_info[i].flash_id = FLASH_UNKNOWN; | ||||||
|  | 		size += flash_info[i].size = flash_get_size(bank_base[i], i); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for (j = 0; j < CONFIG_SYS_MAX_FLASH_BANKS; j++) { | ||||||
|  | 		for (i = 1; i < flash_info[j].sector_count; i++) | ||||||
|  | 			flash_info[j].start[i] = | ||||||
|  | 			    flash_info[j].start[i - 1] + | ||||||
|  | 			    flash_info->size / flash_info->sector_count; | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return size; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * flash_print_info - Print SMI flash information | ||||||
|  |  * | ||||||
|  |  * Print SMI flash information | ||||||
|  |  */ | ||||||
|  | void flash_print_info(flash_info_t *info) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 	if (info->flash_id == FLASH_UNKNOWN) { | ||||||
|  | 		puts("missing or unknown FLASH type\n"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	printf("  Size: %ld MB in %d Sectors\n", | ||||||
|  | 	       info->size >> 20, info->sector_count); | ||||||
|  | 
 | ||||||
|  | 	puts("  Sector Start Addresses:"); | ||||||
|  | 	for (i = 0; i < info->sector_count; ++i) { | ||||||
|  | #ifdef CONFIG_SYS_FLASH_EMPTY_INFO | ||||||
|  | 		int size; | ||||||
|  | 		int erased; | ||||||
|  | 		u32 *flash; | ||||||
|  | 
 | ||||||
|  | 		/*
 | ||||||
|  | 		 * Check if whole sector is erased | ||||||
|  | 		 */ | ||||||
|  | 		size = (info->size) / (info->sector_count); | ||||||
|  | 		flash = (u32 *) info->start[i]; | ||||||
|  | 		size = size / sizeof(int); | ||||||
|  | 
 | ||||||
|  | 		while ((size--) && (*flash++ == ~0)) | ||||||
|  | 			; | ||||||
|  | 
 | ||||||
|  | 		size++; | ||||||
|  | 		if (size) | ||||||
|  | 			erased = 0; | ||||||
|  | 		else | ||||||
|  | 			erased = 1; | ||||||
|  | 
 | ||||||
|  | 		if ((i % 5) == 0) | ||||||
|  | 			printf("\n"); | ||||||
|  | 
 | ||||||
|  | 		printf(" %08lX%s%s", | ||||||
|  | 		       info->start[i], | ||||||
|  | 		       erased ? " E" : "  ", info->protect[i] ? "RO " : "   "); | ||||||
|  | #else | ||||||
|  | 		if ((i % 5) == 0) | ||||||
|  | 			printf("\n   "); | ||||||
|  | 		printf(" %08lX%s", | ||||||
|  | 		       info->start[i], info->protect[i] ? " (RO)  " : "     "); | ||||||
|  | #endif | ||||||
|  | 	} | ||||||
|  | 	putc('\n'); | ||||||
|  | 	return; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * flash_erase - Erase SMI flash | ||||||
|  |  * | ||||||
|  |  * Erase SMI flash | ||||||
|  |  */ | ||||||
|  | int flash_erase(flash_info_t *info, int s_first, int s_last) | ||||||
|  | { | ||||||
|  | 	int rcode = 0; | ||||||
|  | 	int prot = 0; | ||||||
|  | 	flash_sect_t sect; | ||||||
|  | 
 | ||||||
|  | 	if (info->flash_id != ST_M25Pxx_ID) { | ||||||
|  | 		puts("Can't erase unknown flash type - aborted\n"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if ((s_first < 0) || (s_first > s_last)) { | ||||||
|  | 		puts("- no sectors to erase\n"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for (sect = s_first; sect <= s_last; ++sect) { | ||||||
|  | 		if (info->protect[sect]) | ||||||
|  | 			prot++; | ||||||
|  | 	} | ||||||
|  | 	if (prot) { | ||||||
|  | 		printf("- Warning: %d protected sectors will not be erased!\n", | ||||||
|  | 		       prot); | ||||||
|  | 	} else { | ||||||
|  | 		putc('\n'); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for (sect = s_first; sect <= s_last; sect++) { | ||||||
|  | 		if (info->protect[sect] == 0) { | ||||||
|  | 			if (smi_sector_erase(info, sect)) | ||||||
|  | 				rcode = 1; | ||||||
|  | 			else | ||||||
|  | 				putc('.'); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	puts(" done\n"); | ||||||
|  | 	return rcode; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | @ -33,6 +33,8 @@ | ||||||
| #include <usb/musb_udc.h> | #include <usb/musb_udc.h> | ||||||
| #elif defined(CONFIG_PXA27X) | #elif defined(CONFIG_PXA27X) | ||||||
| #include <usb/pxa27x_udc.h> | #include <usb/pxa27x_udc.h> | ||||||
|  | #elif defined(CONFIG_SPEAR3XX) || defined(CONFIG_SPEAR600) | ||||||
|  | #include <usb/spr_udc.h> | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include <version_autogenerated.h> | #include <version_autogenerated.h> | ||||||
|  |  | ||||||
|  | @ -32,6 +32,7 @@ COBJS-$(CONFIG_OMAP1510) += omap1510_udc.o | ||||||
| COBJS-$(CONFIG_OMAP1610) += omap1510_udc.o | COBJS-$(CONFIG_OMAP1610) += omap1510_udc.o | ||||||
| COBJS-$(CONFIG_MPC885_FAMILY) += mpc8xx_udc.o | COBJS-$(CONFIG_MPC885_FAMILY) += mpc8xx_udc.o | ||||||
| COBJS-$(CONFIG_PXA27X) += pxa27x_udc.o | COBJS-$(CONFIG_PXA27X) += pxa27x_udc.o | ||||||
|  | COBJS-$(CONFIG_SPEARUDC) += spr_udc.o | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
| COBJS	:= $(COBJS-y) | COBJS	:= $(COBJS-y) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,998 @@ | ||||||
|  | /*
 | ||||||
|  |  * Based on drivers/usb/gadget/omap1510_udc.c | ||||||
|  |  * TI OMAP1510 USB bus interface driver | ||||||
|  |  * | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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/io.h> | ||||||
|  | 
 | ||||||
|  | #include <usbdevice.h> | ||||||
|  | #include "ep0.h" | ||||||
|  | #include <usb/spr_udc.h> | ||||||
|  | #include <asm/arch/hardware.h> | ||||||
|  | #include <asm/arch/spr_misc.h> | ||||||
|  | 
 | ||||||
|  | #define UDC_INIT_MDELAY		80	/* Device settle delay */ | ||||||
|  | 
 | ||||||
|  | /* Some kind of debugging output... */ | ||||||
|  | #ifndef DEBUG_SPRUSBTTY | ||||||
|  | #define UDCDBG(str) | ||||||
|  | #define UDCDBGA(fmt, args...) | ||||||
|  | #else | ||||||
|  | #define UDCDBG(str) serial_printf(str "\n") | ||||||
|  | #define UDCDBGA(fmt, args...) serial_printf(fmt "\n", ##args) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | static struct urb *ep0_urb; | ||||||
|  | static struct usb_device_instance *udc_device; | ||||||
|  | 
 | ||||||
|  | static struct plug_regs *const plug_regs_p = | ||||||
|  |     (struct plug_regs * const)CONFIG_SYS_PLUG_BASE; | ||||||
|  | static struct udc_regs *const udc_regs_p = | ||||||
|  |     (struct udc_regs * const)CONFIG_SYS_USBD_BASE; | ||||||
|  | static struct udc_endp_regs *const outep_regs_p = | ||||||
|  |     &((struct udc_regs * const)CONFIG_SYS_USBD_BASE)->out_regs[0]; | ||||||
|  | static struct udc_endp_regs *const inep_regs_p = | ||||||
|  |     &((struct udc_regs * const)CONFIG_SYS_USBD_BASE)->in_regs[0]; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * udc_state_transition - Write the next packet to TxFIFO. | ||||||
|  |  * @initial:	Initial state. | ||||||
|  |  * @final:	Final state. | ||||||
|  |  * | ||||||
|  |  * Helper function to implement device state changes. The device states and | ||||||
|  |  * the events that transition between them are: | ||||||
|  |  * | ||||||
|  |  *				STATE_ATTACHED | ||||||
|  |  *				||	/\ | ||||||
|  |  *				\/	|| | ||||||
|  |  *	DEVICE_HUB_CONFIGURED			DEVICE_HUB_RESET | ||||||
|  |  *				||	/\ | ||||||
|  |  *				\/	|| | ||||||
|  |  *				STATE_POWERED | ||||||
|  |  *				||	/\ | ||||||
|  |  *				\/	|| | ||||||
|  |  *	DEVICE_RESET				DEVICE_POWER_INTERRUPTION | ||||||
|  |  *				||	/\ | ||||||
|  |  *				\/	|| | ||||||
|  |  *				STATE_DEFAULT | ||||||
|  |  *				||	/\ | ||||||
|  |  *				\/	|| | ||||||
|  |  *	DEVICE_ADDRESS_ASSIGNED			DEVICE_RESET | ||||||
|  |  *				||	/\ | ||||||
|  |  *				\/	|| | ||||||
|  |  *				STATE_ADDRESSED | ||||||
|  |  *				||	/\ | ||||||
|  |  *				\/	|| | ||||||
|  |  *	DEVICE_CONFIGURED			DEVICE_DE_CONFIGURED | ||||||
|  |  *				||	/\ | ||||||
|  |  *				\/	|| | ||||||
|  |  *				STATE_CONFIGURED | ||||||
|  |  * | ||||||
|  |  * udc_state_transition transitions up (in the direction from STATE_ATTACHED | ||||||
|  |  * to STATE_CONFIGURED) from the specified initial state to the specified final | ||||||
|  |  * state, passing through each intermediate state on the way. If the initial | ||||||
|  |  * state is at or above (i.e. nearer to STATE_CONFIGURED) the final state, then | ||||||
|  |  * no state transitions will take place. | ||||||
|  |  * | ||||||
|  |  * udc_state_transition also transitions down (in the direction from | ||||||
|  |  * STATE_CONFIGURED to STATE_ATTACHED) from the specified initial state to the | ||||||
|  |  * specified final state, passing through each intermediate state on the way. | ||||||
|  |  * If the initial state is at or below (i.e. nearer to STATE_ATTACHED) the final | ||||||
|  |  * state, then no state transitions will take place. | ||||||
|  |  * | ||||||
|  |  * This function must only be called with interrupts disabled. | ||||||
|  |  */ | ||||||
|  | static void udc_state_transition(usb_device_state_t initial, | ||||||
|  | 				 usb_device_state_t final) | ||||||
|  | { | ||||||
|  | 	if (initial < final) { | ||||||
|  | 		switch (initial) { | ||||||
|  | 		case STATE_ATTACHED: | ||||||
|  | 			usbd_device_event_irq(udc_device, | ||||||
|  | 					      DEVICE_HUB_CONFIGURED, 0); | ||||||
|  | 			if (final == STATE_POWERED) | ||||||
|  | 				break; | ||||||
|  | 		case STATE_POWERED: | ||||||
|  | 			usbd_device_event_irq(udc_device, DEVICE_RESET, 0); | ||||||
|  | 			if (final == STATE_DEFAULT) | ||||||
|  | 				break; | ||||||
|  | 		case STATE_DEFAULT: | ||||||
|  | 			usbd_device_event_irq(udc_device, | ||||||
|  | 					      DEVICE_ADDRESS_ASSIGNED, 0); | ||||||
|  | 			if (final == STATE_ADDRESSED) | ||||||
|  | 				break; | ||||||
|  | 		case STATE_ADDRESSED: | ||||||
|  | 			usbd_device_event_irq(udc_device, DEVICE_CONFIGURED, 0); | ||||||
|  | 		case STATE_CONFIGURED: | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} else if (initial > final) { | ||||||
|  | 		switch (initial) { | ||||||
|  | 		case STATE_CONFIGURED: | ||||||
|  | 			usbd_device_event_irq(udc_device, | ||||||
|  | 					      DEVICE_DE_CONFIGURED, 0); | ||||||
|  | 			if (final == STATE_ADDRESSED) | ||||||
|  | 				break; | ||||||
|  | 		case STATE_ADDRESSED: | ||||||
|  | 			usbd_device_event_irq(udc_device, DEVICE_RESET, 0); | ||||||
|  | 			if (final == STATE_DEFAULT) | ||||||
|  | 				break; | ||||||
|  | 		case STATE_DEFAULT: | ||||||
|  | 			usbd_device_event_irq(udc_device, | ||||||
|  | 					      DEVICE_POWER_INTERRUPTION, 0); | ||||||
|  | 			if (final == STATE_POWERED) | ||||||
|  | 				break; | ||||||
|  | 		case STATE_POWERED: | ||||||
|  | 			usbd_device_event_irq(udc_device, DEVICE_HUB_RESET, 0); | ||||||
|  | 		case STATE_ATTACHED: | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Stall endpoint */ | ||||||
|  | static void udc_stall_ep(u32 ep_num) | ||||||
|  | { | ||||||
|  | 	writel(readl(&inep_regs_p[ep_num].endp_cntl) | ENDP_CNTL_STALL, | ||||||
|  | 	       &inep_regs_p[ep_num].endp_cntl); | ||||||
|  | 
 | ||||||
|  | 	writel(readl(&outep_regs_p[ep_num].endp_cntl) | ENDP_CNTL_STALL, | ||||||
|  | 	       &outep_regs_p[ep_num].endp_cntl); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void *get_fifo(int ep_num, int in) | ||||||
|  | { | ||||||
|  | 	u32 *fifo_ptr = (u32 *)CONFIG_SYS_FIFO_BASE; | ||||||
|  | 
 | ||||||
|  | 	switch (ep_num) { | ||||||
|  | 	case UDC_EP3: | ||||||
|  | 		fifo_ptr += readl(&inep_regs_p[1].endp_bsorfn); | ||||||
|  | 		/* break intentionally left out */ | ||||||
|  | 
 | ||||||
|  | 	case UDC_EP1: | ||||||
|  | 		fifo_ptr += readl(&inep_regs_p[0].endp_bsorfn); | ||||||
|  | 		/* break intentionally left out */ | ||||||
|  | 
 | ||||||
|  | 	case UDC_EP0: | ||||||
|  | 	default: | ||||||
|  | 		if (in) { | ||||||
|  | 			fifo_ptr += | ||||||
|  | 			    readl(&outep_regs_p[2].endp_maxpacksize) >> 16; | ||||||
|  | 			/* break intentionally left out */ | ||||||
|  | 		} else { | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	case UDC_EP2: | ||||||
|  | 		fifo_ptr += readl(&outep_regs_p[0].endp_maxpacksize) >> 16; | ||||||
|  | 		/* break intentionally left out */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return (void *)fifo_ptr; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int usbgetpckfromfifo(int epNum, u8 *bufp, u32 len) | ||||||
|  | { | ||||||
|  | 	u8 *fifo_ptr = (u8 *)get_fifo(epNum, 0); | ||||||
|  | 	u32 i, nw, nb; | ||||||
|  | 	u32 *wrdp; | ||||||
|  | 	u8 *bytp; | ||||||
|  | 
 | ||||||
|  | 	if (readl(&udc_regs_p->dev_stat) & DEV_STAT_RXFIFO_EMPTY) | ||||||
|  | 		return -1; | ||||||
|  | 
 | ||||||
|  | 	nw = len / sizeof(u32); | ||||||
|  | 	nb = len % sizeof(u32); | ||||||
|  | 
 | ||||||
|  | 	wrdp = (u32 *)bufp; | ||||||
|  | 	for (i = 0; i < nw; i++) { | ||||||
|  | 		writel(readl(fifo_ptr), wrdp); | ||||||
|  | 		wrdp++; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	bytp = (u8 *)wrdp; | ||||||
|  | 	for (i = 0; i < nb; i++) { | ||||||
|  | 		writeb(readb(fifo_ptr), bytp); | ||||||
|  | 		fifo_ptr++; | ||||||
|  | 		bytp++; | ||||||
|  | 	} | ||||||
|  | 	readl(&outep_regs_p[epNum].write_done); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void usbputpcktofifo(int epNum, u8 *bufp, u32 len) | ||||||
|  | { | ||||||
|  | 	u32 i, nw, nb; | ||||||
|  | 	u32 *wrdp; | ||||||
|  | 	u8 *bytp; | ||||||
|  | 	u8 *fifo_ptr = get_fifo(epNum, 1); | ||||||
|  | 
 | ||||||
|  | 	nw = len / sizeof(int); | ||||||
|  | 	nb = len % sizeof(int); | ||||||
|  | 	wrdp = (u32 *)bufp; | ||||||
|  | 	for (i = 0; i < nw; i++) { | ||||||
|  | 		writel(*wrdp, fifo_ptr); | ||||||
|  | 		wrdp++; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	bytp = (u8 *)wrdp; | ||||||
|  | 	for (i = 0; i < nb; i++) { | ||||||
|  | 		writeb(*bytp, fifo_ptr); | ||||||
|  | 		fifo_ptr++; | ||||||
|  | 		bytp++; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * spear_write_noniso_tx_fifo - Write the next packet to TxFIFO. | ||||||
|  |  * @endpoint:		Endpoint pointer. | ||||||
|  |  * | ||||||
|  |  * If the endpoint has an active tx_urb, then the next packet of data from the | ||||||
|  |  * URB is written to the tx FIFO.  The total amount of data in the urb is given | ||||||
|  |  * by urb->actual_length.  The maximum amount of data that can be sent in any | ||||||
|  |  * one packet is given by endpoint->tx_packetSize.  The number of data bytes | ||||||
|  |  * from this URB that have already been transmitted is given by endpoint->sent. | ||||||
|  |  * endpoint->last is updated by this routine with the number of data bytes | ||||||
|  |  * transmitted in this packet. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | static void spear_write_noniso_tx_fifo(struct usb_endpoint_instance | ||||||
|  | 				       *endpoint) | ||||||
|  | { | ||||||
|  | 	struct urb *urb = endpoint->tx_urb; | ||||||
|  | 	int align; | ||||||
|  | 
 | ||||||
|  | 	if (urb) { | ||||||
|  | 		u32 last; | ||||||
|  | 
 | ||||||
|  | 		UDCDBGA("urb->buffer %p, buffer_length %d, actual_length %d", | ||||||
|  | 			urb->buffer, urb->buffer_length, urb->actual_length); | ||||||
|  | 
 | ||||||
|  | 		last = MIN(urb->actual_length - endpoint->sent, | ||||||
|  | 			   endpoint->tx_packetSize); | ||||||
|  | 
 | ||||||
|  | 		if (last) { | ||||||
|  | 			u8 *cp = urb->buffer + endpoint->sent; | ||||||
|  | 
 | ||||||
|  | 			/*
 | ||||||
|  | 			 * This ensures that USBD packet fifo is accessed | ||||||
|  | 			 * - through word aligned pointer or | ||||||
|  | 			 * - through non word aligned pointer but only | ||||||
|  | 			 *   with a max length to make the next packet | ||||||
|  | 			 *   word aligned | ||||||
|  | 			 */ | ||||||
|  | 
 | ||||||
|  | 			align = ((ulong)cp % sizeof(int)); | ||||||
|  | 			if (align) | ||||||
|  | 				last = MIN(last, sizeof(int) - align); | ||||||
|  | 
 | ||||||
|  | 			UDCDBGA("endpoint->sent %d, tx_packetSize %d, last %d", | ||||||
|  | 				endpoint->sent, endpoint->tx_packetSize, last); | ||||||
|  | 
 | ||||||
|  | 			usbputpcktofifo(endpoint->endpoint_address & | ||||||
|  | 					USB_ENDPOINT_NUMBER_MASK, cp, last); | ||||||
|  | 		} | ||||||
|  | 		endpoint->last = last; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Handle SETUP USB interrupt. | ||||||
|  |  * This function implements TRM Figure 14-14. | ||||||
|  |  */ | ||||||
|  | static void spear_udc_setup(struct usb_endpoint_instance *endpoint) | ||||||
|  | { | ||||||
|  | 	u8 *datap = (u8 *)&ep0_urb->device_request; | ||||||
|  | 	int ep_addr = endpoint->endpoint_address; | ||||||
|  | 
 | ||||||
|  | 	UDCDBG("-> Entering device setup"); | ||||||
|  | 	usbgetpckfromfifo(ep_addr, datap, 8); | ||||||
|  | 
 | ||||||
|  | 	/* Try to process setup packet */ | ||||||
|  | 	if (ep0_recv_setup(ep0_urb)) { | ||||||
|  | 		/* Not a setup packet, stall next EP0 transaction */ | ||||||
|  | 		udc_stall_ep(0); | ||||||
|  | 		UDCDBG("can't parse setup packet, still waiting for setup"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Check direction */ | ||||||
|  | 	if ((ep0_urb->device_request.bmRequestType & USB_REQ_DIRECTION_MASK) | ||||||
|  | 	    == USB_REQ_HOST2DEVICE) { | ||||||
|  | 		UDCDBG("control write on EP0"); | ||||||
|  | 		if (le16_to_cpu(ep0_urb->device_request.wLength)) { | ||||||
|  | 			/* Stall this request */ | ||||||
|  | 			UDCDBG("Stalling unsupported EP0 control write data " | ||||||
|  | 			       "stage."); | ||||||
|  | 			udc_stall_ep(0); | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 
 | ||||||
|  | 		UDCDBG("control read on EP0"); | ||||||
|  | 		/*
 | ||||||
|  | 		 * The ep0_recv_setup function has already placed our response | ||||||
|  | 		 * packet data in ep0_urb->buffer and the packet length in | ||||||
|  | 		 * ep0_urb->actual_length. | ||||||
|  | 		 */ | ||||||
|  | 		endpoint->tx_urb = ep0_urb; | ||||||
|  | 		endpoint->sent = 0; | ||||||
|  | 		/*
 | ||||||
|  | 		 * Write packet data to the FIFO.  spear_write_noniso_tx_fifo | ||||||
|  | 		 * will update endpoint->last with the number of bytes written | ||||||
|  | 		 * to the FIFO. | ||||||
|  | 		 */ | ||||||
|  | 		spear_write_noniso_tx_fifo(endpoint); | ||||||
|  | 
 | ||||||
|  | 		writel(0x0, &inep_regs_p[ep_addr].write_done); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	udc_unset_nak(endpoint->endpoint_address); | ||||||
|  | 
 | ||||||
|  | 	UDCDBG("<- Leaving device setup"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Handle endpoint 0 RX interrupt | ||||||
|  |  */ | ||||||
|  | static void spear_udc_ep0_rx(struct usb_endpoint_instance *endpoint) | ||||||
|  | { | ||||||
|  | 	u8 dummy[64]; | ||||||
|  | 
 | ||||||
|  | 	UDCDBG("RX on EP0"); | ||||||
|  | 
 | ||||||
|  | 	/* Check direction */ | ||||||
|  | 	if ((ep0_urb->device_request.bmRequestType | ||||||
|  | 	     & USB_REQ_DIRECTION_MASK) == USB_REQ_HOST2DEVICE) { | ||||||
|  | 		/*
 | ||||||
|  | 		 * This rx interrupt must be for a control write data | ||||||
|  | 		 * stage packet. | ||||||
|  | 		 * | ||||||
|  | 		 * We don't support control write data stages. | ||||||
|  | 		 * We should never end up here. | ||||||
|  | 		 */ | ||||||
|  | 
 | ||||||
|  | 		UDCDBG("Stalling unexpected EP0 control write " | ||||||
|  | 		       "data stage packet"); | ||||||
|  | 		udc_stall_ep(0); | ||||||
|  | 	} else { | ||||||
|  | 		/*
 | ||||||
|  | 		 * This rx interrupt must be for a control read status | ||||||
|  | 		 * stage packet. | ||||||
|  | 		 */ | ||||||
|  | 		UDCDBG("ACK on EP0 control read status stage packet"); | ||||||
|  | 		u32 len = (readl(&outep_regs_p[0].endp_status) >> 11) & 0xfff; | ||||||
|  | 		usbgetpckfromfifo(0, dummy, len); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Handle endpoint 0 TX interrupt | ||||||
|  |  */ | ||||||
|  | static void spear_udc_ep0_tx(struct usb_endpoint_instance *endpoint) | ||||||
|  | { | ||||||
|  | 	struct usb_device_request *request = &ep0_urb->device_request; | ||||||
|  | 	int ep_addr; | ||||||
|  | 
 | ||||||
|  | 	UDCDBG("TX on EP0"); | ||||||
|  | 
 | ||||||
|  | 	/* Check direction */ | ||||||
|  | 	if ((request->bmRequestType & USB_REQ_DIRECTION_MASK) == | ||||||
|  | 	    USB_REQ_HOST2DEVICE) { | ||||||
|  | 		/*
 | ||||||
|  | 		 * This tx interrupt must be for a control write status | ||||||
|  | 		 * stage packet. | ||||||
|  | 		 */ | ||||||
|  | 		UDCDBG("ACK on EP0 control write status stage packet"); | ||||||
|  | 	} else { | ||||||
|  | 		/*
 | ||||||
|  | 		 * This tx interrupt must be for a control read data | ||||||
|  | 		 * stage packet. | ||||||
|  | 		 */ | ||||||
|  | 		int wLength = le16_to_cpu(request->wLength); | ||||||
|  | 
 | ||||||
|  | 		/*
 | ||||||
|  | 		 * Update our count of bytes sent so far in this | ||||||
|  | 		 * transfer. | ||||||
|  | 		 */ | ||||||
|  | 		endpoint->sent += endpoint->last; | ||||||
|  | 
 | ||||||
|  | 		/*
 | ||||||
|  | 		 * We are finished with this transfer if we have sent | ||||||
|  | 		 * all of the bytes in our tx urb (urb->actual_length) | ||||||
|  | 		 * unless we need a zero-length terminating packet.  We | ||||||
|  | 		 * need a zero-length terminating packet if we returned | ||||||
|  | 		 * fewer bytes than were requested (wLength) by the host, | ||||||
|  | 		 * and the number of bytes we returned is an exact | ||||||
|  | 		 * multiple of the packet size endpoint->tx_packetSize. | ||||||
|  | 		 */ | ||||||
|  | 		if ((endpoint->sent == ep0_urb->actual_length) && | ||||||
|  | 		    ((ep0_urb->actual_length == wLength) || | ||||||
|  | 		     (endpoint->last != endpoint->tx_packetSize))) { | ||||||
|  | 			/* Done with control read data stage. */ | ||||||
|  | 			UDCDBG("control read data stage complete"); | ||||||
|  | 		} else { | ||||||
|  | 			/*
 | ||||||
|  | 			 * We still have another packet of data to send | ||||||
|  | 			 * in this control read data stage or else we | ||||||
|  | 			 * need a zero-length terminating packet. | ||||||
|  | 			 */ | ||||||
|  | 			UDCDBG("ACK control read data stage packet"); | ||||||
|  | 			spear_write_noniso_tx_fifo(endpoint); | ||||||
|  | 
 | ||||||
|  | 			ep_addr = endpoint->endpoint_address; | ||||||
|  | 			writel(0x0, &inep_regs_p[ep_addr].write_done); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static struct usb_endpoint_instance *spear_find_ep(int ep) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < udc_device->bus->max_endpoints; i++) { | ||||||
|  | 		if ((udc_device->bus->endpoint_array[i].endpoint_address & | ||||||
|  | 		     USB_ENDPOINT_NUMBER_MASK) == ep) | ||||||
|  | 			return &udc_device->bus->endpoint_array[i]; | ||||||
|  | 	} | ||||||
|  | 	return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Handle RX transaction on non-ISO endpoint. | ||||||
|  |  * The ep argument is a physical endpoint number for a non-ISO IN endpoint | ||||||
|  |  * in the range 1 to 15. | ||||||
|  |  */ | ||||||
|  | static void spear_udc_epn_rx(int ep) | ||||||
|  | { | ||||||
|  | 	int nbytes = 0; | ||||||
|  | 	struct urb *urb; | ||||||
|  | 	struct usb_endpoint_instance *endpoint = spear_find_ep(ep); | ||||||
|  | 
 | ||||||
|  | 	if (endpoint) { | ||||||
|  | 		urb = endpoint->rcv_urb; | ||||||
|  | 
 | ||||||
|  | 		if (urb) { | ||||||
|  | 			u8 *cp = urb->buffer + urb->actual_length; | ||||||
|  | 
 | ||||||
|  | 			nbytes = (readl(&outep_regs_p[ep].endp_status) >> 11) & | ||||||
|  | 			    0xfff; | ||||||
|  | 			usbgetpckfromfifo(ep, cp, nbytes); | ||||||
|  | 			usbd_rcv_complete(endpoint, nbytes, 0); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Handle TX transaction on non-ISO endpoint. | ||||||
|  |  * The ep argument is a physical endpoint number for a non-ISO IN endpoint | ||||||
|  |  * in the range 16 to 30. | ||||||
|  |  */ | ||||||
|  | static void spear_udc_epn_tx(int ep) | ||||||
|  | { | ||||||
|  | 	struct usb_endpoint_instance *endpoint = spear_find_ep(ep); | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * We need to transmit a terminating zero-length packet now if | ||||||
|  | 	 * we have sent all of the data in this URB and the transfer | ||||||
|  | 	 * size was an exact multiple of the packet size. | ||||||
|  | 	 */ | ||||||
|  | 	if (endpoint && endpoint->tx_urb && endpoint->tx_urb->actual_length) { | ||||||
|  | 		if (endpoint->last == endpoint->tx_packetSize) { | ||||||
|  | 			/* handle zero length packet here */ | ||||||
|  | 			writel(0x0, &inep_regs_p[ep].write_done); | ||||||
|  | 		} | ||||||
|  | 		/* retire the data that was just sent */ | ||||||
|  | 		usbd_tx_complete(endpoint); | ||||||
|  | 		/*
 | ||||||
|  | 		 * Check to see if we have more data ready to transmit | ||||||
|  | 		 * now. | ||||||
|  | 		 */ | ||||||
|  | 		if (endpoint->tx_urb && endpoint->tx_urb->actual_length) { | ||||||
|  | 			/* write data to FIFO */ | ||||||
|  | 			spear_write_noniso_tx_fifo(endpoint); | ||||||
|  | 			writel(0x0, &inep_regs_p[ep].write_done); | ||||||
|  | 
 | ||||||
|  | 		} else if (endpoint->tx_urb | ||||||
|  | 			   && (endpoint->tx_urb->actual_length == 0)) { | ||||||
|  | 			/* udc_set_nak(ep); */ | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Start of public functions. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* Called to start packet transmission. */ | ||||||
|  | int udc_endpoint_write(struct usb_endpoint_instance *endpoint) | ||||||
|  | { | ||||||
|  | 	udc_unset_nak(endpoint->endpoint_address & USB_ENDPOINT_NUMBER_MASK); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Start to initialize h/w stuff */ | ||||||
|  | int udc_init(void) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 	u32 plug_st; | ||||||
|  | 
 | ||||||
|  | 	udc_device = NULL; | ||||||
|  | 
 | ||||||
|  | 	UDCDBG("starting"); | ||||||
|  | 
 | ||||||
|  | 	readl(&plug_regs_p->plug_pending); | ||||||
|  | 
 | ||||||
|  | 	udc_disconnect(); | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < UDC_INIT_MDELAY; i++) | ||||||
|  | 		udelay(1000); | ||||||
|  | 
 | ||||||
|  | 	plug_st = readl(&plug_regs_p->plug_state); | ||||||
|  | 	writel(plug_st | PLUG_STATUS_EN, &plug_regs_p->plug_state); | ||||||
|  | 
 | ||||||
|  | 	writel(~0x0, &udc_regs_p->endp_int); | ||||||
|  | 	writel(~0x0, &udc_regs_p->dev_int_mask); | ||||||
|  | 	writel(~0x0, &udc_regs_p->endp_int_mask); | ||||||
|  | 
 | ||||||
|  | 	writel(DEV_CONF_FS_SPEED | DEV_CONF_REMWAKEUP | DEV_CONF_SELFPOW | | ||||||
|  | 	       /* Dev_Conf_SYNCFRAME | */ | ||||||
|  | 	       DEV_CONF_PHYINT_16, &udc_regs_p->dev_conf); | ||||||
|  | 
 | ||||||
|  | 	writel(0x0, &udc_regs_p->dev_cntl); | ||||||
|  | 
 | ||||||
|  | 	/* Clear all interrupts pending */ | ||||||
|  | 	writel(DEV_INT_MSK, &udc_regs_p->dev_int); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * udc_setup_ep - setup endpoint | ||||||
|  |  * Associate a physical endpoint with endpoint_instance | ||||||
|  |  */ | ||||||
|  | void udc_setup_ep(struct usb_device_instance *device, | ||||||
|  | 		  u32 ep, struct usb_endpoint_instance *endpoint) | ||||||
|  | { | ||||||
|  | 	UDCDBGA("setting up endpoint addr %x", endpoint->endpoint_address); | ||||||
|  | 	int ep_addr; | ||||||
|  | 	int ep_num, ep_type; | ||||||
|  | 	int packet_size; | ||||||
|  | 	int buffer_size; | ||||||
|  | 	int attributes; | ||||||
|  | 	char *tt; | ||||||
|  | 	u32 endp_intmask; | ||||||
|  | 
 | ||||||
|  | 	tt = getenv("usbtty"); | ||||||
|  | 	if (!tt) | ||||||
|  | 		tt = "generic"; | ||||||
|  | 
 | ||||||
|  | 	ep_addr = endpoint->endpoint_address; | ||||||
|  | 	ep_num = ep_addr & USB_ENDPOINT_NUMBER_MASK; | ||||||
|  | 
 | ||||||
|  | 	if ((ep_addr & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) { | ||||||
|  | 		/* IN endpoint */ | ||||||
|  | 		packet_size = endpoint->tx_packetSize; | ||||||
|  | 		buffer_size = packet_size * 2; | ||||||
|  | 		attributes = endpoint->tx_attributes; | ||||||
|  | 	} else { | ||||||
|  | 		/* OUT endpoint */ | ||||||
|  | 		packet_size = endpoint->rcv_packetSize; | ||||||
|  | 		buffer_size = packet_size * 2; | ||||||
|  | 		attributes = endpoint->rcv_attributes; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch (attributes & USB_ENDPOINT_XFERTYPE_MASK) { | ||||||
|  | 	case USB_ENDPOINT_XFER_CONTROL: | ||||||
|  | 		ep_type = ENDP_EPTYPE_CNTL; | ||||||
|  | 		break; | ||||||
|  | 	case USB_ENDPOINT_XFER_BULK: | ||||||
|  | 	default: | ||||||
|  | 		ep_type = ENDP_EPTYPE_BULK; | ||||||
|  | 		break; | ||||||
|  | 	case USB_ENDPOINT_XFER_INT: | ||||||
|  | 		ep_type = ENDP_EPTYPE_INT; | ||||||
|  | 		break; | ||||||
|  | 	case USB_ENDPOINT_XFER_ISOC: | ||||||
|  | 		ep_type = ENDP_EPTYPE_ISO; | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	struct udc_endp_regs *out_p = &outep_regs_p[ep_num]; | ||||||
|  | 	struct udc_endp_regs *in_p = &inep_regs_p[ep_num]; | ||||||
|  | 
 | ||||||
|  | 	if (!ep_addr) { | ||||||
|  | 		/* Setup endpoint 0 */ | ||||||
|  | 		buffer_size = packet_size; | ||||||
|  | 
 | ||||||
|  | 		writel(readl(&in_p->endp_cntl) | ENDP_CNTL_CNAK, | ||||||
|  | 		       &in_p->endp_cntl); | ||||||
|  | 
 | ||||||
|  | 		writel(readl(&out_p->endp_cntl) | ENDP_CNTL_CNAK, | ||||||
|  | 		       &out_p->endp_cntl); | ||||||
|  | 
 | ||||||
|  | 		writel(ENDP_CNTL_CONTROL | ENDP_CNTL_FLUSH, &in_p->endp_cntl); | ||||||
|  | 
 | ||||||
|  | 		writel(buffer_size / sizeof(int), &in_p->endp_bsorfn); | ||||||
|  | 
 | ||||||
|  | 		writel(packet_size, &in_p->endp_maxpacksize); | ||||||
|  | 
 | ||||||
|  | 		writel(ENDP_CNTL_CONTROL | ENDP_CNTL_RRDY, &out_p->endp_cntl); | ||||||
|  | 
 | ||||||
|  | 		writel(packet_size | ((buffer_size / sizeof(int)) << 16), | ||||||
|  | 		       &out_p->endp_maxpacksize); | ||||||
|  | 
 | ||||||
|  | 		writel((packet_size << 19) | ENDP_EPTYPE_CNTL, | ||||||
|  | 		       &udc_regs_p->udc_endp_reg[ep_num]); | ||||||
|  | 
 | ||||||
|  | 	} else if ((ep_addr & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) { | ||||||
|  | 		/* Setup the IN endpoint */ | ||||||
|  | 		writel(0x0, &in_p->endp_status); | ||||||
|  | 		writel((ep_type << 4) | ENDP_CNTL_RRDY, &in_p->endp_cntl); | ||||||
|  | 		writel(buffer_size / sizeof(int), &in_p->endp_bsorfn); | ||||||
|  | 		writel(packet_size, &in_p->endp_maxpacksize); | ||||||
|  | 
 | ||||||
|  | 		if (!strcmp(tt, "cdc_acm")) { | ||||||
|  | 			if (ep_type == ENDP_EPTYPE_INT) { | ||||||
|  | 				/* Conf no. 1 Interface no. 0 */ | ||||||
|  | 				writel((packet_size << 19) | | ||||||
|  | 				       ENDP_EPDIR_IN | (1 << 7) | | ||||||
|  | 				       (0 << 11) | (ep_type << 5) | ep_num, | ||||||
|  | 				       &udc_regs_p->udc_endp_reg[ep_num]); | ||||||
|  | 			} else { | ||||||
|  | 				/* Conf no. 1 Interface no. 1 */ | ||||||
|  | 				writel((packet_size << 19) | | ||||||
|  | 				       ENDP_EPDIR_IN | (1 << 7) | | ||||||
|  | 				       (1 << 11) | (ep_type << 5) | ep_num, | ||||||
|  | 				       &udc_regs_p->udc_endp_reg[ep_num]); | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			/* Conf no. 1 Interface no. 0 */ | ||||||
|  | 			writel((packet_size << 19) | | ||||||
|  | 			       ENDP_EPDIR_IN | (1 << 7) | | ||||||
|  | 			       (0 << 11) | (ep_type << 5) | ep_num, | ||||||
|  | 			       &udc_regs_p->udc_endp_reg[ep_num]); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} else { | ||||||
|  | 		/* Setup the OUT endpoint */ | ||||||
|  | 		writel(0x0, &out_p->endp_status); | ||||||
|  | 		writel((ep_type << 4) | ENDP_CNTL_RRDY, &out_p->endp_cntl); | ||||||
|  | 		writel(packet_size | ((buffer_size / sizeof(int)) << 16), | ||||||
|  | 		       &out_p->endp_maxpacksize); | ||||||
|  | 
 | ||||||
|  | 		if (!strcmp(tt, "cdc_acm")) { | ||||||
|  | 			writel((packet_size << 19) | | ||||||
|  | 			       ENDP_EPDIR_OUT | (1 << 7) | | ||||||
|  | 			       (1 << 11) | (ep_type << 5) | ep_num, | ||||||
|  | 			       &udc_regs_p->udc_endp_reg[ep_num]); | ||||||
|  | 		} else { | ||||||
|  | 			writel((packet_size << 19) | | ||||||
|  | 			       ENDP_EPDIR_OUT | (1 << 7) | | ||||||
|  | 			       (0 << 11) | (ep_type << 5) | ep_num, | ||||||
|  | 			       &udc_regs_p->udc_endp_reg[ep_num]); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	endp_intmask = readl(&udc_regs_p->endp_int_mask); | ||||||
|  | 	endp_intmask &= ~((1 << ep_num) | 0x10000 << ep_num); | ||||||
|  | 	writel(endp_intmask, &udc_regs_p->endp_int_mask); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Turn on the USB connection by enabling the pullup resistor */ | ||||||
|  | void udc_connect(void) | ||||||
|  | { | ||||||
|  | 	u32 plug_st; | ||||||
|  | 
 | ||||||
|  | 	plug_st = readl(&plug_regs_p->plug_state); | ||||||
|  | 	plug_st &= ~(PLUG_STATUS_PHY_RESET | PLUG_STATUS_PHY_MODE); | ||||||
|  | 	writel(plug_st, &plug_regs_p->plug_state); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Turn off the USB connection by disabling the pullup resistor */ | ||||||
|  | void udc_disconnect(void) | ||||||
|  | { | ||||||
|  | 	u32 plug_st; | ||||||
|  | 
 | ||||||
|  | 	plug_st = readl(&plug_regs_p->plug_state); | ||||||
|  | 	plug_st |= (PLUG_STATUS_PHY_RESET | PLUG_STATUS_PHY_MODE); | ||||||
|  | 	writel(plug_st, &plug_regs_p->plug_state); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Switch on the UDC */ | ||||||
|  | void udc_enable(struct usb_device_instance *device) | ||||||
|  | { | ||||||
|  | 	UDCDBGA("enable device %p, status %d", device, device->status); | ||||||
|  | 
 | ||||||
|  | 	/* Save the device structure pointer */ | ||||||
|  | 	udc_device = device; | ||||||
|  | 
 | ||||||
|  | 	/* Setup ep0 urb */ | ||||||
|  | 	if (!ep0_urb) { | ||||||
|  | 		ep0_urb = | ||||||
|  | 		    usbd_alloc_urb(udc_device, udc_device->bus->endpoint_array); | ||||||
|  | 	} else { | ||||||
|  | 		serial_printf("udc_enable: ep0_urb already allocated %p\n", | ||||||
|  | 			      ep0_urb); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	writel(DEV_INT_SOF, &udc_regs_p->dev_int_mask); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * udc_startup - allow udc code to do any additional startup | ||||||
|  |  */ | ||||||
|  | void udc_startup_events(struct usb_device_instance *device) | ||||||
|  | { | ||||||
|  | 	/* The DEVICE_INIT event puts the USB device in the state STATE_INIT. */ | ||||||
|  | 	usbd_device_event_irq(device, DEVICE_INIT, 0); | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * The DEVICE_CREATE event puts the USB device in the state | ||||||
|  | 	 * STATE_ATTACHED. | ||||||
|  | 	 */ | ||||||
|  | 	usbd_device_event_irq(device, DEVICE_CREATE, 0); | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * Some USB controller driver implementations signal | ||||||
|  | 	 * DEVICE_HUB_CONFIGURED and DEVICE_RESET events here. | ||||||
|  | 	 * DEVICE_HUB_CONFIGURED causes a transition to the state STATE_POWERED, | ||||||
|  | 	 * and DEVICE_RESET causes a transition to the state STATE_DEFAULT. | ||||||
|  | 	 * The SPEAr USB client controller has the capability to detect when the | ||||||
|  | 	 * USB cable is connected to a powered USB bus, so we will defer the | ||||||
|  | 	 * DEVICE_HUB_CONFIGURED and DEVICE_RESET events until later. | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	udc_enable(device); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Plug detection interrupt handling | ||||||
|  |  */ | ||||||
|  | void spear_udc_plug_irq(void) | ||||||
|  | { | ||||||
|  | 	if (readl(&plug_regs_p->plug_state) & PLUG_STATUS_ATTACHED) { | ||||||
|  | 		/*
 | ||||||
|  | 		 * USB cable attached | ||||||
|  | 		 * Turn off PHY reset bit (PLUG detect). | ||||||
|  | 		 * Switch PHY opmode to normal operation (PLUG detect). | ||||||
|  | 		 */ | ||||||
|  | 		udc_connect(); | ||||||
|  | 		writel(DEV_INT_SOF, &udc_regs_p->dev_int_mask); | ||||||
|  | 
 | ||||||
|  | 		UDCDBG("device attached and powered"); | ||||||
|  | 		udc_state_transition(udc_device->device_state, STATE_POWERED); | ||||||
|  | 	} else { | ||||||
|  | 		/*
 | ||||||
|  | 		 * USB cable detached | ||||||
|  | 		 * Reset the PHY and switch the mode. | ||||||
|  | 		 */ | ||||||
|  | 		udc_disconnect(); | ||||||
|  | 		writel(~0x0, &udc_regs_p->dev_int_mask); | ||||||
|  | 
 | ||||||
|  | 		UDCDBG("device detached or unpowered"); | ||||||
|  | 		udc_state_transition(udc_device->device_state, STATE_ATTACHED); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Device interrupt handling | ||||||
|  |  */ | ||||||
|  | void spear_udc_dev_irq(void) | ||||||
|  | { | ||||||
|  | 	if (readl(&udc_regs_p->dev_int) & DEV_INT_USBRESET) { | ||||||
|  | 		writel(~0x0, &udc_regs_p->endp_int_mask); | ||||||
|  | 
 | ||||||
|  | 		udc_connect(); | ||||||
|  | 
 | ||||||
|  | 		writel(readl(&inep_regs_p[0].endp_cntl) | ENDP_CNTL_FLUSH, | ||||||
|  | 		       &inep_regs_p[0].endp_cntl); | ||||||
|  | 
 | ||||||
|  | 		writel(DEV_INT_USBRESET, &udc_regs_p->dev_int); | ||||||
|  | 
 | ||||||
|  | 		UDCDBG("device reset in progess"); | ||||||
|  | 		udc_state_transition(udc_device->device_state, STATE_DEFAULT); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Device Enumeration completed */ | ||||||
|  | 	if (readl(&udc_regs_p->dev_int) & DEV_INT_ENUM) { | ||||||
|  | 		writel(DEV_INT_ENUM, &udc_regs_p->dev_int); | ||||||
|  | 
 | ||||||
|  | 		/* Endpoint interrupt enabled for Ctrl IN & Ctrl OUT */ | ||||||
|  | 		writel(readl(&udc_regs_p->endp_int_mask) & ~0x10001, | ||||||
|  | 		       &udc_regs_p->endp_int_mask); | ||||||
|  | 
 | ||||||
|  | 		UDCDBG("default -> addressed"); | ||||||
|  | 		udc_state_transition(udc_device->device_state, STATE_ADDRESSED); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* The USB will be in SUSPEND in 3 ms */ | ||||||
|  | 	if (readl(&udc_regs_p->dev_int) & DEV_INT_INACTIVE) { | ||||||
|  | 		writel(DEV_INT_INACTIVE, &udc_regs_p->dev_int); | ||||||
|  | 
 | ||||||
|  | 		UDCDBG("entering inactive state"); | ||||||
|  | 		/* usbd_device_event_irq(udc_device, DEVICE_BUS_INACTIVE, 0); */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* SetConfiguration command received */ | ||||||
|  | 	if (readl(&udc_regs_p->dev_int) & DEV_INT_SETCFG) { | ||||||
|  | 		writel(DEV_INT_SETCFG, &udc_regs_p->dev_int); | ||||||
|  | 
 | ||||||
|  | 		UDCDBG("entering configured state"); | ||||||
|  | 		udc_state_transition(udc_device->device_state, | ||||||
|  | 				     STATE_CONFIGURED); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* SetInterface command received */ | ||||||
|  | 	if (readl(&udc_regs_p->dev_int) & DEV_INT_SETINTF) | ||||||
|  | 		writel(DEV_INT_SETINTF, &udc_regs_p->dev_int); | ||||||
|  | 
 | ||||||
|  | 	/* USB Suspend detected on cable */ | ||||||
|  | 	if (readl(&udc_regs_p->dev_int) & DEV_INT_SUSPUSB) { | ||||||
|  | 		writel(DEV_INT_SUSPUSB, &udc_regs_p->dev_int); | ||||||
|  | 
 | ||||||
|  | 		UDCDBG("entering suspended state"); | ||||||
|  | 		usbd_device_event_irq(udc_device, DEVICE_BUS_INACTIVE, 0); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* USB Start-Of-Frame detected on cable */ | ||||||
|  | 	if (readl(&udc_regs_p->dev_int) & DEV_INT_SOF) | ||||||
|  | 		writel(DEV_INT_SOF, &udc_regs_p->dev_int); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Endpoint interrupt handling | ||||||
|  |  */ | ||||||
|  | void spear_udc_endpoint_irq(void) | ||||||
|  | { | ||||||
|  | 	while (readl(&udc_regs_p->endp_int) & ENDP0_INT_CTRLOUT) { | ||||||
|  | 
 | ||||||
|  | 		writel(ENDP0_INT_CTRLOUT, &udc_regs_p->endp_int); | ||||||
|  | 
 | ||||||
|  | 		if ((readl(&outep_regs_p[0].endp_status) & ENDP_STATUS_OUTMSK) | ||||||
|  | 		    == ENDP_STATUS_OUT_SETUP) { | ||||||
|  | 			spear_udc_setup(udc_device->bus->endpoint_array + 0); | ||||||
|  | 			writel(ENDP_STATUS_OUT_SETUP, | ||||||
|  | 			       &outep_regs_p[0].endp_status); | ||||||
|  | 
 | ||||||
|  | 		} else if ((readl(&outep_regs_p[0].endp_status) & | ||||||
|  | 			    ENDP_STATUS_OUTMSK) == ENDP_STATUS_OUT_DATA) { | ||||||
|  | 			spear_udc_ep0_rx(udc_device->bus->endpoint_array + 0); | ||||||
|  | 			writel(ENDP_STATUS_OUT_DATA, | ||||||
|  | 			       &outep_regs_p[0].endp_status); | ||||||
|  | 
 | ||||||
|  | 		} else if ((readl(&outep_regs_p[0].endp_status) & | ||||||
|  | 			    ENDP_STATUS_OUTMSK) == ENDP_STATUS_OUT_NONE) { | ||||||
|  | 			/* NONE received */ | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		writel(0x0, &outep_regs_p[0].endp_status); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (readl(&udc_regs_p->endp_int) & ENDP0_INT_CTRLIN) { | ||||||
|  | 		spear_udc_ep0_tx(udc_device->bus->endpoint_array + 0); | ||||||
|  | 
 | ||||||
|  | 		writel(ENDP_STATUS_IN, &inep_regs_p[0].endp_status); | ||||||
|  | 		writel(ENDP0_INT_CTRLIN, &udc_regs_p->endp_int); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	while (readl(&udc_regs_p->endp_int) & ENDP_INT_NONISOOUT_MSK) { | ||||||
|  | 		u32 epnum = 0; | ||||||
|  | 		u32 ep_int = readl(&udc_regs_p->endp_int) & | ||||||
|  | 		    ENDP_INT_NONISOOUT_MSK; | ||||||
|  | 
 | ||||||
|  | 		ep_int >>= 16; | ||||||
|  | 		while (0x0 == (ep_int & 0x1)) { | ||||||
|  | 			ep_int >>= 1; | ||||||
|  | 			epnum++; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		writel((1 << 16) << epnum, &udc_regs_p->endp_int); | ||||||
|  | 
 | ||||||
|  | 		if ((readl(&outep_regs_p[epnum].endp_status) & | ||||||
|  | 		     ENDP_STATUS_OUTMSK) == ENDP_STATUS_OUT_DATA) { | ||||||
|  | 
 | ||||||
|  | 			spear_udc_epn_rx(epnum); | ||||||
|  | 			writel(ENDP_STATUS_OUT_DATA, | ||||||
|  | 			       &outep_regs_p[epnum].endp_status); | ||||||
|  | 		} else if ((readl(&outep_regs_p[epnum].endp_status) & | ||||||
|  | 			    ENDP_STATUS_OUTMSK) == ENDP_STATUS_OUT_NONE) { | ||||||
|  | 			writel(0x0, &outep_regs_p[epnum].endp_status); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (readl(&udc_regs_p->endp_int) & ENDP_INT_NONISOIN_MSK) { | ||||||
|  | 		u32 epnum = 0; | ||||||
|  | 		u32 ep_int = readl(&udc_regs_p->endp_int) & | ||||||
|  | 		    ENDP_INT_NONISOIN_MSK; | ||||||
|  | 
 | ||||||
|  | 		while (0x0 == (ep_int & 0x1)) { | ||||||
|  | 			ep_int >>= 1; | ||||||
|  | 			epnum++; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (readl(&inep_regs_p[epnum].endp_status) & ENDP_STATUS_IN) { | ||||||
|  | 			writel(ENDP_STATUS_IN, | ||||||
|  | 			       &outep_regs_p[epnum].endp_status); | ||||||
|  | 			spear_udc_epn_tx(epnum); | ||||||
|  | 
 | ||||||
|  | 			writel(ENDP_STATUS_IN, | ||||||
|  | 			       &outep_regs_p[epnum].endp_status); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		writel((1 << epnum), &udc_regs_p->endp_int); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * UDC interrupts | ||||||
|  |  */ | ||||||
|  | void udc_irq(void) | ||||||
|  | { | ||||||
|  | 	/*
 | ||||||
|  | 	 * Loop while we have interrupts. | ||||||
|  | 	 * If we don't do this, the input chain | ||||||
|  | 	 * polling delay is likely to miss | ||||||
|  | 	 * host requests. | ||||||
|  | 	 */ | ||||||
|  | 	while (readl(&plug_regs_p->plug_pending)) | ||||||
|  | 		spear_udc_plug_irq(); | ||||||
|  | 
 | ||||||
|  | 	while (readl(&udc_regs_p->dev_int)) | ||||||
|  | 		spear_udc_dev_irq(); | ||||||
|  | 
 | ||||||
|  | 	if (readl(&udc_regs_p->endp_int)) | ||||||
|  | 		spear_udc_endpoint_irq(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Flow control */ | ||||||
|  | void udc_set_nak(int epid) | ||||||
|  | { | ||||||
|  | 	writel(readl(&inep_regs_p[epid].endp_cntl) | ENDP_CNTL_SNAK, | ||||||
|  | 	       &inep_regs_p[epid].endp_cntl); | ||||||
|  | 
 | ||||||
|  | 	writel(readl(&outep_regs_p[epid].endp_cntl) | ENDP_CNTL_SNAK, | ||||||
|  | 	       &outep_regs_p[epid].endp_cntl); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void udc_unset_nak(int epid) | ||||||
|  | { | ||||||
|  | 	u32 val; | ||||||
|  | 
 | ||||||
|  | 	val = readl(&inep_regs_p[epid].endp_cntl); | ||||||
|  | 	val &= ~ENDP_CNTL_SNAK; | ||||||
|  | 	val |= ENDP_CNTL_CNAK; | ||||||
|  | 	writel(val, &inep_regs_p[epid].endp_cntl); | ||||||
|  | 
 | ||||||
|  | 	val = readl(&outep_regs_p[epid].endp_cntl); | ||||||
|  | 	val &= ~ENDP_CNTL_SNAK; | ||||||
|  | 	val |= ENDP_CNTL_CNAK; | ||||||
|  | 	writel(val, &outep_regs_p[epid].endp_cntl); | ||||||
|  | } | ||||||
|  | @ -1,9 +1,23 @@ | ||||||
| /*
 | /*
 | ||||||
|  * arch/asm-arm/mach-kirkwood/include/mach/gpio.h |  * arch/asm-arm/mach-kirkwood/include/mach/gpio.h | ||||||
|  * |  * | ||||||
|  * This file is licensed under the terms of the GNU General Public |  * See file CREDITS for list of people who contributed to this | ||||||
|  * License version 2.  This program is licensed "as is" without any |  * project. | ||||||
|  * warranty of any kind, whether express or implied. |  * | ||||||
|  |  * 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., 51 Franklin Street, Fifth Floor, Boston, | ||||||
|  |  * MA 02110-1301 USA | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
|  | @ -3,9 +3,23 @@ | ||||||
|  * |  * | ||||||
|  * Copyright 2009: Marvell Technology Group Ltd. |  * Copyright 2009: Marvell Technology Group Ltd. | ||||||
|  * |  * | ||||||
|  * This file is licensed under the terms of the GNU General Public |  * See file CREDITS for list of people who contributed to this | ||||||
|  * License version 2.  This program is licensed "as is" without any |  * project. | ||||||
|  * warranty of any kind, whether express or implied. |  * | ||||||
|  |  * 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., 51 Franklin Street, Fifth Floor, Boston, | ||||||
|  |  * MA 02110-1301 USA | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #ifndef __KIRKWOOD_MPP_H | #ifndef __KIRKWOOD_MPP_H | ||||||
|  |  | ||||||
|  | @ -817,9 +817,9 @@ | ||||||
| /*-----------------------------------------------------------------------
 | /*-----------------------------------------------------------------------
 | ||||||
|  * Physical Memory Map |  * Physical Memory Map | ||||||
|  */ |  */ | ||||||
| #define DMC1_MEM_CFG	0x80010012	/* Chip1, Burst4, Row/Column bit */ | #define DMC1_MEM_CFG	0x00010012	/* burst 4, 13-bit row, 10-bit col */ | ||||||
| #define DMC1_MEM_CFG2	0xB45 | #define DMC1_MEM_CFG2	0xB45 | ||||||
| #define DMC1_CHIP0_CFG	0x150F8		/* 0x4000_0000 ~ 0x43ff_ffff (64MB) */ | #define DMC1_CHIP0_CFG	0x150F8		/* 0x5000_0000~0x57ff_ffff (128 MiB) */ | ||||||
| #define DMC_DDR_32_CFG	0x0 		/* 32bit, DDR */ | #define DMC_DDR_32_CFG	0x0 		/* 32bit, DDR */ | ||||||
| 
 | 
 | ||||||
| /* Memory Parameters */ | /* Memory Parameters */ | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /*
 | /*
 | ||||||
|  * Copyright (C) 2009 Samsung Electronics |  * Copyright (C) 2009 Samsung Electrnoics | ||||||
|  * Minkyu Kang <mk7.kang@samsung.com> |  * Minkyu Kang <mk7.kang@samsung.com> | ||||||
|  * |  * | ||||||
|  * See file CREDITS for list of people who contributed to this |  * See file CREDITS for list of people who contributed to this | ||||||
|  | @ -21,23 +21,12 @@ | ||||||
|  * MA 02111-1307 USA |  * MA 02111-1307 USA | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include <common.h> | #ifndef _SYS_PROTO_H_ | ||||||
| #include <asm/cache.h> | #define _SYS_PROTO_H_ | ||||||
| 
 | 
 | ||||||
| void l2_cache_enable(void) | u32 get_device_type(void); | ||||||
| { | void invalidate_dcache(u32); | ||||||
| 	unsigned long i; | void l2_cache_disable(void); | ||||||
|  | void l2_cache_enable(void); | ||||||
| 
 | 
 | ||||||
| 	__asm__ __volatile__("mrc p15, 0, %0, c1, c0, 1":"=r"(i)); | #endif | ||||||
| 	__asm__ __volatile__("orr %0, %0, #0x2":"=r"(i)); |  | ||||||
| 	__asm__ __volatile__("mcr p15, 0, %0, c1, c0, 1":"=r"(i)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void l2_cache_disable(void) |  | ||||||
| { |  | ||||||
| 	unsigned long i; |  | ||||||
| 
 |  | ||||||
| 	__asm__ __volatile__("mrc p15, 0, %0, c1, c0, 1":"=r"(i)); |  | ||||||
| 	__asm__ __volatile__("bic %0, %0, #0x2":"=r"(i)); |  | ||||||
| 	__asm__ __volatile__("mcr p15, 0, %0, c1, c0, 1":"=r"(i)); |  | ||||||
| } |  | ||||||
|  | @ -0,0 +1,66 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, STMicroelectronics, <vipin.kumar@st.com> | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _ASM_ARCH_HARDWARE_H | ||||||
|  | #define _ASM_ARCH_HARDWARE_H | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_USBD_BASE			(0xE1100000) | ||||||
|  | #define CONFIG_SYS_PLUG_BASE			(0xE1200000) | ||||||
|  | #define CONFIG_SYS_FIFO_BASE			(0xE1000800) | ||||||
|  | #define CONFIG_SYS_SMI_BASE			(0xFC000000) | ||||||
|  | #define CONFIG_SPEAR_SYSCNTLBASE		(0xFCA00000) | ||||||
|  | #define CONFIG_SPEAR_TIMERBASE			(0xFC800000) | ||||||
|  | #define CONFIG_SPEAR_MISCBASE			(0xFCA80000) | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_NAND_CLE			(1 << 16) | ||||||
|  | #define CONFIG_SYS_NAND_ALE			(1 << 17) | ||||||
|  | 
 | ||||||
|  | #if defined(CONFIG_SPEAR600) | ||||||
|  | #define CONFIG_SYS_I2C_BASE			(0xD0200000) | ||||||
|  | #define CONFIG_SPEAR_FSMCBASE			(0xD1800000) | ||||||
|  | 
 | ||||||
|  | #elif defined(CONFIG_SPEAR300) | ||||||
|  | #define CONFIG_SYS_I2C_BASE			(0xD0180000) | ||||||
|  | #define CONFIG_SPEAR_FSMCBASE			(0x94000000) | ||||||
|  | 
 | ||||||
|  | #elif defined(CONFIG_SPEAR310) | ||||||
|  | #define CONFIG_SYS_I2C_BASE			(0xD0180000) | ||||||
|  | #define CONFIG_SPEAR_FSMCBASE			(0x44000000) | ||||||
|  | 
 | ||||||
|  | #undef CONFIG_SYS_NAND_CLE | ||||||
|  | #undef CONFIG_SYS_NAND_ALE | ||||||
|  | #define CONFIG_SYS_NAND_CLE			(1 << 17) | ||||||
|  | #define CONFIG_SYS_NAND_ALE			(1 << 16) | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SPEAR_EMIBASE			(0x4F000000) | ||||||
|  | #define CONFIG_SPEAR_RASBASE			(0xB4000000) | ||||||
|  | 
 | ||||||
|  | #elif defined(CONFIG_SPEAR320) | ||||||
|  | #define CONFIG_SYS_I2C_BASE			(0xD0180000) | ||||||
|  | #define CONFIG_SPEAR_FSMCBASE			(0x4C000000) | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SPEAR_EMIBASE			(0x40000000) | ||||||
|  | #define CONFIG_SPEAR_RASBASE			(0xB3000000) | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | #endif /* _ASM_ARCH_HARDWARE_H */ | ||||||
|  | @ -0,0 +1,46 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __SPR_DEFS_H__ | ||||||
|  | #define __SPR_DEFS_H__ | ||||||
|  | 
 | ||||||
|  | extern int spear_board_init(ulong); | ||||||
|  | extern void setfreq(unsigned int, unsigned int); | ||||||
|  | extern unsigned int setfreq_sz; | ||||||
|  | 
 | ||||||
|  | struct chip_data { | ||||||
|  | 	int cpufreq; | ||||||
|  | 	int dramfreq; | ||||||
|  | 	int dramtype; | ||||||
|  | 	uchar version[32]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* HW mac id in i2c memory definitions */ | ||||||
|  | #define MAGIC_OFF	0x0 | ||||||
|  | #define MAGIC_LEN	0x2 | ||||||
|  | #define MAGIC_BYTE0	0x55 | ||||||
|  | #define MAGIC_BYTE1	0xAA | ||||||
|  | #define MAC_OFF		0x2 | ||||||
|  | #define MAC_LEN		0x6 | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | @ -0,0 +1,54 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Ryan CHEN, ST Micoelectronics, ryan.chen@st.com | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __SPEAR_EMI_H__ | ||||||
|  | #define __SPEAR_EMI_H__ | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_SPEAR_EMI | ||||||
|  | 
 | ||||||
|  | struct emi_bank_regs { | ||||||
|  | 	u32 tap; | ||||||
|  | 	u32 tsdp; | ||||||
|  | 	u32 tdpw; | ||||||
|  | 	u32 tdpr; | ||||||
|  | 	u32 tdcs; | ||||||
|  | 	u32 control; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct emi_regs { | ||||||
|  | 	struct emi_bank_regs bank_regs[CONFIG_SYS_MAX_FLASH_BANKS]; | ||||||
|  | 	u32 tout; | ||||||
|  | 	u32 ack; | ||||||
|  | 	u32 irq; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #define EMI_ACKMSK		0x40 | ||||||
|  | 
 | ||||||
|  | /* control register definitions */ | ||||||
|  | #define EMI_CNTL_ENBBYTEW	(1 << 2) | ||||||
|  | #define EMI_CNTL_ENBBYTER	(1 << 3) | ||||||
|  | #define EMI_CNTL_ENBBYTERW	(EMI_CNTL_ENBBYTER | EMI_CNTL_ENBBYTEW) | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | @ -0,0 +1,85 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _SPR_GPT_H | ||||||
|  | #define _SPR_GPT_H | ||||||
|  | 
 | ||||||
|  | struct gpt_regs { | ||||||
|  | 	u8 reserved[0x80]; | ||||||
|  | 	u32 control; | ||||||
|  | 	u32 status; | ||||||
|  | 	u32 compare; | ||||||
|  | 	u32 count; | ||||||
|  | 	u32 capture_re; | ||||||
|  | 	u32 capture_fe; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * TIMER_CONTROL register settings | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define GPT_PRESCALER_MASK		0x000F | ||||||
|  | #define GPT_PRESCALER_1			0x0000 | ||||||
|  | #define GPT_PRESCALER_2 		0x0001 | ||||||
|  | #define GPT_PRESCALER_4 		0x0002 | ||||||
|  | #define GPT_PRESCALER_8 		0x0003 | ||||||
|  | #define GPT_PRESCALER_16		0x0004 | ||||||
|  | #define GPT_PRESCALER_32		0x0005 | ||||||
|  | #define GPT_PRESCALER_64		0x0006 | ||||||
|  | #define GPT_PRESCALER_128		0x0007 | ||||||
|  | #define GPT_PRESCALER_256		0x0008 | ||||||
|  | 
 | ||||||
|  | #define GPT_MODE_SINGLE_SHOT		0x0010 | ||||||
|  | #define GPT_MODE_AUTO_RELOAD		0x0000 | ||||||
|  | 
 | ||||||
|  | #define GPT_ENABLE			0x0020 | ||||||
|  | 
 | ||||||
|  | #define GPT_CAPT_MODE_MASK		0x00C0 | ||||||
|  | #define GPT_CAPT_MODE_NONE		0x0000 | ||||||
|  | #define GPT_CAPT_MODE_RE		0x0040 | ||||||
|  | #define GPT_CAPT_MODE_FE		0x0080 | ||||||
|  | #define GPT_CAPT_MODE_BOTH		0x00C0 | ||||||
|  | 
 | ||||||
|  | #define GPT_INT_MATCH			0x0100 | ||||||
|  | #define GPT_INT_FE			0x0200 | ||||||
|  | #define GPT_INT_RE			0x0400 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * TIMER_STATUS register settings | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define GPT_STS_MATCH			0x0001 | ||||||
|  | #define GPT_STS_FE			0x0002 | ||||||
|  | #define GPT_STS_RE			0x0004 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * TIMER_COMPARE register settings | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define GPT_FREE_RUNNING		0xFFFF | ||||||
|  | 
 | ||||||
|  | /* Timer, HZ specific defines */ | ||||||
|  | #define CONFIG_SPEAR_HZ			(1000) | ||||||
|  | #define CONFIG_SPEAR_HZ_CLOCK		(8300000) | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | @ -0,0 +1,146 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __SPR_I2C_H_ | ||||||
|  | #define __SPR_I2C_H_ | ||||||
|  | 
 | ||||||
|  | struct i2c_regs { | ||||||
|  | 	u32 ic_con; | ||||||
|  | 	u32 ic_tar; | ||||||
|  | 	u32 ic_sar; | ||||||
|  | 	u32 ic_hs_maddr; | ||||||
|  | 	u32 ic_cmd_data; | ||||||
|  | 	u32 ic_ss_scl_hcnt; | ||||||
|  | 	u32 ic_ss_scl_lcnt; | ||||||
|  | 	u32 ic_fs_scl_hcnt; | ||||||
|  | 	u32 ic_fs_scl_lcnt; | ||||||
|  | 	u32 ic_hs_scl_hcnt; | ||||||
|  | 	u32 ic_hs_scl_lcnt; | ||||||
|  | 	u32 ic_intr_stat; | ||||||
|  | 	u32 ic_intr_mask; | ||||||
|  | 	u32 ic_raw_intr_stat; | ||||||
|  | 	u32 ic_rx_tl; | ||||||
|  | 	u32 ic_tx_tl; | ||||||
|  | 	u32 ic_clr_intr; | ||||||
|  | 	u32 ic_clr_rx_under; | ||||||
|  | 	u32 ic_clr_rx_over; | ||||||
|  | 	u32 ic_clr_tx_over; | ||||||
|  | 	u32 ic_clr_rd_req; | ||||||
|  | 	u32 ic_clr_tx_abrt; | ||||||
|  | 	u32 ic_clr_rx_done; | ||||||
|  | 	u32 ic_clr_activity; | ||||||
|  | 	u32 ic_clr_stop_det; | ||||||
|  | 	u32 ic_clr_start_det; | ||||||
|  | 	u32 ic_clr_gen_call; | ||||||
|  | 	u32 ic_enable; | ||||||
|  | 	u32 ic_status; | ||||||
|  | 	u32 ic_txflr; | ||||||
|  | 	u32 ix_rxflr; | ||||||
|  | 	u32 reserved_1; | ||||||
|  | 	u32 ic_tx_abrt_source; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #define IC_CLK			166 | ||||||
|  | #define NANO_TO_MICRO		1000 | ||||||
|  | 
 | ||||||
|  | /* High and low times in different speed modes (in ns) */ | ||||||
|  | #define MIN_SS_SCL_HIGHTIME	4000 | ||||||
|  | #define MIN_SS_SCL_LOWTIME	5000 | ||||||
|  | #define MIN_FS_SCL_HIGHTIME	800 | ||||||
|  | #define MIN_FS_SCL_LOWTIME	1700 | ||||||
|  | #define MIN_HS_SCL_HIGHTIME	60 | ||||||
|  | #define MIN_HS_SCL_LOWTIME	160 | ||||||
|  | 
 | ||||||
|  | /* Worst case timeout for 1 byte is kept as 2ms */ | ||||||
|  | #define I2C_BYTE_TO		(CONFIG_SYS_HZ/500) | ||||||
|  | #define I2C_STOPDET_TO		(CONFIG_SYS_HZ/500) | ||||||
|  | #define I2C_BYTE_TO_BB		(I2C_BYTE_TO * 16) | ||||||
|  | 
 | ||||||
|  | /* i2c control register definitions */ | ||||||
|  | #define IC_CON_SD		0x0040 | ||||||
|  | #define IC_CON_RE		0x0020 | ||||||
|  | #define IC_CON_10BITADDRMASTER	0x0010 | ||||||
|  | #define IC_CON_10BITADDR_SLAVE	0x0008 | ||||||
|  | #define IC_CON_SPD_MSK		0x0006 | ||||||
|  | #define IC_CON_SPD_SS		0x0002 | ||||||
|  | #define IC_CON_SPD_FS		0x0004 | ||||||
|  | #define IC_CON_SPD_HS		0x0006 | ||||||
|  | #define IC_CON_MM		0x0001 | ||||||
|  | 
 | ||||||
|  | /* i2c target address register definitions */ | ||||||
|  | #define TAR_ADDR		0x0050 | ||||||
|  | 
 | ||||||
|  | /* i2c slave address register definitions */ | ||||||
|  | #define IC_SLAVE_ADDR		0x0002 | ||||||
|  | 
 | ||||||
|  | /* i2c data buffer and command register definitions */ | ||||||
|  | #define IC_CMD			0x0100 | ||||||
|  | 
 | ||||||
|  | /* i2c interrupt status register definitions */ | ||||||
|  | #define IC_GEN_CALL		0x0800 | ||||||
|  | #define IC_START_DET		0x0400 | ||||||
|  | #define IC_STOP_DET		0x0200 | ||||||
|  | #define IC_ACTIVITY		0x0100 | ||||||
|  | #define IC_RX_DONE		0x0080 | ||||||
|  | #define IC_TX_ABRT		0x0040 | ||||||
|  | #define IC_RD_REQ		0x0020 | ||||||
|  | #define IC_TX_EMPTY		0x0010 | ||||||
|  | #define IC_TX_OVER		0x0008 | ||||||
|  | #define IC_RX_FULL		0x0004 | ||||||
|  | #define IC_RX_OVER 		0x0002 | ||||||
|  | #define IC_RX_UNDER		0x0001 | ||||||
|  | 
 | ||||||
|  | /* fifo threshold register definitions */ | ||||||
|  | #define IC_TL0			0x00 | ||||||
|  | #define IC_TL1			0x01 | ||||||
|  | #define IC_TL2			0x02 | ||||||
|  | #define IC_TL3			0x03 | ||||||
|  | #define IC_TL4			0x04 | ||||||
|  | #define IC_TL5			0x05 | ||||||
|  | #define IC_TL6			0x06 | ||||||
|  | #define IC_TL7			0x07 | ||||||
|  | #define IC_RX_TL		IC_TL0 | ||||||
|  | #define IC_TX_TL		IC_TL0 | ||||||
|  | 
 | ||||||
|  | /* i2c enable register definitions */ | ||||||
|  | #define IC_ENABLE_0B		0x0001 | ||||||
|  | 
 | ||||||
|  | /* i2c status register  definitions */ | ||||||
|  | #define IC_STATUS_SA		0x0040 | ||||||
|  | #define IC_STATUS_MA		0x0020 | ||||||
|  | #define IC_STATUS_RFF		0x0010 | ||||||
|  | #define IC_STATUS_RFNE		0x0008 | ||||||
|  | #define IC_STATUS_TFE		0x0004 | ||||||
|  | #define IC_STATUS_TFNF		0x0002 | ||||||
|  | #define IC_STATUS_ACT		0x0001 | ||||||
|  | 
 | ||||||
|  | /* Speed Selection */ | ||||||
|  | #define IC_SPEED_MODE_STANDARD	1 | ||||||
|  | #define IC_SPEED_MODE_FAST	2 | ||||||
|  | #define IC_SPEED_MODE_MAX	3 | ||||||
|  | 
 | ||||||
|  | #define I2C_MAX_SPEED		3400000 | ||||||
|  | #define I2C_FAST_SPEED		400000 | ||||||
|  | #define I2C_STANDARD_SPEED	100000 | ||||||
|  | 
 | ||||||
|  | #endif /* __SPR_I2C_H_ */ | ||||||
|  | @ -0,0 +1,130 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _SPR_MISC_H | ||||||
|  | #define _SPR_MISC_H | ||||||
|  | 
 | ||||||
|  | struct misc_regs { | ||||||
|  | 	u32 auto_cfg_reg;	/* 0x0 */ | ||||||
|  | 	u32 armdbg_ctr_reg;	/* 0x4 */ | ||||||
|  | 	u32 pll1_cntl;		/* 0x8 */ | ||||||
|  | 	u32 pll1_frq;		/* 0xc */ | ||||||
|  | 	u32 pll1_mod;		/* 0x10 */ | ||||||
|  | 	u32 pll2_cntl;		/* 0x14 */ | ||||||
|  | 	u32 pll2_frq;		/* 0x18 */ | ||||||
|  | 	u32 pll2_mod;		/* 0x1C */ | ||||||
|  | 	u32 pll_ctr_reg;	/* 0x20 */ | ||||||
|  | 	u32 amba_clk_cfg;	/* 0x24 */ | ||||||
|  | 	u32 periph_clk_cfg;	/* 0x28 */ | ||||||
|  | 	u32 periph1_clken;	/* 0x2C */ | ||||||
|  | 	u32 periph2_clken;	/* 0x30 */ | ||||||
|  | 	u32 ras_clken;		/* 0x34 */ | ||||||
|  | 	u32 periph1_rst;	/* 0x38 */ | ||||||
|  | 	u32 periph2_rst;	/* 0x3C */ | ||||||
|  | 	u32 ras_rst;		/* 0x40 */ | ||||||
|  | 	u32 prsc1_clk_cfg;	/* 0x44 */ | ||||||
|  | 	u32 prsc2_clk_cfg;	/* 0x48 */ | ||||||
|  | 	u32 prsc3_clk_cfg;	/* 0x4C */ | ||||||
|  | 	u32 amem_cfg_ctrl;	/* 0x50 */ | ||||||
|  | 	u32 port_cfg_ctrl;	/* 0x54 */ | ||||||
|  | 	u32 reserved_1;		/* 0x58 */ | ||||||
|  | 	u32 clcd_synth_clk;	/* 0x5C */ | ||||||
|  | 	u32 irda_synth_clk;	/* 0x60 */ | ||||||
|  | 	u32 uart_synth_clk;	/* 0x64 */ | ||||||
|  | 	u32 gmac_synth_clk;	/* 0x68 */ | ||||||
|  | 	u32 ras_synth1_clk;	/* 0x6C */ | ||||||
|  | 	u32 ras_synth2_clk;	/* 0x70 */ | ||||||
|  | 	u32 ras_synth3_clk;	/* 0x74 */ | ||||||
|  | 	u32 ras_synth4_clk;	/* 0x78 */ | ||||||
|  | 	u32 arb_icm_ml1;	/* 0x7C */ | ||||||
|  | 	u32 arb_icm_ml2;	/* 0x80 */ | ||||||
|  | 	u32 arb_icm_ml3;	/* 0x84 */ | ||||||
|  | 	u32 arb_icm_ml4;	/* 0x88 */ | ||||||
|  | 	u32 arb_icm_ml5;	/* 0x8C */ | ||||||
|  | 	u32 arb_icm_ml6;	/* 0x90 */ | ||||||
|  | 	u32 arb_icm_ml7;	/* 0x94 */ | ||||||
|  | 	u32 arb_icm_ml8;	/* 0x98 */ | ||||||
|  | 	u32 arb_icm_ml9;	/* 0x9C */ | ||||||
|  | 	u32 dma_src_sel;	/* 0xA0 */ | ||||||
|  | 	u32 uphy_ctr_reg;	/* 0xA4 */ | ||||||
|  | 	u32 gmac_ctr_reg;	/* 0xA8 */ | ||||||
|  | 	u32 port_bridge_ctrl;	/* 0xAC */ | ||||||
|  | 	u32 reserved_2[4];	/* 0xB0--0xBC */ | ||||||
|  | 	u32 prc1_ilck_ctrl_reg;	/* 0xC0 */ | ||||||
|  | 	u32 prc2_ilck_ctrl_reg;	/* 0xC4 */ | ||||||
|  | 	u32 prc3_ilck_ctrl_reg;	/* 0xC8 */ | ||||||
|  | 	u32 prc4_ilck_ctrl_reg;	/* 0xCC */ | ||||||
|  | 	u32 prc1_intr_ctrl_reg;	/* 0xD0 */ | ||||||
|  | 	u32 prc2_intr_ctrl_reg;	/* 0xD4 */ | ||||||
|  | 	u32 prc3_intr_ctrl_reg;	/* 0xD8 */ | ||||||
|  | 	u32 prc4_intr_ctrl_reg;	/* 0xDC */ | ||||||
|  | 	u32 powerdown_cfg_reg;	/* 0xE0 */ | ||||||
|  | 	u32 ddr_1v8_compensation;	/* 0xE4  */ | ||||||
|  | 	u32 ddr_2v5_compensation;	/* 0xE8 */ | ||||||
|  | 	u32 core_3v3_compensation;	/* 0xEC */ | ||||||
|  | 	u32 ddr_pad;		/* 0xF0 */ | ||||||
|  | 	u32 bist1_ctr_reg;	/* 0xF4 */ | ||||||
|  | 	u32 bist2_ctr_reg;	/* 0xF8 */ | ||||||
|  | 	u32 bist3_ctr_reg;	/* 0xFC */ | ||||||
|  | 	u32 bist4_ctr_reg;	/* 0x100 */ | ||||||
|  | 	u32 bist5_ctr_reg;	/* 0x104 */ | ||||||
|  | 	u32 bist1_rslt_reg;	/* 0x108 */ | ||||||
|  | 	u32 bist2_rslt_reg;	/* 0x10C */ | ||||||
|  | 	u32 bist3_rslt_reg;	/* 0x110 */ | ||||||
|  | 	u32 bist4_rslt_reg;	/* 0x114 */ | ||||||
|  | 	u32 bist5_rslt_reg;	/* 0x118 */ | ||||||
|  | 	u32 syst_error_reg;	/* 0x11C */ | ||||||
|  | 	u32 reserved_3[0x1FB8];	/* 0x120--0x7FFC */ | ||||||
|  | 	u32 ras_gpp1_in;	/* 0x8000 */ | ||||||
|  | 	u32 ras_gpp2_in;	/* 0x8004 */ | ||||||
|  | 	u32 ras_gpp1_out;	/* 0x8008 */ | ||||||
|  | 	u32 ras_gpp2_out;	/* 0x800C */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* AUTO_CFG_REG value */ | ||||||
|  | #define MISC_SOCCFGMSK                  0x0000003F | ||||||
|  | #define MISC_SOCCFG30                   0x0000000C | ||||||
|  | #define MISC_SOCCFG31                   0x0000000D | ||||||
|  | #define MISC_NANDDIS			0x00020000 | ||||||
|  | 
 | ||||||
|  | /* PERIPH_CLK_CFG value */ | ||||||
|  | #define MISC_GPT3SYNTH			0x00000400 | ||||||
|  | #define MISC_GPT4SYNTH			0x00000800 | ||||||
|  | 
 | ||||||
|  | /* PRSC_CLK_CFG value */ | ||||||
|  | /*
 | ||||||
|  |  * Fout = Fin / (2^(N+1) * (M + 1)) | ||||||
|  |  */ | ||||||
|  | #define MISC_PRSC_N_1			0x00001000 | ||||||
|  | #define MISC_PRSC_M_9			0x00000009 | ||||||
|  | #define MISC_PRSC_N_4			0x00004000 | ||||||
|  | #define MISC_PRSC_M_399			0x0000018F | ||||||
|  | #define MISC_PRSC_N_6			0x00006000 | ||||||
|  | #define MISC_PRSC_M_2593		0x00000A21 | ||||||
|  | #define MISC_PRSC_M_124			0x0000007C | ||||||
|  | #define MISC_PRSC_CFG			(MISC_PRSC_N_1 | MISC_PRSC_M_9) | ||||||
|  | 
 | ||||||
|  | /* PERIPH1_CLKEN, PERIPH1_RST value */ | ||||||
|  | #define MISC_USBDENB			0x01000000 | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | @ -0,0 +1,57 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __SPR_NAND_H__ | ||||||
|  | #define __SPR_NAND_H__ | ||||||
|  | 
 | ||||||
|  | struct fsmc_regs { | ||||||
|  | 	u32 reserved_1[0x10]; | ||||||
|  | 	u32 genmemctrl_pc; | ||||||
|  | 	u32 reserved_2; | ||||||
|  | 	u32 genmemctrl_comm; | ||||||
|  | 	u32 genmemctrl_attrib; | ||||||
|  | 	u32 reserved_3; | ||||||
|  | 	u32 genmemctrl_ecc; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* genmemctrl_pc register definitions */ | ||||||
|  | #define FSMC_RESET		(1 << 0) | ||||||
|  | #define FSMC_WAITON		(1 << 1) | ||||||
|  | #define FSMC_ENABLE		(1 << 2) | ||||||
|  | #define FSMC_DEVTYPE_NAND	(1 << 3) | ||||||
|  | #define FSMC_DEVWID_8		(0 << 4) | ||||||
|  | #define FSMC_DEVWID_16		(1 << 4) | ||||||
|  | #define FSMC_ECCEN		(1 << 6) | ||||||
|  | #define FSMC_ECCPLEN_512	(0 << 7) | ||||||
|  | #define FSMC_ECCPLEN_256	(1 << 7) | ||||||
|  | #define FSMC_TCLR_1		(1 << 9) | ||||||
|  | #define FSMC_TAR_1		(1 << 13) | ||||||
|  | 
 | ||||||
|  | /* genmemctrl_comm register definitions */ | ||||||
|  | #define FSMC_TSET_0		(0 << 0) | ||||||
|  | #define FSMC_TWAIT_6		(6 << 8) | ||||||
|  | #define FSMC_THOLD_4		(4 << 16) | ||||||
|  | #define FSMC_THIZ_1		(1 << 24) | ||||||
|  | 
 | ||||||
|  | extern int spear_nand_init(struct nand_chip *nand); | ||||||
|  | #endif | ||||||
|  | @ -0,0 +1,115 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef SPR_SMI_H | ||||||
|  | #define SPR_SMI_H | ||||||
|  | 
 | ||||||
|  | /* 0xF800.0000 . 0xFBFF.FFFF	64MB	SMI (Serial Flash Mem) */ | ||||||
|  | /* 0xFC00.0000 . 0xFC1F.FFFF	2MB	SMI (Serial Flash Reg.) */ | ||||||
|  | 
 | ||||||
|  | #define FLASH_START_ADDRESS	CONFIG_SYS_FLASH_BASE | ||||||
|  | #define FLASH_BANK_SIZE		CONFIG_SYS_FLASH_BANK_SIZE | ||||||
|  | 
 | ||||||
|  | #define SMIBANK0_BASE		(FLASH_START_ADDRESS) | ||||||
|  | #define SMIBANK1_BASE		(SMIBANK0_BASE + FLASH_BANK_SIZE) | ||||||
|  | #define SMIBANK2_BASE		(SMIBANK1_BASE + FLASH_BANK_SIZE) | ||||||
|  | #define SMIBANK3_BASE		(SMIBANK2_BASE + FLASH_BANK_SIZE) | ||||||
|  | 
 | ||||||
|  | #define BANK0			0 | ||||||
|  | #define BANK1			1 | ||||||
|  | #define BANK2			2 | ||||||
|  | #define BANK3			3 | ||||||
|  | 
 | ||||||
|  | struct smi_regs { | ||||||
|  | 	u32 smi_cr1; | ||||||
|  | 	u32 smi_cr2; | ||||||
|  | 	u32 smi_sr; | ||||||
|  | 	u32 smi_tr; | ||||||
|  | 	u32 smi_rr; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* CONTROL REG 1 */ | ||||||
|  | #define BANK_EN			0x0000000F	/* enables all banks */ | ||||||
|  | #define DSEL_TIME		0x00000060	/* Deselect time */ | ||||||
|  | #define PRESCAL5		0x00000500	/* AHB_CK prescaling value */ | ||||||
|  | #define PRESCALA		0x00000A00	/* AHB_CK prescaling value */ | ||||||
|  | #define PRESCAL3		0x00000300	/* AHB_CK prescaling value */ | ||||||
|  | #define PRESCAL4		0x00000400	/* AHB_CK prescaling value */ | ||||||
|  | #define SW_MODE			0x10000000	/* enables SW Mode */ | ||||||
|  | #define WB_MODE			0x20000000	/* Write Burst Mode */ | ||||||
|  | #define FAST_MODE		0x00008000	/* Fast Mode */ | ||||||
|  | #define HOLD1			0x00010000 | ||||||
|  | 
 | ||||||
|  | /* CONTROL REG 2 */ | ||||||
|  | #define RD_STATUS_REG		0x00000400	/* reads status reg */ | ||||||
|  | #define WE			0x00000800	/* Write Enable */ | ||||||
|  | #define BANK0_SEL		0x00000000	/* Select Banck0 */ | ||||||
|  | #define BANK1_SEL		0x00001000	/* Select Banck1 */ | ||||||
|  | #define BANK2_SEL		0x00002000	/* Select Banck2 */ | ||||||
|  | #define BANK3_SEL		0x00003000	/* Select Banck3 */ | ||||||
|  | #define BANKSEL_SHIFT		12 | ||||||
|  | #define SEND			0x00000080	/* Send data */ | ||||||
|  | #define TX_LEN_1		0x00000001	/* data length = 1 byte */ | ||||||
|  | #define TX_LEN_2		0x00000002	/* data length = 2 byte */ | ||||||
|  | #define TX_LEN_3		0x00000003	/* data length = 3 byte */ | ||||||
|  | #define TX_LEN_4		0x00000004	/* data length = 4 byte */ | ||||||
|  | #define RX_LEN_1		0x00000010	/* data length = 1 byte */ | ||||||
|  | #define RX_LEN_2		0x00000020	/* data length = 2 byte */ | ||||||
|  | #define RX_LEN_3		0x00000030	/* data length = 3 byte */ | ||||||
|  | #define RX_LEN_4		0x00000040	/* data length = 4 byte */ | ||||||
|  | #define TFIE			0x00000100	/* Tx Flag Interrupt Enable */ | ||||||
|  | #define WCIE			0x00000200	/* WCF Interrupt Enable */ | ||||||
|  | 
 | ||||||
|  | /* STATUS_REG */ | ||||||
|  | #define INT_WCF_CLR		0xFFFFFDFF	/* clear: WCF clear */ | ||||||
|  | #define INT_TFF_CLR		0xFFFFFEFF	/* clear: TFF clear */ | ||||||
|  | #define WIP_BIT			0x00000001	/* WIP Bit of SPI SR */ | ||||||
|  | #define WEL_BIT			0x00000002	/* WEL Bit of SPI SR */ | ||||||
|  | #define RSR			0x00000005	/* Read Status regiser */ | ||||||
|  | #define TFF			0x00000100	/* Transfer Finished FLag */ | ||||||
|  | #define WCF			0x00000200	/* Transfer Finished FLag */ | ||||||
|  | #define ERF1			0x00000400	/* Error Flag 1 */ | ||||||
|  | #define ERF2			0x00000800	/* Error Flag 2 */ | ||||||
|  | #define WM0			0x00001000	/* WM Bank 0 */ | ||||||
|  | #define WM1			0x00002000	/* WM Bank 1 */ | ||||||
|  | #define WM2			0x00004000	/* WM Bank 2 */ | ||||||
|  | #define WM3			0x00008000	/* WM Bank 3 */ | ||||||
|  | #define WM_SHIFT		12 | ||||||
|  | 
 | ||||||
|  | /* TR REG */ | ||||||
|  | #define READ_ID			0x0000009F	/* Read Identification */ | ||||||
|  | #define BULK_ERASE		0x000000C7	/* BULK erase */ | ||||||
|  | #define SECTOR_ERASE		0x000000D8	/* SECTOR erase */ | ||||||
|  | #define WRITE_ENABLE		0x00000006	/* Wenable command to FLASH */ | ||||||
|  | 
 | ||||||
|  | struct flash_dev { | ||||||
|  | 	u32 density; | ||||||
|  | 	ulong size; | ||||||
|  | 	ushort sector_count; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #define SFLASH_PAGE_SIZE	0x100	/* flash page size */ | ||||||
|  | #define XFER_FINISH_TOUT	2	/* xfer finish timeout */ | ||||||
|  | #define WMODE_TOUT		2	/* write enable timeout */ | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | @ -0,0 +1,38 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Ryan CHEN, ST Micoelectronics, ryan.chen@st.com | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | struct syscntl_regs { | ||||||
|  | 	u32 scctrl; | ||||||
|  | 	u32 scsysstat; | ||||||
|  | 	u32 scimctrl; | ||||||
|  | 	u32 scimsysstat; | ||||||
|  | 	u32 scxtalctrl; | ||||||
|  | 	u32 scpllctrl; | ||||||
|  | 	u32 scpllfctrl; | ||||||
|  | 	u32 scperctrl0; | ||||||
|  | 	u32 scperctrl1; | ||||||
|  | 	u32 scperen; | ||||||
|  | 	u32 scperdis; | ||||||
|  | 	const u32 scperclken; | ||||||
|  | 	const u32 scperstat; | ||||||
|  | }; | ||||||
|  | @ -0,0 +1,67 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _SPR_XLOADER_TABLE_H | ||||||
|  | #define _SPR_XLOADER_TABLE_H | ||||||
|  | 
 | ||||||
|  | #define XLOADER_TABLE_VERSION_1_1	2 | ||||||
|  | #define XLOADER_TABLE_VERSION_1_2	3 | ||||||
|  | 
 | ||||||
|  | #define XLOADER_TABLE_ADDRESS		0xD2801FF0 | ||||||
|  | 
 | ||||||
|  | #define DDRMOBILE	1 | ||||||
|  | #define DDR2		2 | ||||||
|  | 
 | ||||||
|  | #define REV_BA		1 | ||||||
|  | #define REV_AA		2 | ||||||
|  | #define REV_AB		3 | ||||||
|  | 
 | ||||||
|  | struct xloader_table_1_1 { | ||||||
|  | 	unsigned short ddrfreq; | ||||||
|  | 	unsigned char ddrsize; | ||||||
|  | 	unsigned char ddrtype; | ||||||
|  | 
 | ||||||
|  | 	unsigned char soc_rev; | ||||||
|  | } __attribute__ ((packed)); | ||||||
|  | 
 | ||||||
|  | struct xloader_table_1_2 { | ||||||
|  | 	unsigned const char *version; | ||||||
|  | 
 | ||||||
|  | 	unsigned short ddrfreq; | ||||||
|  | 	unsigned char ddrsize; | ||||||
|  | 	unsigned char ddrtype; | ||||||
|  | 
 | ||||||
|  | 	unsigned char soc_rev; | ||||||
|  | } __attribute__ ((packed)); | ||||||
|  | 
 | ||||||
|  | union table_contents { | ||||||
|  | 	struct xloader_table_1_1 table_1_1; | ||||||
|  | 	struct xloader_table_1_2 table_1_2; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct xloader_table { | ||||||
|  | 	unsigned char table_version; | ||||||
|  | 	union table_contents table; | ||||||
|  | } __attribute__ ((packed)); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | @ -2594,6 +2594,33 @@ extern unsigned int __machine_arch_type; | ||||||
| #define MACH_TYPE_ELTD100              2611 | #define MACH_TYPE_ELTD100              2611 | ||||||
| #define MACH_TYPE_CAPC7117             2612 | #define MACH_TYPE_CAPC7117             2612 | ||||||
| #define MACH_TYPE_SWAN                 2613 | #define MACH_TYPE_SWAN                 2613 | ||||||
|  | #define MACH_TYPE_VEU                  2614 | ||||||
|  | #define MACH_TYPE_RM2                  2615 | ||||||
|  | #define MACH_TYPE_TT2100               2616 | ||||||
|  | #define MACH_TYPE_VENICE               2617 | ||||||
|  | #define MACH_TYPE_PC7323               2618 | ||||||
|  | #define MACH_TYPE_MASP                 2619 | ||||||
|  | #define MACH_TYPE_FUJITSU_TVSTBSOC     2620 | ||||||
|  | #define MACH_TYPE_FUJITSU_TVSTBSOC1    2621 | ||||||
|  | #define MACH_TYPE_LEXIKON              2622 | ||||||
|  | #define MACH_TYPE_MINI2440V2           2623 | ||||||
|  | #define MACH_TYPE_ICONTROL             2624 | ||||||
|  | #define MACH_TYPE_SHEEVAD              2625 | ||||||
|  | #define MACH_TYPE_QSD8X50A_ST1_1       2626 | ||||||
|  | #define MACH_TYPE_QSD8X50A_ST1_5       2627 | ||||||
|  | #define MACH_TYPE_BEE                  2628 | ||||||
|  | #define MACH_TYPE_MX23EVK              2629 | ||||||
|  | #define MACH_TYPE_AP4EVB               2630 | ||||||
|  | #define MACH_TYPE_STOCKHOLM            2631 | ||||||
|  | #define MACH_TYPE_LPC_H3131            2632 | ||||||
|  | #define MACH_TYPE_STINGRAY             2633 | ||||||
|  | #define MACH_TYPE_KRAKEN               2634 | ||||||
|  | #define MACH_TYPE_GW2388               2635 | ||||||
|  | #define MACH_TYPE_JADECPU              2636 | ||||||
|  | #define MACH_TYPE_CARLISLE             2637 | ||||||
|  | #define MACH_TYPE_LUX_SFT9             2638 | ||||||
|  | #define MACH_TYPE_NEMID_TB             2639 | ||||||
|  | #define MACH_TYPE_TERRIER              2640 | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_ARCH_EBSA110 | #ifdef CONFIG_ARCH_EBSA110 | ||||||
| # ifdef machine_arch_type | # ifdef machine_arch_type | ||||||
|  | @ -33579,6 +33606,330 @@ extern unsigned int __machine_arch_type; | ||||||
| # define machine_is_swan()	(0) | # define machine_is_swan()	(0) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_MACH_VEU | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_VEU | ||||||
|  | # endif | ||||||
|  | # define machine_is_veu()	(machine_arch_type == MACH_TYPE_VEU) | ||||||
|  | #else | ||||||
|  | # define machine_is_veu()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_RM2 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_RM2 | ||||||
|  | # endif | ||||||
|  | # define machine_is_rm2()	(machine_arch_type == MACH_TYPE_RM2) | ||||||
|  | #else | ||||||
|  | # define machine_is_rm2()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_TT2100 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_TT2100 | ||||||
|  | # endif | ||||||
|  | # define machine_is_tt2100()	(machine_arch_type == MACH_TYPE_TT2100) | ||||||
|  | #else | ||||||
|  | # define machine_is_tt2100()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_VENICE | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_VENICE | ||||||
|  | # endif | ||||||
|  | # define machine_is_venice()	(machine_arch_type == MACH_TYPE_VENICE) | ||||||
|  | #else | ||||||
|  | # define machine_is_venice()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_PC7323 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_PC7323 | ||||||
|  | # endif | ||||||
|  | # define machine_is_pc7323()	(machine_arch_type == MACH_TYPE_PC7323) | ||||||
|  | #else | ||||||
|  | # define machine_is_pc7323()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_MASP | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_MASP | ||||||
|  | # endif | ||||||
|  | # define machine_is_masp()	(machine_arch_type == MACH_TYPE_MASP) | ||||||
|  | #else | ||||||
|  | # define machine_is_masp()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_FUJITSU_TVSTBSOC | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_FUJITSU_TVSTBSOC | ||||||
|  | # endif | ||||||
|  | # define machine_is_fujitsu_tvstbsoc0()	(machine_arch_type == MACH_TYPE_FUJITSU_TVSTBSOC) | ||||||
|  | #else | ||||||
|  | # define machine_is_fujitsu_tvstbsoc0()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_FUJITSU_TVSTBSOC1 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_FUJITSU_TVSTBSOC1 | ||||||
|  | # endif | ||||||
|  | # define machine_is_fujitsu_tvstbsoc1()	(machine_arch_type == MACH_TYPE_FUJITSU_TVSTBSOC1) | ||||||
|  | #else | ||||||
|  | # define machine_is_fujitsu_tvstbsoc1()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_LEXIKON | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_LEXIKON | ||||||
|  | # endif | ||||||
|  | # define machine_is_lexikon()	(machine_arch_type == MACH_TYPE_LEXIKON) | ||||||
|  | #else | ||||||
|  | # define machine_is_lexikon()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_MINI2440V2 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_MINI2440V2 | ||||||
|  | # endif | ||||||
|  | # define machine_is_mini2440v2()	(machine_arch_type == MACH_TYPE_MINI2440V2) | ||||||
|  | #else | ||||||
|  | # define machine_is_mini2440v2()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_ICONTROL | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_ICONTROL | ||||||
|  | # endif | ||||||
|  | # define machine_is_icontrol()	(machine_arch_type == MACH_TYPE_ICONTROL) | ||||||
|  | #else | ||||||
|  | # define machine_is_icontrol()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_SHEEVAD | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_SHEEVAD | ||||||
|  | # endif | ||||||
|  | # define machine_is_sheevad()	(machine_arch_type == MACH_TYPE_SHEEVAD) | ||||||
|  | #else | ||||||
|  | # define machine_is_sheevad()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_QSD8X50A_ST1_1 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_QSD8X50A_ST1_1 | ||||||
|  | # endif | ||||||
|  | # define machine_is_qsd8x50a_st1_1()	(machine_arch_type == MACH_TYPE_QSD8X50A_ST1_1) | ||||||
|  | #else | ||||||
|  | # define machine_is_qsd8x50a_st1_1()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_QSD8X50A_ST1_5 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_QSD8X50A_ST1_5 | ||||||
|  | # endif | ||||||
|  | # define machine_is_qsd8x50a_st1_5()	(machine_arch_type == MACH_TYPE_QSD8X50A_ST1_5) | ||||||
|  | #else | ||||||
|  | # define machine_is_qsd8x50a_st1_5()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_BEE | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_BEE | ||||||
|  | # endif | ||||||
|  | # define machine_is_bee()	(machine_arch_type == MACH_TYPE_BEE) | ||||||
|  | #else | ||||||
|  | # define machine_is_bee()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_MX23EVK | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_MX23EVK | ||||||
|  | # endif | ||||||
|  | # define machine_is_mx23evk()	(machine_arch_type == MACH_TYPE_MX23EVK) | ||||||
|  | #else | ||||||
|  | # define machine_is_mx23evk()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_AP4EVB | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_AP4EVB | ||||||
|  | # endif | ||||||
|  | # define machine_is_ap4evb()	(machine_arch_type == MACH_TYPE_AP4EVB) | ||||||
|  | #else | ||||||
|  | # define machine_is_ap4evb()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_STOCKHOLM | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_STOCKHOLM | ||||||
|  | # endif | ||||||
|  | # define machine_is_stockholm()	(machine_arch_type == MACH_TYPE_STOCKHOLM) | ||||||
|  | #else | ||||||
|  | # define machine_is_stockholm()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_LPC_H3131 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_LPC_H3131 | ||||||
|  | # endif | ||||||
|  | # define machine_is_lpc_h3131()	(machine_arch_type == MACH_TYPE_LPC_H3131) | ||||||
|  | #else | ||||||
|  | # define machine_is_lpc_h3131()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_STINGRAY | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_STINGRAY | ||||||
|  | # endif | ||||||
|  | # define machine_is_stingray()	(machine_arch_type == MACH_TYPE_STINGRAY) | ||||||
|  | #else | ||||||
|  | # define machine_is_stingray()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_KRAKEN | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_KRAKEN | ||||||
|  | # endif | ||||||
|  | # define machine_is_kraken()	(machine_arch_type == MACH_TYPE_KRAKEN) | ||||||
|  | #else | ||||||
|  | # define machine_is_kraken()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_GW2388 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_GW2388 | ||||||
|  | # endif | ||||||
|  | # define machine_is_gw2388()	(machine_arch_type == MACH_TYPE_GW2388) | ||||||
|  | #else | ||||||
|  | # define machine_is_gw2388()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_JADECPU | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_JADECPU | ||||||
|  | # endif | ||||||
|  | # define machine_is_jadecpu()	(machine_arch_type == MACH_TYPE_JADECPU) | ||||||
|  | #else | ||||||
|  | # define machine_is_jadecpu()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_CARLISLE | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_CARLISLE | ||||||
|  | # endif | ||||||
|  | # define machine_is_carlisle()	(machine_arch_type == MACH_TYPE_CARLISLE) | ||||||
|  | #else | ||||||
|  | # define machine_is_carlisle()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_LUX_SFT9 | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_LUX_SFT9 | ||||||
|  | # endif | ||||||
|  | # define machine_is_lux_sft9()	(machine_arch_type == MACH_TYPE_LUX_SFT9) | ||||||
|  | #else | ||||||
|  | # define machine_is_lux_sft9()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_NEMID_TB | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_NEMID_TB | ||||||
|  | # endif | ||||||
|  | # define machine_is_nemid_tb()	(machine_arch_type == MACH_TYPE_NEMID_TB) | ||||||
|  | #else | ||||||
|  | # define machine_is_nemid_tb()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_MACH_TERRIER | ||||||
|  | # ifdef machine_arch_type | ||||||
|  | #  undef machine_arch_type | ||||||
|  | #  define machine_arch_type	__machine_arch_type | ||||||
|  | # else | ||||||
|  | #  define machine_arch_type	MACH_TYPE_TERRIER | ||||||
|  | # endif | ||||||
|  | # define machine_is_terrier()	(machine_arch_type == MACH_TYPE_TERRIER) | ||||||
|  | #else | ||||||
|  | # define machine_is_terrier()	(0) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * These have not yet been registered |  * These have not yet been registered | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | @ -48,6 +48,7 @@ | ||||||
| 
 | 
 | ||||||
| #define CONFIG_SKIP_LOWLEVEL_INIT | #define CONFIG_SKIP_LOWLEVEL_INIT | ||||||
| #define CONFIG_SKIP_RELOCATE_UBOOT | #define CONFIG_SKIP_RELOCATE_UBOOT | ||||||
|  | #define CONFIG_MISC_INIT_R			/* Call misc_init_r */ | ||||||
| 
 | 
 | ||||||
| #define CONFIG_ARCH_CPU_INIT | #define CONFIG_ARCH_CPU_INIT | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -47,8 +47,6 @@ | ||||||
| 
 | 
 | ||||||
| #undef CONFIG_SKIP_RELOCATE_UBOOT | #undef CONFIG_SKIP_RELOCATE_UBOOT | ||||||
| 
 | 
 | ||||||
| #define CONFIG_L2_OFF |  | ||||||
| 
 |  | ||||||
| /* input clock of PLL: SMDKC100 has 12MHz input clock */ | /* input clock of PLL: SMDKC100 has 12MHz input clock */ | ||||||
| #define CONFIG_SYS_CLK_FREQ		12000000 | #define CONFIG_SYS_CLK_FREQ		12000000 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,213 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, STMicroelectronics, <vipin.kumar@st.com> | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _SPEAR_COMMON_H | ||||||
|  | #define _SPEAR_COMMON_H | ||||||
|  | /*
 | ||||||
|  |  * Common configurations used for both spear3xx as well as spear6xx | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* USBD driver configuration */ | ||||||
|  | #define CONFIG_SPEARUDC | ||||||
|  | #define CONFIG_USB_DEVICE | ||||||
|  | #define CONFIG_USB_TTY | ||||||
|  | 
 | ||||||
|  | #define CONFIG_USBD_PRODUCT_NAME		"SPEAr SoC" | ||||||
|  | #define CONFIG_USBD_MANUFACTURER		"ST Microelectronics" | ||||||
|  | 
 | ||||||
|  | #define CONFIG_EXTRA_ENV_USBTTY			"usbtty=cdc_acm\0" | ||||||
|  | 
 | ||||||
|  | /* I2C driver configuration */ | ||||||
|  | #define CONFIG_HARD_I2C | ||||||
|  | #define CONFIG_SPEAR_I2C | ||||||
|  | #define CONFIG_SYS_I2C_SPEED			400000 | ||||||
|  | #define CONFIG_SYS_I2C_SLAVE			0x02 | ||||||
|  | 
 | ||||||
|  | #define CONFIG_I2C_CHIPADDRESS			0x50 | ||||||
|  | 
 | ||||||
|  | /* Timer, HZ specific defines */ | ||||||
|  | #define CONFIG_SYS_HZ				(1000) | ||||||
|  | #define CONFIG_SYS_HZ_CLOCK			(8300000) | ||||||
|  | 
 | ||||||
|  | /* Flash configuration */ | ||||||
|  | #if defined(CONFIG_FLASH_PNOR) | ||||||
|  | #define CONFIG_SPEAR_EMI			1 | ||||||
|  | #else | ||||||
|  | #define CONFIG_SPEARSMI				1 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if defined(CONFIG_SPEARSMI) | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_MAX_FLASH_BANKS		2 | ||||||
|  | #define CONFIG_SYS_FLASH_BASE			(0xF8000000) | ||||||
|  | #define CONFIG_SYS_CS1_FLASH_BASE		(0xF9000000) | ||||||
|  | #define CONFIG_SYS_FLASH_BANK_SIZE		(0x01000000) | ||||||
|  | #define CONFIG_SYS_FLASH_ADDR_BASE		{CONFIG_SYS_FLASH_BASE, \ | ||||||
|  | 						CONFIG_SYS_CS1_FLASH_BASE} | ||||||
|  | #define CONFIG_SYS_MAX_FLASH_SECT		128 | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_FLASH_EMPTY_INFO		1 | ||||||
|  | #define CONFIG_SYS_FLASH_ERASE_TOUT		(3 * CONFIG_SYS_HZ) | ||||||
|  | #define CONFIG_SYS_FLASH_WRITE_TOUT		(3 * CONFIG_SYS_HZ) | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Serial Configuration (PL011) | ||||||
|  |  * CONFIG_PL01x_PORTS is defined in specific files | ||||||
|  |  */ | ||||||
|  | #define CONFIG_PL011_SERIAL | ||||||
|  | #define CONFIG_PL011_CLOCK			(48 * 1000 * 1000) | ||||||
|  | #define CONFIG_CONS_INDEX			0 | ||||||
|  | #define CONFIG_BAUDRATE				115200 | ||||||
|  | #define CONFIG_SYS_BAUDRATE_TABLE		{ 9600, 19200, 38400, \ | ||||||
|  | 						57600, 115200 } | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_LOADS_BAUD_CHANGE | ||||||
|  | 
 | ||||||
|  | /* NAND FLASH Configuration */ | ||||||
|  | #define CONFIG_NAND_SPEAR			1 | ||||||
|  | #define CONFIG_SYS_MAX_NAND_DEVICE		1 | ||||||
|  | #define CONFIG_MTD_NAND_VERIFY_WRITE		1 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Command support defines | ||||||
|  |  */ | ||||||
|  | #define CONFIG_CMD_I2C | ||||||
|  | #define CONFIG_CMD_NAND | ||||||
|  | #define CONFIG_CMD_ENV | ||||||
|  | #define CONFIG_CMD_MEMORY | ||||||
|  | #define CONFIG_CMD_RUN | ||||||
|  | #define CONFIG_CMD_SAVES | ||||||
|  | 
 | ||||||
|  | /* This must be included AFTER the definition of CONFIG_COMMANDS (if any) */ | ||||||
|  | #include <config_cmd_default.h> | ||||||
|  | #undef CONFIG_CMD_NET | ||||||
|  | #undef CONFIG_CMD_NFS | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Default Environment Varible definitions | ||||||
|  |  */ | ||||||
|  | #if defined(CONFIG_SPEAR_USBTTY) | ||||||
|  | #define CONFIG_BOOTDELAY			-1 | ||||||
|  | #else | ||||||
|  | #define CONFIG_BOOTDELAY			1 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define CONFIG_ENV_OVERWRITE | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * U-Boot Environment placing definitions. | ||||||
|  |  */ | ||||||
|  | #if defined(CONFIG_ENV_IS_IN_FLASH) | ||||||
|  | #ifdef CONFIG_SPEARSMI | ||||||
|  | /*
 | ||||||
|  |  * Environment is in serial NOR flash | ||||||
|  |  */ | ||||||
|  | #define CONFIG_SYS_MONITOR_LEN			0x00040000 | ||||||
|  | #define CONFIG_ENV_SECT_SIZE			0x00010000 | ||||||
|  | #define CONFIG_FSMTDBLK				"/dev/mtdblock8 " | ||||||
|  | 
 | ||||||
|  | #define CONFIG_BOOTCOMMAND			"bootm 0xf8050000" | ||||||
|  | 
 | ||||||
|  | #elif defined(CONFIG_SPEAR_EMI) | ||||||
|  | /*
 | ||||||
|  |  * Environment is in parallel NOR flash | ||||||
|  |  */ | ||||||
|  | #define CONFIG_SYS_MONITOR_LEN			0x00060000 | ||||||
|  | #define CONFIG_ENV_SECT_SIZE			0x00020000 | ||||||
|  | #define CONFIG_FSMTDBLK				"/dev/mtdblock3 " | ||||||
|  | 
 | ||||||
|  | #define CONFIG_BOOTCOMMAND			"cp.b 0x50080000 0x1600000 " \ | ||||||
|  | 						"0x4C0000; bootm 0x1600000" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_MONITOR_BASE			CONFIG_SYS_FLASH_BASE | ||||||
|  | #define CONFIG_ENV_ADDR				(CONFIG_SYS_MONITOR_BASE + \ | ||||||
|  | 						CONFIG_SYS_MONITOR_LEN) | ||||||
|  | #elif defined(CONFIG_ENV_IS_IN_NAND) | ||||||
|  | /*
 | ||||||
|  |  * Environment is in NAND | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define CONFIG_ENV_OFFSET			0x60000 | ||||||
|  | #define CONFIG_ENV_RANGE			0x10000 | ||||||
|  | #define CONFIG_FSMTDBLK				"/dev/mtdblock12 " | ||||||
|  | 
 | ||||||
|  | #define CONFIG_BOOTCOMMAND			"nand read.jffs2 0x1600000 " \ | ||||||
|  | 						"0x80000 0x4C0000; " \ | ||||||
|  | 						"bootm 0x1600000" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define CONFIG_BOOTARGS_NFS			"root=/dev/nfs ip=dhcp " \ | ||||||
|  | 						"console=ttyS0 init=/bin/sh" | ||||||
|  | #define CONFIG_BOOTARGS				"console=ttyS0 mem=128M "  \ | ||||||
|  | 						"root="CONFIG_FSMTDBLK \ | ||||||
|  | 						"rootfstype=jffs2" | ||||||
|  | 
 | ||||||
|  | #define CONFIG_ENV_SIZE				0x02000 | ||||||
|  | 
 | ||||||
|  | /* Miscellaneous configurable options */ | ||||||
|  | #define CONFIG_BOOT_PARAMS_ADDR			0x00000100 | ||||||
|  | #define CONFIG_CMDLINE_TAG			1 | ||||||
|  | #define CONFIG_SETUP_MEMORY_TAGS		1 | ||||||
|  | #define CONFIG_MISC_INIT_R			1 | ||||||
|  | #define CONFIG_ZERO_BOOTDELAY_CHECK		1 | ||||||
|  | #define CONFIG_AUTOBOOT_KEYED			1 | ||||||
|  | #define CONFIG_AUTOBOOT_STOP_STR		" " | ||||||
|  | #define CONFIG_AUTOBOOT_PROMPT			\ | ||||||
|  | 		"Hit SPACE in %d seconds to stop autoboot.\n", bootdelay | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_MEMTEST_START		0x00800000 | ||||||
|  | #define CONFIG_SYS_MEMTEST_END			0x04000000 | ||||||
|  | #define CONFIG_SYS_MALLOC_LEN			(1024*1024) | ||||||
|  | #define CONFIG_SYS_GBL_DATA_SIZE		128 | ||||||
|  | #define CONFIG_IDENT_STRING			"-SPEAr" | ||||||
|  | #define CONFIG_SYS_LONGHELP | ||||||
|  | #define CONFIG_SYS_PROMPT			"u-boot> " | ||||||
|  | #define CONFIG_CMDLINE_EDITING | ||||||
|  | #define CONFIG_SYS_CBSIZE			256 | ||||||
|  | #define CONFIG_SYS_PBSIZE			(CONFIG_SYS_CBSIZE + \ | ||||||
|  | 						sizeof(CONFIG_SYS_PROMPT) + 16) | ||||||
|  | #define CONFIG_SYS_MAXARGS			16 | ||||||
|  | #define CONFIG_SYS_BARGSIZE			CONFIG_SYS_CBSIZE | ||||||
|  | #define CONFIG_SYS_LOAD_ADDR			0x00800000 | ||||||
|  | #define CONFIG_SYS_CONSOLE_INFO_QUIET		1 | ||||||
|  | #define CONFIG_SYS_64BIT_VSPRINTF		1 | ||||||
|  | 
 | ||||||
|  | #define CONFIG_EXTRA_ENV_SETTINGS		CONFIG_EXTRA_ENV_USBTTY | ||||||
|  | 
 | ||||||
|  | /* Stack sizes */ | ||||||
|  | #define CONFIG_STACKSIZE			(128*1024) | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_USE_IRQ | ||||||
|  | #define CONFIG_STACKSIZE_IRQ			(4*1024) | ||||||
|  | #define CONFIG_STACKSIZE_FIQ			(4*1024) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* Physical Memory Map */ | ||||||
|  | #define CONFIG_NR_DRAM_BANKS			1 | ||||||
|  | #define PHYS_SDRAM_1				0x00000000 | ||||||
|  | #define PHYS_SDRAM_1_MAXSIZE			0x40000000 | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | @ -0,0 +1,131 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, STMicroelectronics, <vipin.kumar@st.com> | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __CONFIG_H | ||||||
|  | #define __CONFIG_H | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * High Level Configuration Options | ||||||
|  |  * (easy to change) | ||||||
|  |  */ | ||||||
|  | #if defined(CONFIG_MK_spear300) | ||||||
|  | #define CONFIG_SPEAR3XX				1 | ||||||
|  | #define CONFIG_SPEAR300				1 | ||||||
|  | #elif defined(CONFIG_MK_spear310) | ||||||
|  | #define CONFIG_SPEAR3XX				1 | ||||||
|  | #define CONFIG_SPEAR310				1 | ||||||
|  | #elif defined(CONFIG_MK_spear320) | ||||||
|  | #define CONFIG_SPEAR3XX				1 | ||||||
|  | #define CONFIG_SPEAR320				1 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include <configs/spear-common.h> | ||||||
|  | 
 | ||||||
|  | /* Serial Configuration (PL011) */ | ||||||
|  | #define CONFIG_SYS_SERIAL0			0xD0000000 | ||||||
|  | 
 | ||||||
|  | #if defined(CONFIG_SPEAR300) | ||||||
|  | #define CONFIG_PL01x_PORTS			{(void *)CONFIG_SYS_SERIAL0} | ||||||
|  | 
 | ||||||
|  | #elif defined(CONFIG_SPEAR310) | ||||||
|  | 
 | ||||||
|  | #if (CONFIG_CONS_INDEX) | ||||||
|  | #undef  CONFIG_PL011_CLOCK | ||||||
|  | #define CONFIG_PL011_CLOCK			(83 * 1000 * 1000) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_SERIAL1			0xB2000000 | ||||||
|  | #define CONFIG_SYS_SERIAL2			0xB2080000 | ||||||
|  | #define CONFIG_SYS_SERIAL3			0xB2100000 | ||||||
|  | #define CONFIG_SYS_SERIAL4			0xB2180000 | ||||||
|  | #define CONFIG_SYS_SERIAL5			0xB2200000 | ||||||
|  | #define CONFIG_PL01x_PORTS			{(void *)CONFIG_SYS_SERIAL0, \ | ||||||
|  | 						(void *)CONFIG_SYS_SERIAL1, \ | ||||||
|  | 						(void *)CONFIG_SYS_SERIAL2, \ | ||||||
|  | 						(void *)CONFIG_SYS_SERIAL3, \ | ||||||
|  | 						(void *)CONFIG_SYS_SERIAL4, \ | ||||||
|  | 						(void *)CONFIG_SYS_SERIAL5 } | ||||||
|  | #elif defined(CONFIG_SPEAR320) | ||||||
|  | 
 | ||||||
|  | #if (CONFIG_CONS_INDEX) | ||||||
|  | #undef  CONFIG_PL011_CLOCK | ||||||
|  | #define CONFIG_PL011_CLOCK			(83 * 1000 * 1000) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_SERIAL1			0xA3000000 | ||||||
|  | #define CONFIG_SYS_SERIAL2			0xA4000000 | ||||||
|  | #define CONFIG_PL01x_PORTS			{(void *)CONFIG_SYS_SERIAL0, \ | ||||||
|  | 						(void *)CONFIG_SYS_SERIAL1, \ | ||||||
|  | 						(void *)CONFIG_SYS_SERIAL2 } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if defined(CONFIG_SPEAR_EMI) | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_FLASH_CFI | ||||||
|  | #define CONFIG_FLASH_CFI_DRIVER | ||||||
|  | 
 | ||||||
|  | #if defined(CONFIG_SPEAR310) | ||||||
|  | #define CONFIG_SYS_FLASH_BASE			0x50000000 | ||||||
|  | #define CONFIG_SYS_CS1_FLASH_BASE		0x60000000 | ||||||
|  | #define CONFIG_SYS_CS2_FLASH_BASE		0x70000000 | ||||||
|  | #define CONFIG_SYS_CS3_FLASH_BASE		0x80000000 | ||||||
|  | #define CONFIG_SYS_CS4_FLASH_BASE		0x90000000 | ||||||
|  | #define CONFIG_SYS_CS5_FLASH_BASE		0xA0000000 | ||||||
|  | #define CONFIG_SYS_FLASH_BANKS_LIST		{ CONFIG_SYS_FLASH_BASE,   \ | ||||||
|  | 						CONFIG_SYS_CS1_FLASH_BASE, \ | ||||||
|  | 						CONFIG_SYS_CS2_FLASH_BASE, \ | ||||||
|  | 						CONFIG_SYS_CS3_FLASH_BASE, \ | ||||||
|  | 						CONFIG_SYS_CS4_FLASH_BASE, \ | ||||||
|  | 						CONFIG_SYS_CS5_FLASH_BASE } | ||||||
|  | #define CONFIG_SYS_MAX_FLASH_BANKS		6 | ||||||
|  | 
 | ||||||
|  | #elif defined(CONFIG_SPEAR320) | ||||||
|  | #define CONFIG_SYS_FLASH_BASE			0x44000000 | ||||||
|  | #define CONFIG_SYS_CS1_FLASH_BASE		0x45000000 | ||||||
|  | #define CONFIG_SYS_CS2_FLASH_BASE		0x46000000 | ||||||
|  | #define CONFIG_SYS_CS3_FLASH_BASE		0x47000000 | ||||||
|  | #define CONFIG_SYS_FLASH_BANKS_LIST		{ CONFIG_SYS_FLASH_BASE,   \ | ||||||
|  | 						CONFIG_SYS_CS1_FLASH_BASE, \ | ||||||
|  | 						CONFIG_SYS_CS2_FLASH_BASE, \ | ||||||
|  | 						CONFIG_SYS_CS3_FLASH_BASE } | ||||||
|  | #define CONFIG_SYS_MAX_FLASH_BANKS		4 | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_MAX_FLASH_SECT		(127 + 8) | ||||||
|  | #define CONFIG_SYS_FLASH_QUIET_TEST		1 | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if defined(CONFIG_SPEAR300) | ||||||
|  | #define CONFIG_SYS_NAND_BASE			(0x80000000) | ||||||
|  | 
 | ||||||
|  | #elif defined(CONFIG_SPEAR310) | ||||||
|  | #define CONFIG_SYS_NAND_BASE			(0x40000000) | ||||||
|  | 
 | ||||||
|  | #elif defined(CONFIG_SPEAR320) | ||||||
|  | #define CONFIG_SYS_NAND_BASE			(0x50000000) | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif  /* __CONFIG_H */ | ||||||
|  | @ -0,0 +1,43 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, STMicroelectronics, <vipin.kumar@st.com> | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __CONFIG_H | ||||||
|  | #define __CONFIG_H | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * High Level Configuration Options | ||||||
|  |  * (easy to change) | ||||||
|  |  */ | ||||||
|  | #define CONFIG_SPEAR600				1 | ||||||
|  | 
 | ||||||
|  | #include <configs/spear-common.h> | ||||||
|  | 
 | ||||||
|  | /* Serial Configuration (PL011) */ | ||||||
|  | #define CONFIG_SYS_SERIAL0			0xD0000000 | ||||||
|  | #define CONFIG_SYS_SERIAL1			0xD0080000 | ||||||
|  | #define CONFIG_PL01x_PORTS			{ (void *)CONFIG_SYS_SERIAL0, \ | ||||||
|  | 						(void *)CONFIG_SYS_SERIAL1 } | ||||||
|  | 
 | ||||||
|  | #define CONFIG_SYS_NAND_BASE			(0xD2000000) | ||||||
|  | 
 | ||||||
|  | #endif  /* __CONFIG_H */ | ||||||
|  | @ -0,0 +1,230 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2009 | ||||||
|  |  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com. | ||||||
|  |  * | ||||||
|  |  * 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 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __SPR_UDC_H | ||||||
|  | #define __SPR_UDC_H | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Defines for  USBD | ||||||
|  |  * | ||||||
|  |  * The udc_ahb controller has three AHB slaves: | ||||||
|  |  * | ||||||
|  |  * 1.  THe UDC registers | ||||||
|  |  * 2.  The plug detect | ||||||
|  |  * 3.  The RX/TX FIFO | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #define MAX_ENDPOINTS		16 | ||||||
|  | 
 | ||||||
|  | struct udc_endp_regs { | ||||||
|  | 	u32 endp_cntl; | ||||||
|  | 	u32 endp_status; | ||||||
|  | 	u32 endp_bsorfn; | ||||||
|  | 	u32 endp_maxpacksize; | ||||||
|  | 	u32 reserved_1; | ||||||
|  | 	u32 endp_desc_point; | ||||||
|  | 	u32 reserved_2; | ||||||
|  | 	u32 write_done; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Endpoint Control Register definitions */ | ||||||
|  | 
 | ||||||
|  | #define  ENDP_CNTL_STALL		0x00000001 | ||||||
|  | #define  ENDP_CNTL_FLUSH		0x00000002 | ||||||
|  | #define  ENDP_CNTL_SNOOP		0x00000004 | ||||||
|  | #define  ENDP_CNTL_POLL			0x00000008 | ||||||
|  | #define  ENDP_CNTL_CONTROL		0x00000000 | ||||||
|  | #define  ENDP_CNTL_ISO			0x00000010 | ||||||
|  | #define  ENDP_CNTL_BULK			0x00000020 | ||||||
|  | #define  ENDP_CNTL_INT			0x00000030 | ||||||
|  | #define  ENDP_CNTL_NAK			0x00000040 | ||||||
|  | #define  ENDP_CNTL_SNAK			0x00000080 | ||||||
|  | #define  ENDP_CNTL_CNAK			0x00000100 | ||||||
|  | #define  ENDP_CNTL_RRDY			0x00000200 | ||||||
|  | 
 | ||||||
|  | /* Endpoint Satus Register definitions */ | ||||||
|  | 
 | ||||||
|  | #define  ENDP_STATUS_PIDMSK		0x0000000f | ||||||
|  | #define  ENDP_STATUS_OUTMSK		0x00000030 | ||||||
|  | #define  ENDP_STATUS_OUT_NONE		0x00000000 | ||||||
|  | #define  ENDP_STATUS_OUT_DATA		0x00000010 | ||||||
|  | #define  ENDP_STATUS_OUT_SETUP		0x00000020 | ||||||
|  | #define  ENDP_STATUS_IN			0x00000040 | ||||||
|  | #define  ENDP_STATUS_BUFFNAV		0x00000080 | ||||||
|  | #define  ENDP_STATUS_FATERR		0x00000100 | ||||||
|  | #define  ENDP_STATUS_HOSTBUSERR		0x00000200 | ||||||
|  | #define  ENDP_STATUS_TDC		0x00000400 | ||||||
|  | #define  ENDP_STATUS_RXPKTMSK		0x003ff800 | ||||||
|  | 
 | ||||||
|  | struct udc_regs { | ||||||
|  | 	struct udc_endp_regs in_regs[MAX_ENDPOINTS]; | ||||||
|  | 	struct udc_endp_regs out_regs[MAX_ENDPOINTS]; | ||||||
|  | 	u32 dev_conf; | ||||||
|  | 	u32 dev_cntl; | ||||||
|  | 	u32 dev_stat; | ||||||
|  | 	u32 dev_int; | ||||||
|  | 	u32 dev_int_mask; | ||||||
|  | 	u32 endp_int; | ||||||
|  | 	u32 endp_int_mask; | ||||||
|  | 	u32 reserved_3[0x39]; | ||||||
|  | 	u32 reserved_4;		/* offset 0x500 */ | ||||||
|  | 	u32 udc_endp_reg[MAX_ENDPOINTS]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Device Configuration Register definitions */ | ||||||
|  | 
 | ||||||
|  | #define  DEV_CONF_HS_SPEED		0x00000000 | ||||||
|  | #define  DEV_CONF_LS_SPEED		0x00000002 | ||||||
|  | #define  DEV_CONF_FS_SPEED		0x00000003 | ||||||
|  | #define  DEV_CONF_REMWAKEUP		0x00000004 | ||||||
|  | #define  DEV_CONF_SELFPOW		0x00000008 | ||||||
|  | #define  DEV_CONF_SYNCFRAME		0x00000010 | ||||||
|  | #define  DEV_CONF_PHYINT_8		0x00000020 | ||||||
|  | #define  DEV_CONF_PHYINT_16		0x00000000 | ||||||
|  | #define  DEV_CONF_UTMI_BIDIR		0x00000040 | ||||||
|  | #define  DEV_CONF_STATUS_STALL		0x00000080 | ||||||
|  | 
 | ||||||
|  | /* Device Control Register definitions */ | ||||||
|  | 
 | ||||||
|  | #define  DEV_CNTL_RESUME		0x00000001 | ||||||
|  | #define  DEV_CNTL_TFFLUSH		0x00000002 | ||||||
|  | #define  DEV_CNTL_RXDMAEN		0x00000004 | ||||||
|  | #define  DEV_CNTL_TXDMAEN		0x00000008 | ||||||
|  | #define  DEV_CNTL_DESCRUPD		0x00000010 | ||||||
|  | #define  DEV_CNTL_BIGEND		0x00000020 | ||||||
|  | #define  DEV_CNTL_BUFFILL		0x00000040 | ||||||
|  | #define  DEV_CNTL_TSHLDEN		0x00000080 | ||||||
|  | #define  DEV_CNTL_BURSTEN		0x00000100 | ||||||
|  | #define  DEV_CNTL_DMAMODE		0x00000200 | ||||||
|  | #define  DEV_CNTL_SOFTDISCONNECT	0x00000400 | ||||||
|  | #define  DEV_CNTL_SCALEDOWN		0x00000800 | ||||||
|  | #define  DEV_CNTL_BURSTLENU		0x00010000 | ||||||
|  | #define  DEV_CNTL_BURSTLENMSK		0x00ff0000 | ||||||
|  | #define  DEV_CNTL_TSHLDLENU		0x01000000 | ||||||
|  | #define  DEV_CNTL_TSHLDLENMSK		0xff000000 | ||||||
|  | 
 | ||||||
|  | /* Device Status Register definitions */ | ||||||
|  | 
 | ||||||
|  | #define  DEV_STAT_CFG			0x0000000f | ||||||
|  | #define  DEV_STAT_INTF			0x000000f0 | ||||||
|  | #define  DEV_STAT_ALT			0x00000f00 | ||||||
|  | #define  DEV_STAT_SUSP			0x00001000 | ||||||
|  | #define  DEV_STAT_ENUM			0x00006000 | ||||||
|  | #define  DEV_STAT_ENUM_SPEED_HS		0x00000000 | ||||||
|  | #define  DEV_STAT_ENUM_SPEED_FS		0x00002000 | ||||||
|  | #define  DEV_STAT_ENUM_SPEED_LS		0x00004000 | ||||||
|  | #define  DEV_STAT_RXFIFO_EMPTY		0x00008000 | ||||||
|  | #define  DEV_STAT_PHY_ERR		0x00010000 | ||||||
|  | #define  DEV_STAT_TS			0xf0000000 | ||||||
|  | 
 | ||||||
|  | /* Device Interrupt Register definitions */ | ||||||
|  | 
 | ||||||
|  | #define  DEV_INT_MSK			0x0000007f | ||||||
|  | #define  DEV_INT_SETCFG			0x00000001 | ||||||
|  | #define  DEV_INT_SETINTF		0x00000002 | ||||||
|  | #define  DEV_INT_INACTIVE		0x00000004 | ||||||
|  | #define  DEV_INT_USBRESET		0x00000008 | ||||||
|  | #define  DEV_INT_SUSPUSB		0x00000010 | ||||||
|  | #define  DEV_INT_SOF			0x00000020 | ||||||
|  | #define  DEV_INT_ENUM			0x00000040 | ||||||
|  | 
 | ||||||
|  | /* Endpoint Interrupt Register definitions */ | ||||||
|  | 
 | ||||||
|  | #define  ENDP0_INT_CTRLIN		0x00000001 | ||||||
|  | #define  ENDP1_INT_BULKIN		0x00000002 | ||||||
|  | #define  ENDP_INT_NONISOIN_MSK		0x0000AAAA | ||||||
|  | #define  ENDP2_INT_BULKIN		0x00000004 | ||||||
|  | #define  ENDP0_INT_CTRLOUT		0x00010000 | ||||||
|  | #define  ENDP1_INT_BULKOUT		0x00020000 | ||||||
|  | #define  ENDP2_INT_BULKOUT		0x00040000 | ||||||
|  | #define  ENDP_INT_NONISOOUT_MSK		0x55540000 | ||||||
|  | 
 | ||||||
|  | /* Endpoint Register definitions */ | ||||||
|  | #define  ENDP_EPDIR_OUT			0x00000000 | ||||||
|  | #define  ENDP_EPDIR_IN			0x00000010 | ||||||
|  | #define  ENDP_EPTYPE_CNTL		0x0 | ||||||
|  | #define  ENDP_EPTYPE_ISO		0x1 | ||||||
|  | #define  ENDP_EPTYPE_BULK		0x2 | ||||||
|  | #define  ENDP_EPTYPE_INT		0x3 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Defines for Plug Detect | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | struct plug_regs { | ||||||
|  | 	u32 plug_state; | ||||||
|  | 	u32 plug_pending; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Plug State Register definitions */ | ||||||
|  | #define  PLUG_STATUS_EN			0x1 | ||||||
|  | #define  PLUG_STATUS_ATTACHED		0x2 | ||||||
|  | #define  PLUG_STATUS_PHY_RESET		0x4 | ||||||
|  | #define  PLUG_STATUS_PHY_MODE		0x8 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Defines for UDC FIFO (Slave Mode) | ||||||
|  |  */ | ||||||
|  | struct udcfifo_regs { | ||||||
|  | 	u32 *fifo_p; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * USBTTY definitions | ||||||
|  |  */ | ||||||
|  | #define  EP0_MAX_PACKET_SIZE		64 | ||||||
|  | #define  UDC_INT_ENDPOINT		1 | ||||||
|  | #define  UDC_INT_PACKET_SIZE		64 | ||||||
|  | #define  UDC_OUT_ENDPOINT		2 | ||||||
|  | #define  UDC_BULK_PACKET_SIZE		64 | ||||||
|  | #define  UDC_IN_ENDPOINT		3 | ||||||
|  | #define  UDC_OUT_PACKET_SIZE		64 | ||||||
|  | #define  UDC_IN_PACKET_SIZE		64 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * UDC endpoint definitions | ||||||
|  |  */ | ||||||
|  | #define  UDC_EP0			0 | ||||||
|  | #define  UDC_EP1			1 | ||||||
|  | #define  UDC_EP2			2 | ||||||
|  | #define  UDC_EP3			3 | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Function declarations | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | void udc_irq(void); | ||||||
|  | 
 | ||||||
|  | void udc_set_nak(int epid); | ||||||
|  | void udc_unset_nak(int epid); | ||||||
|  | int udc_endpoint_write(struct usb_endpoint_instance *endpoint); | ||||||
|  | int udc_init(void); | ||||||
|  | void udc_enable(struct usb_device_instance *device); | ||||||
|  | void udc_disable(void); | ||||||
|  | void udc_connect(void); | ||||||
|  | void udc_disconnect(void); | ||||||
|  | void udc_startup_events(struct usb_device_instance *device); | ||||||
|  | void udc_setup_ep(struct usb_device_instance *device, unsigned int ep, | ||||||
|  | 		  struct usb_endpoint_instance *endpoint); | ||||||
|  | 
 | ||||||
|  | #endif /* __SPR_UDC_H */ | ||||||
		Loading…
	
		Reference in New Issue