diff options
| author | Wolfgang Denk <wd@denx.de> | 2010-01-23 17:42:03 +0100 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2010-01-23 17:42:03 +0100 | 
| commit | a84b655fab2bc021fdafa91d1196cf826474cdd8 (patch) | |
| tree | a4b1b0031a8819119c6156c31b31e9fa9e57219f | |
| parent | 9998b1366e7e42089c3f579b4d1d790d3c295387 (diff) | |
| parent | a3f3897bfda9b4729785bdd328b3b7f30417a67f (diff) | |
| download | olio-uboot-2014.01-a84b655fab2bc021fdafa91d1196cf826474cdd8.tar.xz olio-uboot-2014.01-a84b655fab2bc021fdafa91d1196cf826474cdd8.zip  | |
Merge branch 'master-sync' of git://git.denx.de/u-boot-arm
57 files changed, 5447 insertions, 41 deletions
@@ -574,6 +574,10 @@ LIST_ARM9="			\  	sheevaplug		\  	smdk2400		\  	smdk2410		\ +	spear300		\ +	spear310		\ +	spear320		\ +	spear600		\  	trab			\  	VCMA9			\  	versatile		\ @@ -3036,6 +3036,14 @@ smdk2400_config	:	unconfig  smdk2410_config	:	unconfig  	@$(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_config:		unconfig  	@mkdir -p $(obj)include diff --git a/board/esd/meesc/meesc.c b/board/esd/meesc/meesc.c index efba60df9..a1b66cbc4 100644 --- a/board/esd/meesc/meesc.c +++ b/board/esd/meesc/meesc.c @@ -219,6 +219,32 @@ u32 get_board_rev(void)  }  #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)  {  	/* Peripheral Clock Enable Register */ diff --git a/board/spear/common/Makefile b/board/spear/common/Makefile new file mode 100644 index 000000000..4f8959f52 --- /dev/null +++ b/board/spear/common/Makefile @@ -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 + +######################################################################### diff --git a/board/spear/common/spr_lowlevel_init.S b/board/spear/common/spr_lowlevel_init.S new file mode 100755 index 000000000..6fbe579a6 --- /dev/null +++ b/board/spear/common/spr_lowlevel_init.S @@ -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 diff --git a/board/spear/common/spr_misc.c b/board/spear/common/spr_misc.c new file mode 100755 index 000000000..e35691200 --- /dev/null +++ b/board/spear/common/spr_misc.c @@ -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"); diff --git a/board/spear/spear300/Makefile b/board/spear/spear300/Makefile new file mode 100755 index 000000000..b5168ffe8 --- /dev/null +++ b/board/spear/spear300/Makefile @@ -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 + +######################################################################### diff --git a/board/spear/spear300/config.mk b/board/spear/spear300/config.mk new file mode 100755 index 000000000..35646f219 --- /dev/null +++ b/board/spear/spear300/config.mk @@ -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 diff --git a/board/spear/spear300/spear300.c b/board/spear/spear300/spear300.c new file mode 100755 index 000000000..60ee54470 --- /dev/null +++ b/board/spear/spear300/spear300.c @@ -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; +} diff --git a/board/spear/spear310/Makefile b/board/spear/spear310/Makefile new file mode 100755 index 000000000..e67e941cf --- /dev/null +++ b/board/spear/spear310/Makefile @@ -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 + +######################################################################### diff --git a/board/spear/spear310/config.mk b/board/spear/spear310/config.mk new file mode 100755 index 000000000..cba843620 --- /dev/null +++ b/board/spear/spear310/config.mk @@ -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 diff --git a/board/spear/spear310/spear310.c b/board/spear/spear310/spear310.c new file mode 100755 index 000000000..756aa5639 --- /dev/null +++ b/board/spear/spear310/spear310.c @@ -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; +} diff --git a/board/spear/spear320/Makefile b/board/spear/spear320/Makefile new file mode 100755 index 000000000..1b80586ff --- /dev/null +++ b/board/spear/spear320/Makefile @@ -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 + +######################################################################### diff --git a/board/spear/spear320/config.mk b/board/spear/spear320/config.mk new file mode 100755 index 000000000..cba843620 --- /dev/null +++ b/board/spear/spear320/config.mk @@ -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 diff --git a/board/spear/spear320/spear320.c b/board/spear/spear320/spear320.c new file mode 100755 index 000000000..756aa5639 --- /dev/null +++ b/board/spear/spear320/spear320.c @@ -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; +} diff --git a/board/spear/spear600/Makefile b/board/spear/spear600/Makefile new file mode 100755 index 000000000..1978002fc --- /dev/null +++ b/board/spear/spear600/Makefile @@ -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 + +######################################################################### diff --git a/board/spear/spear600/config.mk b/board/spear/spear600/config.mk new file mode 100755 index 000000000..35646f219 --- /dev/null +++ b/board/spear/spear600/config.mk @@ -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 diff --git a/board/spear/spear600/spear600.c b/board/spear/spear600/spear600.c new file mode 100755 index 000000000..eef9a3771 --- /dev/null +++ b/board/spear/spear600/spear600.c @@ -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; +} diff --git a/cpu/arm926ejs/kirkwood/Makefile b/cpu/arm926ejs/kirkwood/Makefile index d73e2104e..fc2cc0300 100644 --- a/cpu/arm926ejs/kirkwood/Makefile +++ b/cpu/arm926ejs/kirkwood/Makefile @@ -26,8 +26,8 @@ include $(TOPDIR)/config.mk  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	+= timer.o diff --git a/cpu/arm926ejs/spear/Makefile b/cpu/arm926ejs/spear/Makefile new file mode 100755 index 000000000..bf8dfa8c3 --- /dev/null +++ b/cpu/arm926ejs/spear/Makefile @@ -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 + +######################################################################### diff --git a/cpu/arm926ejs/spear/reset.c b/cpu/arm926ejs/spear/reset.c new file mode 100755 index 000000000..73ad86da3 --- /dev/null +++ b/cpu/arm926ejs/spear/reset.c @@ -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) +		; +} diff --git a/cpu/arm926ejs/spear/timer.c b/cpu/arm926ejs/spear/timer.c new file mode 100755 index 000000000..06858b4a1 --- /dev/null +++ b/cpu/arm926ejs/spear/timer.c @@ -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; +} diff --git a/cpu/arm_cortexa8/s5pc1xx/Makefile b/cpu/arm_cortexa8/s5pc1xx/Makefile index e08d9d87b..4f922e686 100644 --- a/cpu/arm_cortexa8/s5pc1xx/Makefile +++ b/cpu/arm_cortexa8/s5pc1xx/Makefile @@ -28,9 +28,9 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(SOC).a -SOBJS	= reset.o +SOBJS	= cache.o +SOBJS	+= reset.o -COBJS	+= cache.o  COBJS	+= clock.o  COBJS	+= cpu_info.o  COBJS	+= timer.o diff --git a/cpu/arm_cortexa8/s5pc1xx/cache.S b/cpu/arm_cortexa8/s5pc1xx/cache.S new file mode 100644 index 000000000..23f527a48 --- /dev/null +++ b/cpu/arm_cortexa8/s5pc1xx/cache.S @@ -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} diff --git a/doc/README.spear b/doc/README.spear new file mode 100644 index 000000000..a8b105244 --- /dev/null +++ b/doc/README.spear @@ -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 diff --git a/drivers/gpio/kw_gpio.c b/drivers/gpio/kw_gpio.c index 1c2883479..56383c287 100644 --- a/drivers/gpio/kw_gpio.c +++ b/drivers/gpio/kw_gpio.c @@ -3,9 +3,23 @@   *   * Marvell Orion SoC GPIO handling.   * - * This file is licensed under the terms of the GNU General Public - * License version 2.  This program is licensed "as is" without any - * warranty of any kind, whether express or implied. + * 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., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA   */  /* diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile index b860e89f8..29bda85db 100644..100755 --- a/drivers/i2c/Makefile +++ b/drivers/i2c/Makefile @@ -37,6 +37,7 @@ COBJS-$(CONFIG_PCA9564_I2C) += pca9564_i2c.o  COBJS-$(CONFIG_DRIVER_S3C24X0_I2C) += s3c24x0_i2c.o  COBJS-$(CONFIG_S3C44B0_I2C) += s3c44b0_i2c.o  COBJS-$(CONFIG_SOFT_I2C) += soft_i2c.o +COBJS-$(CONFIG_SPEAR_I2C) += spr_i2c.o  COBJS-$(CONFIG_TSI108_I2C) += tsi108_i2c.o  COBJS	:= $(COBJS-y) diff --git a/drivers/i2c/kirkwood_i2c.c b/drivers/i2c/kirkwood_i2c.c index 37b7d99bd..a4409be11 100644 --- a/drivers/i2c/kirkwood_i2c.c +++ b/drivers/i2c/kirkwood_i2c.c @@ -5,16 +5,29 @@   *   * Based on:   * Author: Mark A. Greer <mgreer@mvista.com> + * 2005 (c) MontaVista, Software, Inc.   * - * 2005 (c) MontaVista, Software, Inc.  This file is licensed under - * the terms of the GNU General Public License version 2.  This program - * is licensed "as is" without any warranty of any kind, whether express - * or implied. + * 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., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA   *   * ported from Linux to u-boot   * (C) Copyright 2009   * Heiko Schocher, DENX Software Engineering, hs@denx.de. - *   */  #include <common.h>  #include <i2c.h> diff --git a/drivers/i2c/spr_i2c.c b/drivers/i2c/spr_i2c.c new file mode 100755 index 000000000..eabfe843f --- /dev/null +++ b/drivers/i2c/spr_i2c.c @@ -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); +} diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile index 754d648a9..cbf6f156b 100644..100755 --- a/drivers/mtd/Makefile +++ b/drivers/mtd/Makefile @@ -34,6 +34,7 @@ COBJS-$(CONFIG_FLASH_CFI_MTD) += cfi_mtd.o  COBJS-$(CONFIG_HAS_DATAFLASH) += dataflash.o  COBJS-$(CONFIG_FLASH_CFI_LEGACY) += jedec_flash.o  COBJS-$(CONFIG_MW_EEPROM) += mw_eeprom.o +COBJS-$(CONFIG_SPEARSMI) += spr_smi.o  COBJS	:= $(COBJS-y)  SRCS	:= $(COBJS:.o=.c) diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile index 02449eecb..28f27da7a 100644 --- a/drivers/mtd/nand/Makefile +++ b/drivers/mtd/nand/Makefile @@ -47,6 +47,7 @@ COBJS-$(CONFIG_NAND_NDFC) += ndfc.o  COBJS-$(CONFIG_NAND_NOMADIK) += nomadik.o  COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.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_PLAT) += nand_plat.o  endif diff --git a/drivers/mtd/nand/spr_nand.c b/drivers/mtd/nand/spr_nand.c new file mode 100755 index 000000000..097d0c60b --- /dev/null +++ b/drivers/mtd/nand/spr_nand.c @@ -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; +} diff --git a/drivers/mtd/spr_smi.c b/drivers/mtd/spr_smi.c new file mode 100755 index 000000000..9a70a199c --- /dev/null +++ b/drivers/mtd/spr_smi.c @@ -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 diff --git a/drivers/serial/usbtty.h b/drivers/serial/usbtty.h index 6b6c4a162..a23169a29 100644..100755 --- a/drivers/serial/usbtty.h +++ b/drivers/serial/usbtty.h @@ -33,6 +33,8 @@  #include <usb/musb_udc.h>  #elif defined(CONFIG_PXA27X)  #include <usb/pxa27x_udc.h> +#elif defined(CONFIG_SPEAR3XX) || defined(CONFIG_SPEAR600) +#include <usb/spr_udc.h>  #endif  #include <version_autogenerated.h> diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index 2a19b1e44..1d7362dc9 100644..100755 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile @@ -32,6 +32,7 @@ COBJS-$(CONFIG_OMAP1510) += omap1510_udc.o  COBJS-$(CONFIG_OMAP1610) += omap1510_udc.o  COBJS-$(CONFIG_MPC885_FAMILY) += mpc8xx_udc.o  COBJS-$(CONFIG_PXA27X) += pxa27x_udc.o +COBJS-$(CONFIG_SPEARUDC) += spr_udc.o  endif  COBJS	:= $(COBJS-y) diff --git a/drivers/usb/gadget/spr_udc.c b/drivers/usb/gadget/spr_udc.c new file mode 100755 index 000000000..f2b06d68e --- /dev/null +++ b/drivers/usb/gadget/spr_udc.c @@ -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); +} diff --git a/include/asm-arm/arch-kirkwood/gpio.h b/include/asm-arm/arch-kirkwood/gpio.h index b5bacde34..cd1bc008e 100644 --- a/include/asm-arm/arch-kirkwood/gpio.h +++ b/include/asm-arm/arch-kirkwood/gpio.h @@ -1,9 +1,23 @@  /*   * arch/asm-arm/mach-kirkwood/include/mach/gpio.h   * - * This file is licensed under the terms of the GNU General Public - * License version 2.  This program is licensed "as is" without any - * warranty of any kind, whether express or implied. + * 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., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA   */  /* diff --git a/include/asm-arm/arch-kirkwood/mpp.h b/include/asm-arm/arch-kirkwood/mpp.h index bc74278ed..b3c090edc 100644 --- a/include/asm-arm/arch-kirkwood/mpp.h +++ b/include/asm-arm/arch-kirkwood/mpp.h @@ -3,9 +3,23 @@   *   * Copyright 2009: Marvell Technology Group Ltd.   * - * This file is licensed under the terms of the GNU General Public - * License version 2.  This program is licensed "as is" without any - * warranty of any kind, whether express or implied. + * 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., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA   */  #ifndef __KIRKWOOD_MPP_H diff --git a/include/asm-arm/arch-s3c64xx/s3c6400.h b/include/asm-arm/arch-s3c64xx/s3c6400.h index e527c08b1..10b33241e 100644 --- a/include/asm-arm/arch-s3c64xx/s3c6400.h +++ b/include/asm-arm/arch-s3c64xx/s3c6400.h @@ -817,9 +817,9 @@  /*-----------------------------------------------------------------------   * 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_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 */  /* Memory Parameters */ diff --git a/cpu/arm_cortexa8/s5pc1xx/cache.c b/include/asm-arm/arch-s5pc1xx/sys_proto.h index 8652a45ff..3078aafd7 100644 --- a/cpu/arm_cortexa8/s5pc1xx/cache.c +++ b/include/asm-arm/arch-s5pc1xx/sys_proto.h @@ -1,5 +1,5 @@  /* - * Copyright (C) 2009 Samsung Electronics + * Copyright (C) 2009 Samsung Electrnoics   * Minkyu Kang <mk7.kang@samsung.com>   *   * See file CREDITS for list of people who contributed to this @@ -21,23 +21,12 @@   * MA 02111-1307 USA   */ -#include <common.h> -#include <asm/cache.h> +#ifndef _SYS_PROTO_H_ +#define _SYS_PROTO_H_ -void l2_cache_enable(void) -{ -	unsigned long i; +u32 get_device_type(void); +void invalidate_dcache(u32); +void l2_cache_disable(void); +void l2_cache_enable(void); -	__asm__ __volatile__("mrc p15, 0, %0, c1, c0, 1":"=r"(i)); -	__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)); -} +#endif diff --git a/include/asm-arm/arch-spear/hardware.h b/include/asm-arm/arch-spear/hardware.h new file mode 100644 index 000000000..818f36cc6 --- /dev/null +++ b/include/asm-arm/arch-spear/hardware.h @@ -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 */ diff --git a/include/asm-arm/arch-spear/spr_defs.h b/include/asm-arm/arch-spear/spr_defs.h new file mode 100644 index 000000000..fa8412ccf --- /dev/null +++ b/include/asm-arm/arch-spear/spr_defs.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 diff --git a/include/asm-arm/arch-spear/spr_emi.h b/include/asm-arm/arch-spear/spr_emi.h new file mode 100644 index 000000000..c1f1c2aff --- /dev/null +++ b/include/asm-arm/arch-spear/spr_emi.h @@ -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 diff --git a/include/asm-arm/arch-spear/spr_gpt.h b/include/asm-arm/arch-spear/spr_gpt.h new file mode 100755 index 000000000..965b5abb9 --- /dev/null +++ b/include/asm-arm/arch-spear/spr_gpt.h @@ -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 diff --git a/include/asm-arm/arch-spear/spr_i2c.h b/include/asm-arm/arch-spear/spr_i2c.h new file mode 100755 index 000000000..7521ebc6c --- /dev/null +++ b/include/asm-arm/arch-spear/spr_i2c.h @@ -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_ */ diff --git a/include/asm-arm/arch-spear/spr_misc.h b/include/asm-arm/arch-spear/spr_misc.h new file mode 100644 index 000000000..8b96d9b52 --- /dev/null +++ b/include/asm-arm/arch-spear/spr_misc.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 diff --git a/include/asm-arm/arch-spear/spr_nand.h b/include/asm-arm/arch-spear/spr_nand.h new file mode 100644 index 000000000..2b63dc7e8 --- /dev/null +++ b/include/asm-arm/arch-spear/spr_nand.h @@ -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 diff --git a/include/asm-arm/arch-spear/spr_smi.h b/include/asm-arm/arch-spear/spr_smi.h new file mode 100755 index 000000000..06df74557 --- /dev/null +++ b/include/asm-arm/arch-spear/spr_smi.h @@ -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 diff --git a/include/asm-arm/arch-spear/spr_syscntl.h b/include/asm-arm/arch-spear/spr_syscntl.h new file mode 100644 index 000000000..3c92f094c --- /dev/null +++ b/include/asm-arm/arch-spear/spr_syscntl.h @@ -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; +}; diff --git a/include/asm-arm/arch-spear/spr_xloader_table.h b/include/asm-arm/arch-spear/spr_xloader_table.h new file mode 100755 index 000000000..7e3da1857 --- /dev/null +++ b/include/asm-arm/arch-spear/spr_xloader_table.h @@ -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 diff --git a/include/asm-arm/mach-types.h b/include/asm-arm/mach-types.h index 289861858..3b4632788 100644 --- a/include/asm-arm/mach-types.h +++ b/include/asm-arm/mach-types.h @@ -2594,6 +2594,33 @@ extern unsigned int __machine_arch_type;  #define MACH_TYPE_ELTD100              2611  #define MACH_TYPE_CAPC7117             2612  #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 machine_arch_type @@ -33579,6 +33606,330 @@ extern unsigned int __machine_arch_type;  # define machine_is_swan()	(0)  #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   */ diff --git a/include/configs/meesc.h b/include/configs/meesc.h index ab5cbca18..c3255fad6 100644 --- a/include/configs/meesc.h +++ b/include/configs/meesc.h @@ -48,6 +48,7 @@  #define CONFIG_SKIP_LOWLEVEL_INIT  #define CONFIG_SKIP_RELOCATE_UBOOT +#define CONFIG_MISC_INIT_R			/* Call misc_init_r */  #define CONFIG_ARCH_CPU_INIT diff --git a/include/configs/smdkc100.h b/include/configs/smdkc100.h index bf0ee67ba..a8ba0528b 100644 --- a/include/configs/smdkc100.h +++ b/include/configs/smdkc100.h @@ -47,8 +47,6 @@  #undef CONFIG_SKIP_RELOCATE_UBOOT -#define CONFIG_L2_OFF -  /* input clock of PLL: SMDKC100 has 12MHz input clock */  #define CONFIG_SYS_CLK_FREQ		12000000 diff --git a/include/configs/spear-common.h b/include/configs/spear-common.h new file mode 100644 index 000000000..cc52e39ff --- /dev/null +++ b/include/configs/spear-common.h @@ -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 diff --git a/include/configs/spear3xx.h b/include/configs/spear3xx.h new file mode 100755 index 000000000..0248abadc --- /dev/null +++ b/include/configs/spear3xx.h @@ -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 */ diff --git a/include/configs/spear6xx.h b/include/configs/spear6xx.h new file mode 100755 index 000000000..2ad5beb82 --- /dev/null +++ b/include/configs/spear6xx.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 */ diff --git a/include/usb/spr_udc.h b/include/usb/spr_udc.h new file mode 100755 index 000000000..2c332d599 --- /dev/null +++ b/include/usb/spr_udc.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 */  |