diff options
| author | Wolfgang Denk <wd@denx.de> | 2008-06-05 01:12:30 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2008-06-05 01:12:30 +0200 | 
| commit | 8155efbd7ae9c65564ca98affe94631d612ae088 (patch) | |
| tree | 23f89ba651f48bf88c653796cb64f2c58d2f0515 | |
| parent | 5e1882df6a3efc7de5524d28cea4ecde7d163d54 (diff) | |
| parent | 9ef1cbef1a649e3779298b0e663be4865cbbbfbc (diff) | |
| download | olio-uboot-2014.01-8155efbd7ae9c65564ca98affe94631d612ae088.tar.xz olio-uboot-2014.01-8155efbd7ae9c65564ca98affe94631d612ae088.zip | |
Merge branch 'master' of ssh://mercury/home/wd/git/u-boot/master
207 files changed, 8570 insertions, 1259 deletions
| @@ -7221,7 +7221,7 @@ Date:	Mon Mar 3 11:57:23 2008 +0000      Originally pointed out by Laurent Pinchart <laurent.pinchart@tbox.biz>,      see http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/22846 -    Signed-off-by: Bernhard Nemec <bnemec <at> ganssloser.com> +    Signed-off-by: Bernhard Nemec <bnemec@ganssloser.com>  commit 84d0c2f1e39caff58bf765a7ab7c72da23c25ec8  Author: Kim B. Heino <Kim.Heino@bluegiga.com> @@ -8451,7 +8451,7 @@ Date:	Mon Feb 18 14:01:56 2008 -0600      86xx: Convert sbc8641d to use libfdt.      This is the proper fix for a missing closing brace in the function -    ft_cpu_setup() noticed by joe.hamman <at> embeddedspecialties.com. +    ft_cpu_setup() noticed by joe.hamman@embeddedspecialties.com.      The ft_cpu_setup() function in mpc8641hpcn.c should have been      removed earlier as it was under the obsolete CONFIG_OF_FLAT_TREE,      but was missed.  Only, the sbc8641d was nominally still using it. @@ -8846,7 +8846,7 @@ Date:	Fri Feb 22 11:40:50 2008 +0000      We already have a vendor subdir for Atmel, so we should use it. -    Signed-off-by: Haavard Skinnemoen <hskinnemoen <at> atmel.com> +    Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>  commit 6d0943a6be99977d6d853d51749e9963d68eb192  Author: Andreas Engel <andreas.engel@ericsson.com> @@ -8896,8 +8896,8 @@ Date:	Thu Jan 3 21:15:56 2008 +0000      AT91CAP9 support : MACB changes -    Signed-off-by: Stelian Pop <stelian <at> popies.net> -    Acked-by: Haavard Skinnemoen <hskinnemoen <at> atmel.com> +    Signed-off-by: Stelian Pop <stelian@popies.net> +    Acked-by: Haavard Skinnemoen <hskinnemoen@atmel.com>  commit 6afcabf11d7321850f4feaadfee841488ace54c5  Author: Stelian Pop <stelian@popies.net> @@ -8913,7 +8913,7 @@ Date:	Wed Jan 30 21:15:54 2008 +0000      AT91CAP9 support : cpu/ files -    Signed-off-by: Stelian Pop <stelian <at> popies.net> +    Signed-off-by: Stelian Pop <stelian@popies.net>  commit fa506a926cec348805143576c941f8e61b333cc0  Author: Stelian Pop <stelian@popies.net> diff --git a/MAINTAINERS b/MAINTAINERS index ac7572cfc..d3dfd4803 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -204,6 +204,10 @@ Klaus Heydeck <heydeck@kieback-peter.de>  	KUP4K			MPC855  	KUP4X			MPC859 +Gary Jennejohn <garyj@denx.de> + +	quad100hd		PPC405EP +  Murray Jensen <Murray.Jensen@csiro.au>  	cogent_mpc8xx		MPC8xx @@ -538,6 +542,9 @@ Stelian Pop <stelian.pop@leadtechdesign.com>  	at91cap9adk		ARM926EJS (AT91CAP9 SoC)  	at91sam9260ek		ARM926EJS (AT91SAM9260 SoC) +	at91sam9261ek		ARM926EJS (AT91SAM9261 SoC) +	at91sam9263ek		ARM926EJS (AT91SAM9263 SoC) +	at91sam9rlek		ARM926EJS (AT91SAM9RL SoC)  Stefan Roese <sr@denx.de> @@ -695,6 +702,7 @@ Haavard Skinnemoen <hskinnemoen@atmel.com>  	ATSTK1002		AT32AP7000  	ATSTK1003		AT32AP7001  	ATSTK1004		AT32AP7002 +	ATSTK1006		AT32AP7000  	ATNGW100		AT32AP7000  ######################################################################### @@ -219,6 +219,7 @@ LIST_4xx="		\  	PMC405		\  	PMC440		\  	PPChameleonEVB	\ +	quad100hd	\  	rainier		\  	sbc405		\  	sc3		\ @@ -461,6 +462,9 @@ LIST_ARM9="			\  	at91cap9adk		\  	at91rm9200dk		\  	at91sam9260ek		\ +	at91sam9261ek		\ +	at91sam9263ek		\ +	at91sam9rlek		\  	cmc_pu2			\  	ap920t			\  	ap922_XA10		\ @@ -521,6 +525,24 @@ LIST_ARM11="		\  "  ######################################################################### +## AT91 Systems +######################################################################### + +LIST_at91="		\ +	at91cap9adk	\ +	at91rm9200dk	\ +	at91sam9260ek	\ +	at91sam9261ek	\ +	at91sam9263ek	\ +	at91sam9rlek	\ +	cmc_pu2		\ +	csb637		\ +	kb9202		\ +	mp2usb		\ +	m501sk		\ +" + +#########################################################################  ## Xscale Systems  ######################################################################### @@ -697,6 +719,7 @@ LIST_avr32="		\  	atstk1002	\  	atstk1003	\  	atstk1004	\ +	atstk1006	\  	atngw100	\  " @@ -765,7 +788,7 @@ build_target() {  for arg in $@  do  	case "$arg" in -	arm|SA|ARM7|ARM9|ARM10|ARM11|ixp|pxa \ +	arm|SA|ARM7|ARM9|ARM10|ARM11|at91|ixp|pxa \  	|avr32 \  	|blackfin \  	|coldfire \ @@ -224,6 +224,7 @@ LIBS += drivers/mtd/libmtd.a  LIBS += drivers/mtd/nand/libnand.a  LIBS += drivers/mtd/nand_legacy/libnand_legacy.a  LIBS += drivers/mtd/onenand/libonenand.a +LIBS += drivers/mtd/spi/libspi_flash.a  LIBS += drivers/net/libnet.a  LIBS += drivers/net/sk98lin/libsk98lin.a  LIBS += drivers/pci/libpci.a @@ -390,6 +391,7 @@ TAG_SUBDIRS += drivers/mtd  TAG_SUBDIRS += drivers/mtd/nand  TAG_SUBDIRS += drivers/mtd/nand_legacy  TAG_SUBDIRS += drivers/mtd/onenand +TAG_SUBDIRS += drivers/mtd/spi  TAG_SUBDIRS += drivers/net  TAG_SUBDIRS += drivers/net/sk98lin  TAG_SUBDIRS += drivers/pci @@ -1391,6 +1393,9 @@ PPChameleonEVB_HI_33_config:	unconfig  		}  	@$(MKCONFIG) -a $(call xtract_4xx,$@) ppc ppc4xx PPChameleonEVB dave +quad100hd_config:	unconfig +	@$(MKCONFIG) $(@:_config=) ppc ppc4xx quad100hd +  sbc405_config:	unconfig  	@$(MKCONFIG) $(@:_config=) ppc ppc4xx sbc405 @@ -2335,6 +2340,15 @@ shannon_config	:	unconfig  at91rm9200dk_config	:	unconfig  	@$(MKCONFIG) $(@:_config=) arm arm920t at91rm9200dk atmel at91rm9200 +at91sam9261ek_config	:	unconfig +	@$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9261ek atmel at91sam9 + +at91sam9263ek_config	:	unconfig +	@$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9263ek atmel at91sam9 + +at91sam9rlek_config	:	unconfig +	@$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9rlek atmel at91sam9 +  cmc_pu2_config	:	unconfig  	@$(MKCONFIG) $(@:_config=) arm arm920t cmc_pu2 NULL at91rm9200 @@ -2879,6 +2893,9 @@ atstk1003_config	:	unconfig  atstk1004_config	:	unconfig  	@$(MKCONFIG) $(@:_config=) avr32 at32ap atstk1000 atmel at32ap700x +atstk1006_config	:	unconfig +	@$(MKCONFIG) $(@:_config=) avr32 at32ap atstk1000 atmel at32ap700x +  atngw100_config	:	unconfig  	@$(MKCONFIG) $(@:_config=) avr32 at32ap atngw100 atmel at32ap700x @@ -961,6 +961,10 @@ The following options need to be configured:  		display); also select one of the supported displays  		by defining one of these: +		CONFIG_ATMEL_LCD: + +			HITACHI TX09D70VM1CCA, 3.5", 240x320. +  		CONFIG_NEC_NL6448AC33:  			NEC NL6448AC33-18. Active, color, single scan. diff --git a/board/amcc/taihu/taihu.c b/board/amcc/taihu/taihu.c index eedde597b..891b4d924 100644 --- a/board/amcc/taihu/taihu.c +++ b/board/amcc/taihu/taihu.c @@ -165,16 +165,20 @@ unsigned char spi_read(void)  	return (unsigned char)gpio_read_in_bit(SPI_DIN_GPIO15);  } -void taihu_spi_chipsel(int cs) +int spi_cs_is_valid(unsigned int bus, unsigned int cs)  { -	gpio_write_bit(SPI_CS_GPIO0, cs); +	return bus == 0 && cs == 0;  } -spi_chipsel_type spi_chipsel[]= { -	taihu_spi_chipsel -}; +void spi_cs_activate(struct spi_slave *slave) +{ +	gpio_write_bit(SPI_CS_GPIO0, 1); +} -int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]); +void spi_cs_deactivate(struct spi_slave *slave) +{ +	gpio_write_bit(SPI_CS_GPIO0, 0); +}  #ifdef CONFIG_PCI  static unsigned char int_lines[32] = { diff --git a/board/atmel/at91cap9adk/Makefile b/board/atmel/at91cap9adk/Makefile index e33af76c0..f2b9c12ad 100644 --- a/board/atmel/at91cap9adk/Makefile +++ b/board/atmel/at91cap9adk/Makefile @@ -2,6 +2,10 @@  # (C) Copyright 2003-2008  # Wolfgang Denk, DENX Software Engineering, wd@denx.de.  # +# (C) Copyright 2008 +# Stelian Pop <stelian.pop@leadtechdesign.com> +# Lead Tech Design <www.leadtechdesign.com> +#  # See file CREDITS for list of people who contributed to this  # project.  # diff --git a/board/atmel/at91cap9adk/at91cap9adk.c b/board/atmel/at91cap9adk/at91cap9adk.c index 5de52b919..a3eaf1922 100644 --- a/board/atmel/at91cap9adk/at91cap9adk.c +++ b/board/atmel/at91cap9adk/at91cap9adk.c @@ -30,6 +30,8 @@  #include <asm/arch/at91_rstc.h>  #include <asm/arch/gpio.h>  #include <asm/arch/io.h> +#include <lcd.h> +#include <atmel_lcdc.h>  #if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB)  #include <net.h>  #endif @@ -70,6 +72,33 @@ static void at91cap9_serial_hw_init(void)  #endif  } +static void at91cap9_slowclock_hw_init(void) +{ +	/* +	 * On AT91CAP9 revC CPUs, the slow clock can be based on an +	 * internal impreciseRC oscillator or an external 32kHz oscillator. +	 * Switch to the latter. +	 */ +#define ARCH_ID_AT91CAP9_REVB	0x399 +#define ARCH_ID_AT91CAP9_REVC	0x601 +	if (at91_sys_read(AT91_PMC_VER) == ARCH_ID_AT91CAP9_REVC) { +		unsigned i, tmp = at91_sys_read(AT91_SCKCR); +		if ((tmp & AT91CAP9_SCKCR_OSCSEL) == AT91CAP9_SCKCR_OSCSEL_RC) { +			extern void timer_init(void); +			timer_init(); +			tmp |= AT91CAP9_SCKCR_OSC32EN; +			at91_sys_write(AT91_SCKCR, tmp); +			for (i = 0; i < 1200; i++) +				udelay(1000); +			tmp |= AT91CAP9_SCKCR_OSCSEL_32; +			at91_sys_write(AT91_SCKCR, tmp); +			udelay(200); +			tmp &= ~AT91CAP9_SCKCR_RCEN; +			at91_sys_write(AT91_SCKCR, tmp); +		} +	} +} +  static void at91cap9_nor_hw_init(void)  {  	unsigned long csa; @@ -116,7 +145,12 @@ static void at91cap9_nand_hw_init(void)  	at91_sys_write(AT91_SMC_MODE(3),  		       AT91_SMC_READMODE | AT91_SMC_WRITEMODE |  		       AT91_SMC_EXNWMODE_DISABLE | -		       AT91_SMC_DBW_8 | AT91_SMC_TDF_(1)); +#ifdef CFG_NAND_DBW_16 +		       AT91_SMC_DBW_16 | +#else /* CFG_NAND_DBW_8 */ +		       AT91_SMC_DBW_8 | +#endif +		       AT91_SMC_TDF_(1));  	at91_sys_write(AT91_PMC_PCER, 1 << AT91CAP9_ID_PIOABCD); @@ -228,6 +262,65 @@ static void at91cap9_uhp_hw_init(void)  }  #endif +#ifdef CONFIG_LCD +vidinfo_t panel_info = { +	vl_col:		240, +	vl_row:		320, +	vl_clk:		4965000, +	vl_sync:	ATMEL_LCDC_INVLINE_INVERTED | +			ATMEL_LCDC_INVFRAME_INVERTED, +	vl_bpix:	3, +	vl_tft:		1, +	vl_hsync_len:	5, +	vl_left_margin:	1, +	vl_right_margin:33, +	vl_vsync_len:	1, +	vl_upper_margin:1, +	vl_lower_margin:0, +	mmio:		AT91CAP9_LCDC_BASE, +}; + +void lcd_enable(void) +{ +	at91_set_gpio_value(AT91_PIN_PC0, 0);  /* power up */ +} + +void lcd_disable(void) +{ +	at91_set_gpio_value(AT91_PIN_PC0, 1);  /* power down */ +} + +static void at91cap9_lcd_hw_init(void) +{ +	at91_set_A_periph(AT91_PIN_PC1, 0);	/* LCDHSYNC */ +	at91_set_A_periph(AT91_PIN_PC2, 0);	/* LCDDOTCK */ +	at91_set_A_periph(AT91_PIN_PC3, 0);	/* LCDDEN */ +	at91_set_B_periph(AT91_PIN_PB9, 0);	/* LCDCC */ +	at91_set_A_periph(AT91_PIN_PC6, 0);	/* LCDD2 */ +	at91_set_A_periph(AT91_PIN_PC7, 0);	/* LCDD3 */ +	at91_set_A_periph(AT91_PIN_PC8, 0);	/* LCDD4 */ +	at91_set_A_periph(AT91_PIN_PC9, 0);	/* LCDD5 */ +	at91_set_A_periph(AT91_PIN_PC10, 0);	/* LCDD6 */ +	at91_set_A_periph(AT91_PIN_PC11, 0);	/* LCDD7 */ +	at91_set_A_periph(AT91_PIN_PC14, 0);	/* LCDD10 */ +	at91_set_A_periph(AT91_PIN_PC15, 0);	/* LCDD11 */ +	at91_set_A_periph(AT91_PIN_PC16, 0);	/* LCDD12 */ +	at91_set_A_periph(AT91_PIN_PC17, 0);	/* LCDD13 */ +	at91_set_A_periph(AT91_PIN_PC18, 0);	/* LCDD14 */ +	at91_set_A_periph(AT91_PIN_PC19, 0);	/* LCDD15 */ +	at91_set_A_periph(AT91_PIN_PC22, 0);	/* LCDD18 */ +	at91_set_A_periph(AT91_PIN_PC23, 0);	/* LCDD19 */ +	at91_set_A_periph(AT91_PIN_PC24, 0);	/* LCDD20 */ +	at91_set_A_periph(AT91_PIN_PC25, 0);	/* LCDD21 */ +	at91_set_A_periph(AT91_PIN_PC26, 0);	/* LCDD22 */ +	at91_set_A_periph(AT91_PIN_PC27, 0);	/* LCDD23 */ + +	at91_sys_write(AT91_PMC_PCER, 1 << AT91CAP9_ID_LCDC); + +	gd->fb_base = 0; +} +#endif +  int board_init(void)  {  	/* Enable Ctrlc */ @@ -239,6 +332,7 @@ int board_init(void)  	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;  	at91cap9_serial_hw_init(); +	at91cap9_slowclock_hw_init();  	at91cap9_nor_hw_init();  #ifdef CONFIG_CMD_NAND  	at91cap9_nand_hw_init(); @@ -252,7 +346,9 @@ int board_init(void)  #ifdef CONFIG_USB_OHCI_NEW  	at91cap9_uhp_hw_init();  #endif - +#ifdef CONFIG_LCD +	at91cap9_lcd_hw_init(); +#endif  	return 0;  } diff --git a/board/atmel/at91cap9adk/nand.c b/board/atmel/at91cap9adk/nand.c index 28091a422..0432ef13d 100644 --- a/board/atmel/at91cap9adk/nand.c +++ b/board/atmel/at91cap9adk/nand.c @@ -63,6 +63,9 @@ static void at91cap9adk_nand_hwcontrol(struct mtd_info *mtd, int cmd)  int board_nand_init(struct nand_chip *nand)  {  	nand->eccmode = NAND_ECC_SOFT; +#ifdef CFG_NAND_DBW_16 +	nand->options = NAND_BUSWIDTH_16; +#endif  	nand->hwcontrol = at91cap9adk_nand_hwcontrol;  	nand->chip_delay = 20; diff --git a/board/atmel/at91sam9260ek/Makefile b/board/atmel/at91sam9260ek/Makefile index e6e4082c7..f93540a02 100644 --- a/board/atmel/at91sam9260ek/Makefile +++ b/board/atmel/at91sam9260ek/Makefile @@ -2,6 +2,10 @@  # (C) Copyright 2003-2008  # Wolfgang Denk, DENX Software Engineering, wd@denx.de.  # +# (C) Copyright 2008 +# Stelian Pop <stelian.pop@leadtechdesign.com> +# Lead Tech Design <www.leadtechdesign.com> +#  # See file CREDITS for list of people who contributed to this  # project.  # diff --git a/board/atmel/at91sam9260ek/at91sam9260ek.c b/board/atmel/at91sam9260ek/at91sam9260ek.c index b30aad837..ef4d486be 100644 --- a/board/atmel/at91sam9260ek/at91sam9260ek.c +++ b/board/atmel/at91sam9260ek/at91sam9260ek.c @@ -90,7 +90,12 @@ static void at91sam9260ek_nand_hw_init(void)  	at91_sys_write(AT91_SMC_MODE(3),  		       AT91_SMC_READMODE | AT91_SMC_WRITEMODE |  		       AT91_SMC_EXNWMODE_DISABLE | -		       AT91_SMC_DBW_8 | AT91_SMC_TDF_(2)); +#ifdef CFG_NAND_DBW_16 +		       AT91_SMC_DBW_16 | +#else /* CFG_NAND_DBW_8 */ +		       AT91_SMC_DBW_8 | +#endif +		       AT91_SMC_TDF_(2));  	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOC); diff --git a/board/atmel/at91sam9260ek/nand.c b/board/atmel/at91sam9260ek/nand.c index 7c1e6abd9..9738f0fd4 100644 --- a/board/atmel/at91sam9260ek/nand.c +++ b/board/atmel/at91sam9260ek/nand.c @@ -68,6 +68,9 @@ static int at91sam9260ek_nand_ready(struct mtd_info *mtd)  int board_nand_init(struct nand_chip *nand)  {  	nand->eccmode = NAND_ECC_SOFT; +#ifdef CFG_NAND_DBW_16 +	nand->options = NAND_BUSWIDTH_16; +#endif  	nand->hwcontrol = at91sam9260ek_nand_hwcontrol;  	nand->dev_ready = at91sam9260ek_nand_ready;  	nand->chip_delay = 20; diff --git a/board/atmel/at91sam9260ek/u-boot.lds b/board/atmel/at91sam9260ek/u-boot.lds deleted file mode 100644 index 996f401f0..000000000 --- a/board/atmel/at91sam9260ek/u-boot.lds +++ /dev/null @@ -1,57 +0,0 @@ -/* - * (C) Copyright 2002 - * Gary Jennejohn, DENX Software Engineering, <gj@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 - */ - -OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ -OUTPUT_ARCH(arm) -ENTRY(_start) -SECTIONS -{ -	. = 0x00000000; - -	. = ALIGN(4); -	.text : -	{ -	  cpu/arm926ejs/start.o	(.text) -	  *(.text) -	} - -	. = ALIGN(4); -	.rodata : { *(.rodata) } - -	. = ALIGN(4); -	.data : { *(.data) } - -	. = ALIGN(4); -	.got : { *(.got) } - -	. = .; -	__u_boot_cmd_start = .; -	.u_boot_cmd : { *(.u_boot_cmd) } -	__u_boot_cmd_end = .; - -	. = ALIGN(4); -	__bss_start = .; -	.bss : { *(.bss) } -	_end = .; -} diff --git a/board/atmel/at91sam9261ek/Makefile b/board/atmel/at91sam9261ek/Makefile new file mode 100644 index 000000000..7702a9c90 --- /dev/null +++ b/board/atmel/at91sam9261ek/Makefile @@ -0,0 +1,57 @@ +# +# (C) Copyright 2003-2008 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# (C) Copyright 2008 +# Stelian Pop <stelian.pop@leadtechdesign.com> +# Lead Tech Design <www.leadtechdesign.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 $(TOPDIR)/config.mk + +LIB	= $(obj)lib$(BOARD).a + +COBJS-y += at91sam9261ek.o +COBJS-y += led.o +COBJS-y	+= partition.o +COBJS-$(CONFIG_CMD_NAND) += nand.o + +SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS-y)) +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 .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/atmel/at91sam9261ek/at91sam9261ek.c b/board/atmel/at91sam9261ek/at91sam9261ek.c new file mode 100644 index 000000000..3de234ce3 --- /dev/null +++ b/board/atmel/at91sam9261ek/at91sam9261ek.c @@ -0,0 +1,258 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.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/arch/at91sam9261.h> +#include <asm/arch/at91sam9261_matrix.h> +#include <asm/arch/at91sam9_smc.h> +#include <asm/arch/at91_pmc.h> +#include <asm/arch/at91_rstc.h> +#include <asm/arch/gpio.h> +#include <asm/arch/io.h> +#include <lcd.h> +#include <atmel_lcdc.h> +#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_DRIVER_DM9000) +#include <net.h> +#endif + +DECLARE_GLOBAL_DATA_PTR; + +/* ------------------------------------------------------------------------- */ +/* + * Miscelaneous platform dependent initialisations + */ + +static void at91sam9261ek_serial_hw_init(void) +{ +#ifdef CONFIG_USART0 +	at91_set_A_periph(AT91_PIN_PC8, 1);		/* TXD0 */ +	at91_set_A_periph(AT91_PIN_PC9, 0);		/* RXD0 */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US0); +#endif + +#ifdef CONFIG_USART1 +	at91_set_A_periph(AT91_PIN_PC12, 1);		/* TXD1 */ +	at91_set_A_periph(AT91_PIN_PC13, 0);		/* RXD1 */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US1); +#endif + +#ifdef CONFIG_USART2 +	at91_set_A_periph(AT91_PIN_PC14, 1);		/* TXD2 */ +	at91_set_A_periph(AT91_PIN_PC15, 0);		/* RXD2 */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US2); +#endif + +#ifdef CONFIG_USART3	/* DBGU */ +	at91_set_A_periph(AT91_PIN_PA9, 0);		/* DRXD */ +	at91_set_A_periph(AT91_PIN_PA10, 1);		/* DTXD */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS); +#endif +} + +#ifdef CONFIG_CMD_NAND +static void at91sam9261ek_nand_hw_init(void) +{ +	unsigned long csa; + +	/* Enable CS3 */ +	csa = at91_sys_read(AT91_MATRIX_EBICSA); +	at91_sys_write(AT91_MATRIX_EBICSA, +		       csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); + +	/* Configure SMC CS3 for NAND/SmartMedia */ +	at91_sys_write(AT91_SMC_SETUP(3), +		       AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) | +		       AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0)); +	at91_sys_write(AT91_SMC_PULSE(3), +		       AT91_SMC_NWEPULSE_(2) | AT91_SMC_NCS_WRPULSE_(5) | +		       AT91_SMC_NRDPULSE_(2) | AT91_SMC_NCS_RDPULSE_(5)); +	at91_sys_write(AT91_SMC_CYCLE(3), +		       AT91_SMC_NWECYCLE_(7) | AT91_SMC_NRDCYCLE_(7)); +	at91_sys_write(AT91_SMC_MODE(3), +		       AT91_SMC_READMODE | AT91_SMC_WRITEMODE | +		       AT91_SMC_EXNWMODE_DISABLE | +#ifdef CFG_NAND_DBW_16 +		       AT91_SMC_DBW_16 | +#else /* CFG_NAND_DBW_8 */ +		       AT91_SMC_DBW_8 | +#endif +		       AT91_SMC_TDF_(1)); + +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9261_ID_PIOC); + +	/* Configure RDY/BSY */ +	at91_set_gpio_input(AT91_PIN_PC15, 1); + +	/* Enable NandFlash */ +	at91_set_gpio_output(AT91_PIN_PC14, 1); + +	at91_set_A_periph(AT91_PIN_PC0, 0);	/* NANDOE */ +	at91_set_A_periph(AT91_PIN_PC1, 0);	/* NANDWE */ +} +#endif + +#ifdef CONFIG_HAS_DATAFLASH +static void at91sam9261ek_spi_hw_init(void) +{ +	at91_set_A_periph(AT91_PIN_PA3, 0);	/* SPI0_NPCS0 */ + +	at91_set_A_periph(AT91_PIN_PA0, 0);	/* SPI0_MISO */ +	at91_set_A_periph(AT91_PIN_PA1, 0);	/* SPI0_MOSI */ +	at91_set_A_periph(AT91_PIN_PA2, 0);	/* SPI0_SPCK */ + +	/* Enable clock */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9261_ID_SPI0); +} +#endif + +#ifdef CONFIG_DRIVER_DM9000 +static void at91sam9261ek_dm9000_hw_init(void) +{ +	/* Configure SMC CS2 for DM9000 */ +	at91_sys_write(AT91_SMC_SETUP(2), +		       AT91_SMC_NWESETUP_(2) | AT91_SMC_NCS_WRSETUP_(0) | +		       AT91_SMC_NRDSETUP_(2) | AT91_SMC_NCS_RDSETUP_(0)); +	at91_sys_write(AT91_SMC_PULSE(2), +		       AT91_SMC_NWEPULSE_(4) | AT91_SMC_NCS_WRPULSE_(8) | +		       AT91_SMC_NRDPULSE_(4) | AT91_SMC_NCS_RDPULSE_(8)); +	at91_sys_write(AT91_SMC_CYCLE(2), +		       AT91_SMC_NWECYCLE_(16) | AT91_SMC_NRDCYCLE_(16)); +	at91_sys_write(AT91_SMC_MODE(2), +		       AT91_SMC_READMODE | AT91_SMC_WRITEMODE | +		       AT91_SMC_EXNWMODE_DISABLE | +		       AT91_SMC_BAT_WRITE | AT91_SMC_DBW_16 | +		       AT91_SMC_TDF_(1)); + +	/* Configure Reset signal as output */ +	at91_set_gpio_output(AT91_PIN_PC10, 0); + +	/* Configure Interrupt pin as input, no pull-up */ +	at91_set_gpio_input(AT91_PIN_PC11, 0); +} +#endif + +#ifdef CONFIG_LCD +vidinfo_t panel_info = { +	vl_col:		240, +	vl_row:		320, +	vl_clk:		4965000, +	vl_sync:	ATMEL_LCDC_INVLINE_INVERTED | +			ATMEL_LCDC_INVFRAME_INVERTED, +	vl_bpix:	3, +	vl_tft:		1, +	vl_hsync_len:	5, +	vl_left_margin:	1, +	vl_right_margin:33, +	vl_vsync_len:	1, +	vl_upper_margin:1, +	vl_lower_margin:0, +	mmio:		AT91SAM9261_LCDC_BASE, +}; + +void lcd_enable(void) +{ +	at91_set_gpio_value(AT91_PIN_PA12, 0);  /* power up */ +} + +void lcd_disable(void) +{ +	at91_set_gpio_value(AT91_PIN_PA12, 1);  /* power down */ +} + +static void at91sam9261ek_lcd_hw_init(void) +{ +	at91_set_A_periph(AT91_PIN_PB1, 0);	/* LCDHSYNC */ +	at91_set_A_periph(AT91_PIN_PB2, 0);	/* LCDDOTCK */ +	at91_set_A_periph(AT91_PIN_PB3, 0);	/* LCDDEN */ +	at91_set_A_periph(AT91_PIN_PB4, 0);	/* LCDCC */ +	at91_set_A_periph(AT91_PIN_PB7, 0);	/* LCDD2 */ +	at91_set_A_periph(AT91_PIN_PB8, 0);	/* LCDD3 */ +	at91_set_A_periph(AT91_PIN_PB9, 0);	/* LCDD4 */ +	at91_set_A_periph(AT91_PIN_PB10, 0);	/* LCDD5 */ +	at91_set_A_periph(AT91_PIN_PB11, 0);	/* LCDD6 */ +	at91_set_A_periph(AT91_PIN_PB12, 0);	/* LCDD7 */ +	at91_set_A_periph(AT91_PIN_PB15, 0);	/* LCDD10 */ +	at91_set_A_periph(AT91_PIN_PB16, 0);	/* LCDD11 */ +	at91_set_A_periph(AT91_PIN_PB17, 0);	/* LCDD12 */ +	at91_set_A_periph(AT91_PIN_PB18, 0);	/* LCDD13 */ +	at91_set_A_periph(AT91_PIN_PB19, 0);	/* LCDD14 */ +	at91_set_A_periph(AT91_PIN_PB20, 0);	/* LCDD15 */ +	at91_set_B_periph(AT91_PIN_PB23, 0);	/* LCDD18 */ +	at91_set_B_periph(AT91_PIN_PB24, 0);	/* LCDD19 */ +	at91_set_B_periph(AT91_PIN_PB25, 0);	/* LCDD20 */ +	at91_set_B_periph(AT91_PIN_PB26, 0);	/* LCDD21 */ +	at91_set_B_periph(AT91_PIN_PB27, 0);	/* LCDD22 */ +	at91_set_B_periph(AT91_PIN_PB28, 0);	/* LCDD23 */ + +	at91_sys_write(AT91_PMC_SCER, AT91_PMC_HCK1); + +	gd->fb_base = AT91SAM9261_SRAM_BASE; +} +#endif + +int board_init(void) +{ +	/* Enable Ctrlc */ +	console_init_f(); + +	/* arch number of AT91SAM9261EK-Board */ +	gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9261EK; +	/* adress of boot parameters */ +	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; + +	at91sam9261ek_serial_hw_init(); +#ifdef CONFIG_CMD_NAND +	at91sam9261ek_nand_hw_init(); +#endif +#ifdef CONFIG_HAS_DATAFLASH +	at91sam9261ek_spi_hw_init(); +#endif +#ifdef CONFIG_DRIVER_DM9000 +	at91sam9261ek_dm9000_hw_init(); +#endif +#ifdef CONFIG_LCD +	at91sam9261ek_lcd_hw_init(); +#endif +	return 0; +} + +int dram_init(void) +{ +	gd->bd->bi_dram[0].start = PHYS_SDRAM; +	gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE; +	return 0; +} + +#ifdef CONFIG_RESET_PHY_R +void reset_phy(void) +{ +#ifdef CONFIG_DRIVER_DM9000 +	/* +	 * Initialize ethernet HW addr prior to starting Linux, +	 * needed for nfsroot +	 */ +	eth_init(gd->bd); +#endif +} +#endif diff --git a/board/atmel/at91sam9261ek/config.mk b/board/atmel/at91sam9261ek/config.mk new file mode 100644 index 000000000..ff2cfd170 --- /dev/null +++ b/board/atmel/at91sam9261ek/config.mk @@ -0,0 +1 @@ +TEXT_BASE = 0x23f00000 diff --git a/board/atmel/at91sam9261ek/led.c b/board/atmel/at91sam9261ek/led.c new file mode 100644 index 000000000..eb2bb2341 --- /dev/null +++ b/board/atmel/at91sam9261ek/led.c @@ -0,0 +1,78 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.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/arch/at91sam9261.h> +#include <asm/arch/at91_pmc.h> +#include <asm/arch/gpio.h> +#include <asm/arch/io.h> + +#define	RED_LED		AT91_PIN_PA23	/* this is the power led */ +#define	GREEN_LED	AT91_PIN_PA13	/* this is the user1 led */ +#define	YELLOW_LED	AT91_PIN_PA14	/* this is the user2 led */ + +void red_LED_on(void) +{ +	at91_set_gpio_value(RED_LED, 1); +} + +void red_LED_off(void) +{ +	at91_set_gpio_value(RED_LED, 0); +} + +void green_LED_on(void) +{ +	at91_set_gpio_value(GREEN_LED, 0); +} + +void green_LED_off(void) +{ +	at91_set_gpio_value(GREEN_LED, 1); +} + +void yellow_LED_on(void) +{ +	at91_set_gpio_value(YELLOW_LED, 0); +} + +void yellow_LED_off(void) +{ +	at91_set_gpio_value(YELLOW_LED, 1); +} + + +void coloured_LED_init(void) +{ +	/* Enable clock */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9261_ID_PIOA); + +	at91_set_gpio_output(RED_LED, 1); +	at91_set_gpio_output(GREEN_LED, 1); +	at91_set_gpio_output(YELLOW_LED, 1); + +	at91_set_gpio_value(RED_LED, 0); +	at91_set_gpio_value(GREEN_LED, 1); +	at91_set_gpio_value(YELLOW_LED, 1); +} diff --git a/board/atmel/at91sam9261ek/nand.c b/board/atmel/at91sam9261ek/nand.c new file mode 100644 index 000000000..35b26dbef --- /dev/null +++ b/board/atmel/at91sam9261ek/nand.c @@ -0,0 +1,79 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.com> + * + * (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <asm/arch/at91sam9261.h> +#include <asm/arch/gpio.h> +#include <asm/arch/at91_pio.h> + +#include <nand.h> + +/* + *	hardware specific access to control-lines + */ +#define	MASK_ALE	(1 << 22)	/* our ALE is AD22 */ +#define	MASK_CLE	(1 << 21)	/* our CLE is AD21 */ + +static void at91sam9261ek_nand_hwcontrol(struct mtd_info *mtd, int cmd) +{ +	struct nand_chip *this = mtd->priv; +	ulong IO_ADDR_W = (ulong) this->IO_ADDR_W; + +	IO_ADDR_W &= ~(MASK_ALE|MASK_CLE); +	switch (cmd) { +	case NAND_CTL_SETCLE: +		IO_ADDR_W |= MASK_CLE; +		break; +	case NAND_CTL_SETALE: +		IO_ADDR_W |= MASK_ALE; +		break; +	case NAND_CTL_CLRNCE: +		at91_set_gpio_value(AT91_PIN_PC14, 1); +		break; +	case NAND_CTL_SETNCE: +		at91_set_gpio_value(AT91_PIN_PC14, 0); +		break; +	} +	this->IO_ADDR_W = (void *) IO_ADDR_W; +} + +static int at91sam9261ek_nand_ready(struct mtd_info *mtd) +{ +	return at91_get_gpio_value(AT91_PIN_PC15); +} + +int board_nand_init(struct nand_chip *nand) +{ +	nand->eccmode = NAND_ECC_SOFT; +#ifdef CFG_NAND_DBW_16 +	nand->options = NAND_BUSWIDTH_16; +#endif +	nand->hwcontrol = at91sam9261ek_nand_hwcontrol; +	nand->dev_ready = at91sam9261ek_nand_ready; +	nand->chip_delay = 20; + +	return 0; +} diff --git a/board/atmel/at91sam9261ek/partition.c b/board/atmel/at91sam9261ek/partition.c new file mode 100644 index 000000000..975be1746 --- /dev/null +++ b/board/atmel/at91sam9261ek/partition.c @@ -0,0 +1,40 @@ +/* + * (C) Copyright 2008 + * Ulf Samuelsson <ulf@atmel.com> + * + * 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 <config.h> +#include <asm/hardware.h> +#include <dataflash.h> + +AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS]; + +struct dataflash_addr cs[CFG_MAX_DATAFLASH_BANKS] = { +	{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0},	/* Logical adress, CS */ +	{CFG_DATAFLASH_LOGIC_ADDR_CS3, 3} +}; + +/*define the area offsets*/ +dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { +	{0x00000000, 0x000041FF, FLAG_PROTECT_SET,   0, "Bootstrap"}, +	{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, +	{0x00008400, 0x00041FFF, FLAG_PROTECT_SET,   0, "U-Boot"}, +	{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0,	"Kernel"}, +	{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0,	"FS"}, +}; diff --git a/board/atmel/at91sam9263ek/Makefile b/board/atmel/at91sam9263ek/Makefile new file mode 100644 index 000000000..5adb0bc85 --- /dev/null +++ b/board/atmel/at91sam9263ek/Makefile @@ -0,0 +1,57 @@ +# +# (C) Copyright 2003-2008 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# (C) Copyright 2008 +# Stelian Pop <stelian.pop@leadtechdesign.com> +# Lead Tech Design <www.leadtechdesign.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 $(TOPDIR)/config.mk + +LIB	= $(obj)lib$(BOARD).a + +COBJS-y += at91sam9263ek.o +COBJS-y += led.o +COBJS-y	+= partition.o +COBJS-$(CONFIG_CMD_NAND) += nand.o + +SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS-y)) +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 .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/atmel/at91sam9263ek/at91sam9263ek.c b/board/atmel/at91sam9263ek/at91sam9263ek.c new file mode 100644 index 000000000..ba7fc71d7 --- /dev/null +++ b/board/atmel/at91sam9263ek/at91sam9263ek.c @@ -0,0 +1,305 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.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/sizes.h> +#include <asm/arch/at91sam9263.h> +#include <asm/arch/at91sam9263_matrix.h> +#include <asm/arch/at91sam9_smc.h> +#include <asm/arch/at91_pmc.h> +#include <asm/arch/at91_rstc.h> +#include <asm/arch/gpio.h> +#include <asm/arch/io.h> +#include <lcd.h> +#include <atmel_lcdc.h> +#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB) +#include <net.h> +#endif + +DECLARE_GLOBAL_DATA_PTR; + +/* ------------------------------------------------------------------------- */ +/* + * Miscelaneous platform dependent initialisations + */ + +static void at91sam9263ek_serial_hw_init(void) +{ +#ifdef CONFIG_USART0 +	at91_set_A_periph(AT91_PIN_PA26, 1);		/* TXD0 */ +	at91_set_A_periph(AT91_PIN_PA27, 0);		/* RXD0 */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US0); +#endif + +#ifdef CONFIG_USART1 +	at91_set_A_periph(AT91_PIN_PD0, 1);		/* TXD1 */ +	at91_set_A_periph(AT91_PIN_PD1, 0);		/* RXD1 */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US1); +#endif + +#ifdef CONFIG_USART2 +	at91_set_A_periph(AT91_PIN_PD2, 1);		/* TXD2 */ +	at91_set_A_periph(AT91_PIN_PD3, 0);		/* RXD2 */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US2); +#endif + +#ifdef CONFIG_USART3	/* DBGU */ +	at91_set_A_periph(AT91_PIN_PC30, 0);		/* DRXD */ +	at91_set_A_periph(AT91_PIN_PC31, 1);		/* DTXD */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS); +#endif +} + +#ifdef CONFIG_CMD_NAND +static void at91sam9263ek_nand_hw_init(void) +{ +	unsigned long csa; + +	/* Enable CS3 */ +	csa = at91_sys_read(AT91_MATRIX_EBI0CSA); +	at91_sys_write(AT91_MATRIX_EBI0CSA, +		       csa | AT91_MATRIX_EBI0_CS3A_SMC_SMARTMEDIA); + +	/* Configure SMC CS3 for NAND/SmartMedia */ +	at91_sys_write(AT91_SMC_SETUP(3), +		       AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) | +		       AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0)); +	at91_sys_write(AT91_SMC_PULSE(3), +		       AT91_SMC_NWEPULSE_(3) | AT91_SMC_NCS_WRPULSE_(3) | +		       AT91_SMC_NRDPULSE_(3) | AT91_SMC_NCS_RDPULSE_(3)); +	at91_sys_write(AT91_SMC_CYCLE(3), +		       AT91_SMC_NWECYCLE_(5) | AT91_SMC_NRDCYCLE_(5)); +	at91_sys_write(AT91_SMC_MODE(3), +		       AT91_SMC_READMODE | AT91_SMC_WRITEMODE | +		       AT91_SMC_EXNWMODE_DISABLE | +#ifdef CFG_NAND_DBW_16 +		       AT91_SMC_DBW_16 | +#else /* CFG_NAND_DBW_8 */ +		       AT91_SMC_DBW_8 | +#endif +		       AT91_SMC_TDF_(2)); + +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_PIOA | +				      1 << AT91SAM9263_ID_PIOCDE); + +	/* Configure RDY/BSY */ +	at91_set_gpio_input(AT91_PIN_PA22, 1); + +	/* Enable NandFlash */ +	at91_set_gpio_output(AT91_PIN_PD15, 1); +} +#endif + +#ifdef CONFIG_HAS_DATAFLASH +static void at91sam9263ek_spi_hw_init(void) +{ +	at91_set_B_periph(AT91_PIN_PA5, 0);	/* SPI0_NPCS0 */ + +	at91_set_B_periph(AT91_PIN_PA0, 0);	/* SPI0_MISO */ +	at91_set_B_periph(AT91_PIN_PA1, 0);	/* SPI0_MOSI */ +	at91_set_B_periph(AT91_PIN_PA2, 0);	/* SPI0_SPCK */ + +	/* Enable clock */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_SPI0); +} +#endif + +#ifdef CONFIG_MACB +static void at91sam9263ek_macb_hw_init(void) +{ +	/* Enable clock */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC); + +	/* +	 * Disable pull-up on: +	 *	RXDV (PC25) => PHY normal mode (not Test mode) +	 * 	ERX0 (PE25) => PHY ADDR0 +	 *	ERX1 (PE26) => PHY ADDR1 => PHYADDR = 0x0 +	 * +	 * PHY has internal pull-down +	 */ +	writel(pin_to_mask(AT91_PIN_PC25), +	       pin_to_controller(AT91_PIN_PC0) + PIO_PUDR); +	writel(pin_to_mask(AT91_PIN_PE25) | +	       pin_to_mask(AT91_PIN_PE26), +	       pin_to_controller(AT91_PIN_PE0) + PIO_PUDR); + +	/* Need to reset PHY -> 500ms reset */ +	at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY | +				     AT91_RSTC_ERSTL | (0x0D << 8) | +				     AT91_RSTC_URSTEN); + +	at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_EXTRST); + +	/* Wait for end hardware reset */ +	while (!(at91_sys_read(AT91_RSTC_SR) & AT91_RSTC_NRSTL)); + +	/* Re-enable pull-up */ +	writel(pin_to_mask(AT91_PIN_PC25), +	       pin_to_controller(AT91_PIN_PC0) + PIO_PUER); +	writel(pin_to_mask(AT91_PIN_PE25) | +	       pin_to_mask(AT91_PIN_PE26), +	       pin_to_controller(AT91_PIN_PE0) + PIO_PUER); + +	at91_set_A_periph(AT91_PIN_PE21, 0);	/* ETXCK_EREFCK */ +	at91_set_B_periph(AT91_PIN_PC25, 0);	/* ERXDV */ +	at91_set_A_periph(AT91_PIN_PE25, 0);	/* ERX0 */ +	at91_set_A_periph(AT91_PIN_PE26, 0);	/* ERX1 */ +	at91_set_A_periph(AT91_PIN_PE27, 0);	/* ERXER */ +	at91_set_A_periph(AT91_PIN_PE28, 0);	/* ETXEN */ +	at91_set_A_periph(AT91_PIN_PE23, 0);	/* ETX0 */ +	at91_set_A_periph(AT91_PIN_PE24, 0);	/* ETX1 */ +	at91_set_A_periph(AT91_PIN_PE30, 0);	/* EMDIO */ +	at91_set_A_periph(AT91_PIN_PE29, 0);	/* EMDC */ + +#ifndef CONFIG_RMII +	at91_set_A_periph(AT91_PIN_PE22, 0);	/* ECRS */ +	at91_set_B_periph(AT91_PIN_PC26, 0);	/* ECOL */ +	at91_set_B_periph(AT91_PIN_PC22, 0);	/* ERX2 */ +	at91_set_B_periph(AT91_PIN_PC23, 0);	/* ERX3 */ +	at91_set_B_periph(AT91_PIN_PC27, 0);	/* ERXCK */ +	at91_set_B_periph(AT91_PIN_PC20, 0);	/* ETX2 */ +	at91_set_B_periph(AT91_PIN_PC21, 0);	/* ETX3 */ +	at91_set_B_periph(AT91_PIN_PC24, 0);	/* ETXER */ +#endif + +} +#endif + +#ifdef CONFIG_USB_OHCI_NEW +static void at91sam9263ek_uhp_hw_init(void) +{ +	/* Enable VBus on UHP ports */ +	at91_set_gpio_output(AT91_PIN_PA21, 0); +	at91_set_gpio_output(AT91_PIN_PA24, 0); +} +#endif + +#ifdef CONFIG_LCD +vidinfo_t panel_info = { +	vl_col:		240, +	vl_row:		320, +	vl_clk:		4965000, +	vl_sync:	ATMEL_LCDC_INVLINE_INVERTED | +			ATMEL_LCDC_INVFRAME_INVERTED, +	vl_bpix:	3, +	vl_tft:		1, +	vl_hsync_len:	5, +	vl_left_margin:	1, +	vl_right_margin:33, +	vl_vsync_len:	1, +	vl_upper_margin:1, +	vl_lower_margin:0, +	mmio:		AT91SAM9263_LCDC_BASE, +}; + +void lcd_enable(void) +{ +	at91_set_gpio_value(AT91_PIN_PA30, 1);  /* power up */ +} + +void lcd_disable(void) +{ +	at91_set_gpio_value(AT91_PIN_PA30, 0);  /* power down */ +} + +static void at91sam9263ek_lcd_hw_init(void) +{ +	at91_set_A_periph(AT91_PIN_PC1, 0);	/* LCDHSYNC */ +	at91_set_A_periph(AT91_PIN_PC2, 0);	/* LCDDOTCK */ +	at91_set_A_periph(AT91_PIN_PC3, 0);	/* LCDDEN */ +	at91_set_B_periph(AT91_PIN_PB9, 0);	/* LCDCC */ +	at91_set_A_periph(AT91_PIN_PC6, 0);	/* LCDD2 */ +	at91_set_A_periph(AT91_PIN_PC7, 0);	/* LCDD3 */ +	at91_set_A_periph(AT91_PIN_PC8, 0);	/* LCDD4 */ +	at91_set_A_periph(AT91_PIN_PC9, 0);	/* LCDD5 */ +	at91_set_A_periph(AT91_PIN_PC10, 0);	/* LCDD6 */ +	at91_set_A_periph(AT91_PIN_PC11, 0);	/* LCDD7 */ +	at91_set_A_periph(AT91_PIN_PC14, 0);	/* LCDD10 */ +	at91_set_A_periph(AT91_PIN_PC15, 0);	/* LCDD11 */ +	at91_set_A_periph(AT91_PIN_PC16, 0);	/* LCDD12 */ +	at91_set_B_periph(AT91_PIN_PC12, 0);	/* LCDD13 */ +	at91_set_A_periph(AT91_PIN_PC18, 0);	/* LCDD14 */ +	at91_set_A_periph(AT91_PIN_PC19, 0);	/* LCDD15 */ +	at91_set_A_periph(AT91_PIN_PC22, 0);	/* LCDD18 */ +	at91_set_A_periph(AT91_PIN_PC23, 0);	/* LCDD19 */ +	at91_set_A_periph(AT91_PIN_PC24, 0);	/* LCDD20 */ +	at91_set_B_periph(AT91_PIN_PC17, 0);	/* LCDD21 */ +	at91_set_A_periph(AT91_PIN_PC26, 0);	/* LCDD22 */ +	at91_set_A_periph(AT91_PIN_PC27, 0);	/* LCDD23 */ + +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_LCDC); + +	gd->fb_base = AT91SAM9263_SRAM0_BASE; +} +#endif + +int board_init(void) +{ +	/* Enable Ctrlc */ +	console_init_f(); + +	/* arch number of AT91SAM9263EK-Board */ +	gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9263EK; +	/* adress of boot parameters */ +	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; + +	at91sam9263ek_serial_hw_init(); +#ifdef CONFIG_CMD_NAND +	at91sam9263ek_nand_hw_init(); +#endif +#ifdef CONFIG_HAS_DATAFLASH +	at91sam9263ek_spi_hw_init(); +#endif +#ifdef CONFIG_MACB +	at91sam9263ek_macb_hw_init(); +#endif +#ifdef CONFIG_USB_OHCI_NEW +	at91sam9263ek_uhp_hw_init(); +#endif +#ifdef CONFIG_LCD +	at91sam9263ek_lcd_hw_init(); +#endif +	return 0; +} + +int dram_init(void) +{ +	gd->bd->bi_dram[0].start = PHYS_SDRAM; +	gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE; +	return 0; +} + +#ifdef CONFIG_RESET_PHY_R +void reset_phy(void) +{ +#ifdef CONFIG_MACB +	/* +	 * Initialize ethernet HW addr prior to starting Linux, +	 * needed for nfsroot +	 */ +	eth_init(gd->bd); +#endif +} +#endif diff --git a/board/atmel/at91sam9263ek/config.mk b/board/atmel/at91sam9263ek/config.mk new file mode 100644 index 000000000..ff2cfd170 --- /dev/null +++ b/board/atmel/at91sam9263ek/config.mk @@ -0,0 +1 @@ +TEXT_BASE = 0x23f00000 diff --git a/board/atmel/at91sam9263ek/led.c b/board/atmel/at91sam9263ek/led.c new file mode 100644 index 000000000..eb8d6ca04 --- /dev/null +++ b/board/atmel/at91sam9263ek/led.c @@ -0,0 +1,78 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.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/arch/at91sam9263.h> +#include <asm/arch/at91_pmc.h> +#include <asm/arch/gpio.h> +#include <asm/arch/io.h> + +#define	RED_LED		AT91_PIN_PB7	/* this is the power led */ +#define	GREEN_LED	AT91_PIN_PB8	/* this is the user1 led */ +#define	YELLOW_LED	AT91_PIN_PC29	/* this is the user2 led */ + +void red_LED_on(void) +{ +	at91_set_gpio_value(RED_LED, 1); +} + +void red_LED_off(void) +{ +	at91_set_gpio_value(RED_LED, 0); +} + +void green_LED_on(void) +{ +	at91_set_gpio_value(GREEN_LED, 0); +} + +void green_LED_off(void) +{ +	at91_set_gpio_value(GREEN_LED, 1); +} + +void yellow_LED_on(void) +{ +	at91_set_gpio_value(YELLOW_LED, 0); +} + +void yellow_LED_off(void) +{ +	at91_set_gpio_value(YELLOW_LED, 1); +} + +void coloured_LED_init(void) +{ +	/* Enable clock */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_PIOB | +				      1 << AT91SAM9263_ID_PIOCDE); + +	at91_set_gpio_output(RED_LED, 1); +	at91_set_gpio_output(GREEN_LED, 1); +	at91_set_gpio_output(YELLOW_LED, 1); + +	at91_set_gpio_value(RED_LED, 0); +	at91_set_gpio_value(GREEN_LED, 1); +	at91_set_gpio_value(YELLOW_LED, 1); +} diff --git a/board/atmel/at91sam9263ek/nand.c b/board/atmel/at91sam9263ek/nand.c new file mode 100644 index 000000000..507997265 --- /dev/null +++ b/board/atmel/at91sam9263ek/nand.c @@ -0,0 +1,79 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.com> + * + * (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <asm/arch/at91sam9263.h> +#include <asm/arch/gpio.h> +#include <asm/arch/at91_pio.h> + +#include <nand.h> + +/* + *	hardware specific access to control-lines + */ +#define	MASK_ALE	(1 << 21)	/* our ALE is AD21 */ +#define	MASK_CLE	(1 << 22)	/* our CLE is AD22 */ + +static void at91sam9263ek_nand_hwcontrol(struct mtd_info *mtd, int cmd) +{ +	struct nand_chip *this = mtd->priv; +	ulong IO_ADDR_W = (ulong) this->IO_ADDR_W; + +	IO_ADDR_W &= ~(MASK_ALE|MASK_CLE); +	switch (cmd) { +	case NAND_CTL_SETCLE: +		IO_ADDR_W |= MASK_CLE; +		break; +	case NAND_CTL_SETALE: +		IO_ADDR_W |= MASK_ALE; +		break; +	case NAND_CTL_CLRNCE: +		at91_set_gpio_value(AT91_PIN_PD15, 1); +		break; +	case NAND_CTL_SETNCE: +		at91_set_gpio_value(AT91_PIN_PD15, 0); +		break; +	} +	this->IO_ADDR_W = (void *) IO_ADDR_W; +} + +static int at91sam9263ek_nand_ready(struct mtd_info *mtd) +{ +	return at91_get_gpio_value(AT91_PIN_PA22); +} + +int board_nand_init(struct nand_chip *nand) +{ +	nand->eccmode = NAND_ECC_SOFT; +#ifdef CFG_NAND_DBW_16 +	nand->options = NAND_BUSWIDTH_16; +#endif +	nand->hwcontrol = at91sam9263ek_nand_hwcontrol; +	nand->dev_ready = at91sam9263ek_nand_ready; +	nand->chip_delay = 20; + +	return 0; +} diff --git a/cpu/at32ap/pm.c b/board/atmel/at91sam9263ek/partition.c index c78d547f8..eb1a724ab 100644 --- a/cpu/at32ap/pm.c +++ b/board/atmel/at91sam9263ek/partition.c @@ -1,8 +1,6 @@  /* - * Copyright (C) 2006 Atmel Corporation - * - * See file CREDITS for list of people who contributed to this - * project. + * (C) Copyright 2008 + * Ulf Samuelsson <ulf@atmel.com>   *   * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License as @@ -18,25 +16,24 @@   * 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 <config.h> +#include <asm/hardware.h> +#include <dataflash.h> -#ifdef CFG_POWER_MANAGER -#include <asm/errno.h> -#include <asm/io.h> - -#include <asm/arch/memory-map.h> - -#include "sm.h" - - -#ifdef CONFIG_PLL -#define MAIN_CLK_RATE ((CFG_OSC0_HZ / CFG_PLL0_DIV) * CFG_PLL0_MUL) -#else -#define MAIN_CLK_RATE (CFG_OSC0_HZ) -#endif - -DECLARE_GLOBAL_DATA_PTR; +AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS]; +struct dataflash_addr cs[CFG_MAX_DATAFLASH_BANKS] = { +	{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0},	/* Logical adress, CS */ +}; -#endif /* CFG_POWER_MANAGER */ +/*define the area offsets*/ +dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { +	{0x00000000, 0x000041FF, FLAG_PROTECT_SET,   0, "Bootstrap"}, +	{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, +	{0x00008400, 0x00041FFF, FLAG_PROTECT_SET,   0, "U-Boot"}, +	{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0,	"Kernel"}, +	{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0,	"FS"}, +}; diff --git a/board/atmel/at91sam9rlek/Makefile b/board/atmel/at91sam9rlek/Makefile new file mode 100644 index 000000000..a86a9269f --- /dev/null +++ b/board/atmel/at91sam9rlek/Makefile @@ -0,0 +1,57 @@ +# +# (C) Copyright 2003-2008 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# (C) Copyright 2008 +# Stelian Pop <stelian.pop@leadtechdesign.com> +# Lead Tech Design <www.leadtechdesign.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 $(TOPDIR)/config.mk + +LIB	= $(obj)lib$(BOARD).a + +COBJS-y += at91sam9rlek.o +COBJS-y += led.o +COBJS-y	+= partition.o +COBJS-$(CONFIG_CMD_NAND) += nand.o + +SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS-y)) +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 .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/atmel/at91sam9rlek/at91sam9rlek.c b/board/atmel/at91sam9rlek/at91sam9rlek.c new file mode 100644 index 000000000..10423d259 --- /dev/null +++ b/board/atmel/at91sam9rlek/at91sam9rlek.c @@ -0,0 +1,215 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.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/arch/at91sam9rl.h> +#include <asm/arch/at91sam9rl_matrix.h> +#include <asm/arch/at91sam9_smc.h> +#include <asm/arch/at91_pmc.h> +#include <asm/arch/at91_rstc.h> +#include <asm/arch/gpio.h> +#include <asm/arch/io.h> +#include <lcd.h> +#include <atmel_lcdc.h> +#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB) +#include <net.h> +#endif + +DECLARE_GLOBAL_DATA_PTR; + +/* ------------------------------------------------------------------------- */ +/* + * Miscelaneous platform dependent initialisations + */ + +static void at91sam9rlek_serial_hw_init(void) +{ +#ifdef CONFIG_USART0 +	at91_set_A_periph(AT91_PIN_PA6, 1);		/* TXD0 */ +	at91_set_A_periph(AT91_PIN_PA7, 0);		/* RXD0 */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US0); +#endif + +#ifdef CONFIG_USART1 +	at91_set_A_periph(AT91_PIN_PA11, 1);		/* TXD1 */ +	at91_set_A_periph(AT91_PIN_PA12, 0);		/* RXD1 */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US1); +#endif + +#ifdef CONFIG_USART2 +	at91_set_A_periph(AT91_PIN_PA13, 1);		/* TXD2 */ +	at91_set_A_periph(AT91_PIN_PA14, 0);		/* RXD2 */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US2); +#endif + +#ifdef CONFIG_USART3	/* DBGU */ +	at91_set_A_periph(AT91_PIN_PA21, 0);		/* DRXD */ +	at91_set_A_periph(AT91_PIN_PA22, 1);		/* DTXD */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS); +#endif +} + +#ifdef CONFIG_CMD_NAND +static void at91sam9rlek_nand_hw_init(void) +{ +	unsigned long csa; + +	/* Enable CS3 */ +	csa = at91_sys_read(AT91_MATRIX_EBICSA); +	at91_sys_write(AT91_MATRIX_EBICSA, +		       csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); + +	/* Configure SMC CS3 for NAND/SmartMedia */ +	at91_sys_write(AT91_SMC_SETUP(3), +		       AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) | +		       AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0)); +	at91_sys_write(AT91_SMC_PULSE(3), +		       AT91_SMC_NWEPULSE_(2) | AT91_SMC_NCS_WRPULSE_(5) | +		       AT91_SMC_NRDPULSE_(2) | AT91_SMC_NCS_RDPULSE_(5)); +	at91_sys_write(AT91_SMC_CYCLE(3), +		       AT91_SMC_NWECYCLE_(7) | AT91_SMC_NRDCYCLE_(7)); +	at91_sys_write(AT91_SMC_MODE(3), +		       AT91_SMC_READMODE | AT91_SMC_WRITEMODE | +		       AT91_SMC_EXNWMODE_DISABLE | +#ifdef CFG_NAND_DBW_16 +		       AT91_SMC_DBW_16 | +#else /* CFG_NAND_DBW_8 */ +		       AT91_SMC_DBW_8 | +#endif +		       AT91_SMC_TDF_(1)); + +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9RL_ID_PIOD); + +	/* Configure RDY/BSY */ +	at91_set_gpio_input(AT91_PIN_PD17, 1); + +	/* Enable NandFlash */ +	at91_set_gpio_output(AT91_PIN_PB6, 1); + +	at91_set_A_periph(AT91_PIN_PB4, 0);		/* NANDOE */ +	at91_set_A_periph(AT91_PIN_PB5, 0);		/* NANDWE */ +} +#endif + +#ifdef CONFIG_HAS_DATAFLASH +static void at91sam9rlek_spi_hw_init(void) +{ +	at91_set_A_periph(AT91_PIN_PA28, 0);	/* SPI0_NPCS0 */ + +	at91_set_A_periph(AT91_PIN_PA25, 0);	/* SPI0_MISO */ +	at91_set_A_periph(AT91_PIN_PA26, 0);	/* SPI0_MOSI */ +	at91_set_A_periph(AT91_PIN_PA27, 0);	/* SPI0_SPCK */ + +	/* Enable clock */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9RL_ID_SPI); +} +#endif + +#ifdef CONFIG_LCD +vidinfo_t panel_info = { +	vl_col:		240, +	vl_row:		320, +	vl_clk:		4965000, +	vl_sync:	ATMEL_LCDC_INVLINE_INVERTED | +			ATMEL_LCDC_INVFRAME_INVERTED, +	vl_bpix:	3, +	vl_tft:		1, +	vl_hsync_len:	5, +	vl_left_margin:	1, +	vl_right_margin:33, +	vl_vsync_len:	1, +	vl_upper_margin:1, +	vl_lower_margin:0, +	mmio:		AT91SAM9RL_LCDC_BASE, +}; + +void lcd_enable(void) +{ +	at91_set_gpio_value(AT91_PIN_PA30, 0);  /* power up */ +} + +void lcd_disable(void) +{ +	at91_set_gpio_value(AT91_PIN_PA30, 1);  /* power down */ +} +static void at91sam9rlek_lcd_hw_init(void) +{ +	at91_set_B_periph(AT91_PIN_PC1, 0);	/* LCDPWR */ +	at91_set_A_periph(AT91_PIN_PC5, 0);	/* LCDHSYNC */ +	at91_set_A_periph(AT91_PIN_PC6, 0);	/* LCDDOTCK */ +	at91_set_A_periph(AT91_PIN_PC7, 0);	/* LCDDEN */ +	at91_set_A_periph(AT91_PIN_PC3, 0);	/* LCDCC */ +	at91_set_B_periph(AT91_PIN_PC9, 0);	/* LCDD3 */ +	at91_set_B_periph(AT91_PIN_PC10, 0);	/* LCDD4 */ +	at91_set_B_periph(AT91_PIN_PC11, 0);	/* LCDD5 */ +	at91_set_B_periph(AT91_PIN_PC12, 0);	/* LCDD6 */ +	at91_set_B_periph(AT91_PIN_PC13, 0);	/* LCDD7 */ +	at91_set_B_periph(AT91_PIN_PC15, 0);	/* LCDD11 */ +	at91_set_B_periph(AT91_PIN_PC16, 0);	/* LCDD12 */ +	at91_set_B_periph(AT91_PIN_PC17, 0);	/* LCDD13 */ +	at91_set_B_periph(AT91_PIN_PC18, 0);	/* LCDD14 */ +	at91_set_B_periph(AT91_PIN_PC19, 0);	/* LCDD15 */ +	at91_set_B_periph(AT91_PIN_PC20, 0);	/* LCDD18 */ +	at91_set_B_periph(AT91_PIN_PC21, 0);	/* LCDD19 */ +	at91_set_B_periph(AT91_PIN_PC22, 0);	/* LCDD20 */ +	at91_set_B_periph(AT91_PIN_PC23, 0);	/* LCDD21 */ +	at91_set_B_periph(AT91_PIN_PC24, 0);	/* LCDD22 */ +	at91_set_B_periph(AT91_PIN_PC25, 0);	/* LCDD23 */ + +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9RL_ID_LCDC); + +	gd->fb_base = 0; +} +#endif + + +int board_init(void) +{ +	/* Enable Ctrlc */ +	console_init_f(); + +	/* arch number of AT91SAM9RLEK-Board */ +	gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9RLEK; +	/* adress of boot parameters */ +	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; + +	at91sam9rlek_serial_hw_init(); +#ifdef CONFIG_CMD_NAND +	at91sam9rlek_nand_hw_init(); +#endif +#ifdef CONFIG_HAS_DATAFLASH +	at91sam9rlek_spi_hw_init(); +#endif +#ifdef CONFIG_LCD +	at91sam9rlek_lcd_hw_init(); +#endif +	return 0; +} + +int dram_init(void) +{ +	gd->bd->bi_dram[0].start = PHYS_SDRAM; +	gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE; +	return 0; +} diff --git a/board/atmel/at91sam9rlek/config.mk b/board/atmel/at91sam9rlek/config.mk new file mode 100644 index 000000000..ff2cfd170 --- /dev/null +++ b/board/atmel/at91sam9rlek/config.mk @@ -0,0 +1 @@ +TEXT_BASE = 0x23f00000 diff --git a/board/atmel/at91sam9rlek/led.c b/board/atmel/at91sam9rlek/led.c new file mode 100644 index 000000000..8a7d8e0bf --- /dev/null +++ b/board/atmel/at91sam9rlek/led.c @@ -0,0 +1,77 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.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/arch/at91sam9rl.h> +#include <asm/arch/at91_pmc.h> +#include <asm/arch/gpio.h> +#include <asm/arch/io.h> + +#define	RED_LED		AT91_PIN_PD14	/* this is the power led */ +#define	GREEN_LED	AT91_PIN_PD15	/* this is the user1 led */ +#define	YELLOW_LED	AT91_PIN_PD16	/* this is the user2 led */ + +void red_LED_on(void) +{ +	at91_set_gpio_value(RED_LED, 1); +} + +void red_LED_off(void) +{ +	at91_set_gpio_value(RED_LED, 0); +} + +void green_LED_on(void) +{ +	at91_set_gpio_value(GREEN_LED, 0); +} + +void green_LED_off(void) +{ +	at91_set_gpio_value(GREEN_LED, 1); +} + +void yellow_LED_on(void) +{ +	at91_set_gpio_value(YELLOW_LED, 0); +} + +void yellow_LED_off(void) +{ +	at91_set_gpio_value(YELLOW_LED, 1); +} + +void coloured_LED_init(void) +{ +	/* Enable clock */ +	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9RL_ID_PIOD); + +	at91_set_gpio_output(RED_LED, 1); +	at91_set_gpio_output(GREEN_LED, 1); +	at91_set_gpio_output(YELLOW_LED, 1); + +	at91_set_gpio_value(RED_LED, 0); +	at91_set_gpio_value(GREEN_LED, 1); +	at91_set_gpio_value(YELLOW_LED, 1); +} diff --git a/board/atmel/at91sam9rlek/nand.c b/board/atmel/at91sam9rlek/nand.c new file mode 100644 index 000000000..5af1a3117 --- /dev/null +++ b/board/atmel/at91sam9rlek/nand.c @@ -0,0 +1,79 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.com> + * + * (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <asm/arch/at91sam9rl.h> +#include <asm/arch/gpio.h> +#include <asm/arch/at91_pio.h> + +#include <nand.h> + +/* + *	hardware specific access to control-lines + */ +#define	MASK_ALE	(1 << 21)	/* our ALE is AD21 */ +#define	MASK_CLE	(1 << 22)	/* our CLE is AD22 */ + +static void at91sam9rlek_nand_hwcontrol(struct mtd_info *mtd, int cmd) +{ +	struct nand_chip *this = mtd->priv; +	ulong IO_ADDR_W = (ulong) this->IO_ADDR_W; + +	IO_ADDR_W &= ~(MASK_ALE|MASK_CLE); +	switch (cmd) { +	case NAND_CTL_SETCLE: +		IO_ADDR_W |= MASK_CLE; +		break; +	case NAND_CTL_SETALE: +		IO_ADDR_W |= MASK_ALE; +		break; +	case NAND_CTL_CLRNCE: +		at91_set_gpio_value(AT91_PIN_PB6, 1); +		break; +	case NAND_CTL_SETNCE: +		at91_set_gpio_value(AT91_PIN_PB6, 0); +		break; +	} +	this->IO_ADDR_W = (void *) IO_ADDR_W; +} + +static int at91sam9rlek_nand_ready(struct mtd_info *mtd) +{ +	return at91_get_gpio_value(AT91_PIN_PD17); +} + +int board_nand_init(struct nand_chip *nand) +{ +	nand->eccmode = NAND_ECC_SOFT; +#ifdef CFG_NAND_DBW_16 +	nand->options = NAND_BUSWIDTH_16; +#endif +	nand->hwcontrol = at91sam9rlek_nand_hwcontrol; +	nand->dev_ready = at91sam9rlek_nand_ready; +	nand->chip_delay = 20; + +	return 0; +} diff --git a/board/atmel/at91sam9rlek/partition.c b/board/atmel/at91sam9rlek/partition.c new file mode 100644 index 000000000..eb1a724ab --- /dev/null +++ b/board/atmel/at91sam9rlek/partition.c @@ -0,0 +1,39 @@ +/* + * (C) Copyright 2008 + * Ulf Samuelsson <ulf@atmel.com> + * + * 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 <config.h> +#include <asm/hardware.h> +#include <dataflash.h> + +AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS]; + +struct dataflash_addr cs[CFG_MAX_DATAFLASH_BANKS] = { +	{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0},	/* Logical adress, CS */ +}; + +/*define the area offsets*/ +dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { +	{0x00000000, 0x000041FF, FLAG_PROTECT_SET,   0, "Bootstrap"}, +	{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, +	{0x00008400, 0x00041FFF, FLAG_PROTECT_SET,   0, "U-Boot"}, +	{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0,	"Kernel"}, +	{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0,	"FS"}, +}; diff --git a/board/atmel/atngw100/atngw100.c b/board/atmel/atngw100/atngw100.c index 1ccbe2c18..c649855d6 100644 --- a/board/atmel/atngw100/atngw100.c +++ b/board/atmel/atngw100/atngw100.c @@ -25,12 +25,12 @@  #include <asm/sdram.h>  #include <asm/arch/clk.h>  #include <asm/arch/gpio.h> -#include <asm/arch/hmatrix2.h> +#include <asm/arch/hmatrix.h>  DECLARE_GLOBAL_DATA_PTR; -static const struct sdram_info sdram = { -	.phys_addr	= CFG_SDRAM_BASE, +static const struct sdram_config sdram_config = { +	.data_bits	= SDRAM_DATA_16BIT,  	.row_bits	= 13,  	.col_bits	= 9,  	.bank_bits	= 2, @@ -47,8 +47,8 @@ static const struct sdram_info sdram = {  int board_early_init_f(void)  { -	/* Set the SDRAM_ENABLE bit in the HEBI SFR */ -	hmatrix2_writel(SFR4, 1 << 1); +	/* Enable SDRAM in the EBI mux */ +	hmatrix_slave_write(EBI, SFR, HMATRIX_BIT(EBI_SDRAM_ENABLE));  	gpio_enable_ebi();  	gpio_enable_usart1(); @@ -66,7 +66,22 @@ int board_early_init_f(void)  long int initdram(int board_type)  { -	return sdram_init(&sdram); +	unsigned long expected_size; +	unsigned long actual_size; +	void *sdram_base; + +	sdram_base = map_physmem(EBI_SDRAM_BASE, EBI_SDRAM_SIZE, MAP_NOCACHE); + +	expected_size = sdram_init(sdram_base, &sdram_config); +	actual_size = get_ram_size(sdram_base, expected_size); + +	unmap_physmem(sdram_base, EBI_SDRAM_SIZE); + +	if (expected_size != actual_size) +		printf("Warning: Only %u of %u MiB SDRAM is working\n", +				actual_size >> 20, expected_size >> 20); + +	return actual_size;  }  void board_init_info(void) diff --git a/board/atmel/atngw100/u-boot.lds b/board/atmel/atngw100/u-boot.lds index 34e347aec..e736adf0f 100644 --- a/board/atmel/atngw100/u-boot.lds +++ b/board/atmel/atngw100/u-boot.lds @@ -29,17 +29,10 @@ SECTIONS  	. = 0;  	_text = .;  	.text : { +		*(.exception.text)  		*(.text)  		*(.text.*)  	} - -	. = ALIGN(32); -	__flashprog_start = .; -	.flashprog : { -		*(.flashprog) -	} -	. = ALIGN(32); -	__flashprog_end = .;  	_etext = .;  	.rodata : { diff --git a/board/atmel/atstk1000/atstk1000.c b/board/atmel/atstk1000/atstk1000.c index 28f64c4a6..33bdba6f5 100644 --- a/board/atmel/atstk1000/atstk1000.c +++ b/board/atmel/atstk1000/atstk1000.c @@ -25,13 +25,39 @@  #include <asm/sdram.h>  #include <asm/arch/clk.h>  #include <asm/arch/gpio.h> -#include <asm/arch/hmatrix2.h> +#include <asm/arch/hmatrix.h>  DECLARE_GLOBAL_DATA_PTR; -static const struct sdram_info sdram = { -	.phys_addr	= CFG_SDRAM_BASE, +static const struct sdram_config sdram_config = { +#if defined(CONFIG_ATSTK1006) +	/* Dual MT48LC16M16A2-7E (64 MB) on daughterboard */ +	.data_bits	= SDRAM_DATA_32BIT, +	.row_bits	= 13, +	.col_bits	= 9, +	.bank_bits	= 2, +	.cas		= 2, +	.twr		= 2, +	.trc		= 7, +	.trp		= 2, +	.trcd		= 2, +	.tras		= 4, +	.txsr		= 7, +	/* 7.81 us */ +	.refresh_period	= (781 * (SDRAMC_BUS_HZ / 1000)) / 100000, +#else +	/* MT48LC2M32B2P-5 (8 MB) on motherboard */ +#ifdef CONFIG_ATSTK1004 +	.data_bits	= SDRAM_DATA_16BIT, +#else +	.data_bits	= SDRAM_DATA_32BIT, +#endif +#ifdef CONFIG_ATSTK1000_16MB_SDRAM +	/* MT48LC4M32B2P-6 (16 MB) on mod'ed motherboard */ +	.row_bits	= 12, +#else  	.row_bits	= 11, +#endif  	.col_bits	= 8,  	.bank_bits	= 2,  	.cas		= 3, @@ -43,12 +69,13 @@ static const struct sdram_info sdram = {  	.txsr		= 5,  	/* 15.6 us */  	.refresh_period	= (156 * (SDRAMC_BUS_HZ / 1000)) / 10000, +#endif  };  int board_early_init_f(void)  { -	/* Set the SDRAM_ENABLE bit in the HEBI SFR */ -	hmatrix2_writel(SFR4, 1 << 1); +	/* Enable SDRAM in the EBI mux */ +	hmatrix_slave_write(EBI, SFR, HMATRIX_BIT(EBI_SDRAM_ENABLE));  	gpio_enable_ebi();  	gpio_enable_usart1(); @@ -65,7 +92,22 @@ int board_early_init_f(void)  long int initdram(int board_type)  { -	return sdram_init(&sdram); +	unsigned long expected_size; +	unsigned long actual_size; +	void *sdram_base; + +	sdram_base = map_physmem(EBI_SDRAM_BASE, EBI_SDRAM_SIZE, MAP_NOCACHE); + +	expected_size = sdram_init(sdram_base, &sdram_config); +	actual_size = get_ram_size(sdram_base, expected_size); + +	unmap_physmem(sdram_base, EBI_SDRAM_SIZE); + +	if (expected_size != actual_size) +		printf("Warning: Only %u of %u MiB SDRAM is working\n", +				actual_size >> 20, expected_size >> 20); + +	return actual_size;  }  void board_init_info(void) diff --git a/board/atmel/atstk1000/flash.c b/board/atmel/atstk1000/flash.c index 40478258e..12537f314 100644 --- a/board/atmel/atstk1000/flash.c +++ b/board/atmel/atstk1000/flash.c @@ -30,7 +30,7 @@ DECLARE_GLOBAL_DATA_PTR;  flash_info_t flash_info[1]; -static void __flashprog flash_identify(uint16_t *flash, flash_info_t *info) +static void flash_identify(uint16_t *flash, flash_info_t *info)  {  	unsigned long flags; @@ -76,7 +76,7 @@ void flash_print_info(flash_info_t *info)  	       info->size >> 10, info->sector_count);  } -int __flashprog flash_erase(flash_info_t *info, int s_first, int s_last) +int flash_erase(flash_info_t *info, int s_first, int s_last)  {  	unsigned long flags;  	unsigned long start_time; @@ -154,7 +154,7 @@ int __flashprog flash_erase(flash_info_t *info, int s_first, int s_last)  	return ERR_OK;  } -int __flashprog write_buff(flash_info_t *info, uchar *src, +int write_buff(flash_info_t *info, uchar *src,  			   ulong addr, ulong count)  {  	unsigned long flags; diff --git a/board/atmel/atstk1000/u-boot.lds b/board/atmel/atstk1000/u-boot.lds index 247812e10..0d3b19c64 100644 --- a/board/atmel/atstk1000/u-boot.lds +++ b/board/atmel/atstk1000/u-boot.lds @@ -29,17 +29,10 @@ SECTIONS  	. = 0;  	_text = .;  	.text : { +		*(.exception.text)  		*(.text)  		*(.text.*)  	} - -	. = ALIGN(32); -	__flashprog_start = .; -	.flashprog : { -		*(.flashprog) -	} -	. = ALIGN(32); -	__flashprog_end = .;  	_etext = .;  	.rodata : { diff --git a/board/dbau1x00/dbau1x00.c b/board/dbau1x00/dbau1x00.c index a13eeeb12..1be72a2dd 100644 --- a/board/dbau1x00/dbau1x00.c +++ b/board/dbau1x00/dbau1x00.c @@ -52,7 +52,7 @@ int checkboard (void)  	*sys_counter = 0x100; /* Enable 32 kHz oscillator for RTC/TOY */ -	proc_id = read_32bit_cp0_register(CP0_PRID); +	proc_id = read_c0_prid();  	switch (proc_id >> 24) {  	case 0: diff --git a/board/freescale/mpc8349emds/mpc8349emds.c b/board/freescale/mpc8349emds/mpc8349emds.c index 6c825969d..e18e68e8c 100644 --- a/board/freescale/mpc8349emds/mpc8349emds.c +++ b/board/freescale/mpc8349emds/mpc8349emds.c @@ -257,25 +257,24 @@ void sdram_init(void)  #define SPI_CS_MASK	0x80000000 -void spi_eeprom_chipsel(int cs) +int spi_cs_is_valid(unsigned int bus, unsigned int cs) +{ +	return bus == 0 && cs == 0; +} + +void spi_cs_activate(struct spi_slave *slave)  {  	volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0]; -	if (cs) -		iopd->dat &= ~SPI_CS_MASK; -	else -		iopd->dat |=  SPI_CS_MASK; +	iopd->dat &= ~SPI_CS_MASK;  } -/* - * The SPI command uses this table of functions for controlling the SPI - * chip selects. - */ -spi_chipsel_type spi_chipsel[] = { -	spi_eeprom_chipsel, -}; -int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]); +void spi_cs_deactivate(struct spi_slave *slave) +{ +	volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0]; +	iopd->dat |=  SPI_CS_MASK; +}  #endif /* CONFIG_HARD_SPI */  #if defined(CONFIG_OF_BOARD_SETUP) diff --git a/board/gth2/gth2.c b/board/gth2/gth2.c index 6da80dc75..9bc4d3fe5 100644 --- a/board/gth2/gth2.c +++ b/board/gth2/gth2.c @@ -135,7 +135,7 @@ int checkboard (void)  	*sys_counter = 0x100; /* Enable 32 kHz oscillator for RTC/TOY */ -	proc_id = read_32bit_cp0_register(CP0_PRID); +	proc_id = read_c0_prid();  	switch (proc_id >> 24) {  	case 0: diff --git a/board/pb1x00/pb1x00.c b/board/pb1x00/pb1x00.c index 536c9544f..82b723520 100644 --- a/board/pb1x00/pb1x00.c +++ b/board/pb1x00/pb1x00.c @@ -51,7 +51,7 @@ int checkboard (void)  	*sys_counter = 0x100; /* Enable 32 kHz oscillator for RTC/TOY */ -	proc_id = read_32bit_cp0_register(CP0_PRID); +	proc_id = read_c0_prid();  	switch (proc_id >> 24) {  	case 0: diff --git a/board/qemu-mips/qemu-mips.c b/board/qemu-mips/qemu-mips.c index 68690743d..6e6eab277 100644 --- a/board/qemu-mips/qemu-mips.c +++ b/board/qemu-mips/qemu-mips.c @@ -38,7 +38,7 @@ int checkboard(void)  	u32 proc_id;  	u32 config1; -	proc_id = read_32bit_cp0_register(CP0_PRID); +	proc_id = read_c0_prid();  	printf("Board: Qemu -M mips CPU: ");  	switch (proc_id) {  	case 0x00018000: @@ -51,7 +51,7 @@ int checkboard(void)  		printf("4KEc");  		break;  	case 0x00019300: -		config1 = read_mips32_cp0_config1(); +		config1 = read_c0_config1();  		if (config1 & 1)  			printf("24Kf");  		else @@ -64,7 +64,7 @@ int checkboard(void)  		printf("R4000");  		break;  	case 0x00018100: -		config1 = read_mips32_cp0_config1(); +		config1 = read_c0_config1();  		if (config1 & 1)  			printf("5Kf");  		else diff --git a/board/quad100hd/Makefile b/board/quad100hd/Makefile new file mode 100644 index 000000000..252ad5a45 --- /dev/null +++ b/board/quad100hd/Makefile @@ -0,0 +1,51 @@ +# +# (C) Copyright 2007 +# Stefan Roese, DENX Software Engineering, sr@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	= $(BOARD).o nand.o +SOBJS   = + +SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) +SOBJS	:= $(addprefix $(obj),$(SOBJS)) + +$(LIB):	$(OBJS) $(SOBJS) +	$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) + +clean: +	rm -f $(SOBJS) $(OBJS) + +distclean:	clean +	rm -f $(LIB) core *.bak .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/quad100hd/config.mk b/board/quad100hd/config.mk new file mode 100644 index 000000000..1bdf5e4fc --- /dev/null +++ b/board/quad100hd/config.mk @@ -0,0 +1,24 @@ +# +# (C) Copyright 2000 +# 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 +# + +TEXT_BASE = 0xFFFC0000 diff --git a/board/quad100hd/nand.c b/board/quad100hd/nand.c new file mode 100644 index 000000000..a36b89dd7 --- /dev/null +++ b/board/quad100hd/nand.c @@ -0,0 +1,79 @@ +/* + * (C) Copyright 2008 + * Gary Jennejohn, DENX Software Engineering GmbH, garyj@denx.de + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <config.h> +#if defined(CONFIG_CMD_NAND) +#include <asm/gpio.h> +#include <nand.h> + +/* + *	hardware specific access to control-lines + */ +static void quad100hd_hwcontrol(struct mtd_info *mtd, int cmd) +{ +	switch(cmd) { +	case NAND_CTL_SETCLE: +		gpio_write_bit(CFG_NAND_CLE, 1); +		break; +	case NAND_CTL_CLRCLE: +		gpio_write_bit(CFG_NAND_CLE, 0); +		break; + +	case NAND_CTL_SETALE: +		gpio_write_bit(CFG_NAND_ALE, 1); +		break; +	case NAND_CTL_CLRALE: +		gpio_write_bit(CFG_NAND_ALE, 0); +		break; + +	case NAND_CTL_SETNCE: +		gpio_write_bit(CFG_NAND_CE, 0); +		break; +	case NAND_CTL_CLRNCE: +		gpio_write_bit(CFG_NAND_CE, 1); +		break; +	} +} + +static int quad100hd_nand_ready(struct mtd_info *mtd) +{ +	return gpio_read_in_bit(CFG_NAND_RDY); +} + +/* + * Main initialization routine + */ +int board_nand_init(struct nand_chip *nand) +{ +	/* Set address of hardware control function */ +	nand->hwcontrol = quad100hd_hwcontrol; +	nand->dev_ready = quad100hd_nand_ready; +	nand->eccmode = NAND_ECC_SOFT; +	/* 15 us command delay time */ +	nand->chip_delay =  20; + +	/* Return happy */ +	return 0; +} +#endif /* CONFIG_CMD_NAND */ diff --git a/board/quad100hd/quad100hd.c b/board/quad100hd/quad100hd.c new file mode 100644 index 000000000..638bd6ca2 --- /dev/null +++ b/board/quad100hd/quad100hd.c @@ -0,0 +1,93 @@ +/* + * (C) Copyright 2008 + * Gary Jennejohn, DENX Software Engineering GmbH, garyj@denx.de. + * + * Based in part on board/icecube/icecube.c from PPCBoot + * (C) Copyright 2003 Intrinsyc Software + * + * 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 <malloc.h> +#include <environment.h> +#include <logbuff.h> +#include <post.h> + +#include <asm/processor.h> +#include <asm/io.h> +#include <asm/gpio.h> + +DECLARE_GLOBAL_DATA_PTR; + +int board_early_init_f(void) +{ +	/* taken from PPCBoot */ +	mtdcr(uicsr, 0xFFFFFFFF);	/* clear all ints */ +	mtdcr(uicer, 0x00000000);	/* disable all ints */ +	mtdcr(uiccr, 0x00000000); +	mtdcr(uicpr, 0xFFFF7FFE);	/* set int polarities */ +	mtdcr(uictr, 0x00000000);	/* set int trigger levels */ +	mtdcr(uicsr, 0xFFFFFFFF);	/* clear all ints */ +	mtdcr(uicvcr, 0x00000001);	/* set vect base=0,INT0 highest priority */ + +	mtdcr(CPC0_SRR, 0x00040000);   /* Hold PCI bridge in reset */ + +	return 0; +} + +/* + * Check Board Identity: + */ +int checkboard(void) +{ +	char *s = getenv("serial#"); +#ifdef DISPLAY_BOARD_INFO +	sys_info_t sysinfo; +#endif + +	puts("Board: Quad100hd"); + +	if (s != NULL) { +		puts(", serial# "); +		puts(s); +	} +	putc('\n'); + +#ifdef DISPLAY_BOARD_INFO +	/* taken from ppcboot */ +	get_sys_info(&sysinfo); + +	printf("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz); +	printf("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000); +	printf("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000); +	printf("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000); +	printf("\tEPB: %lu MHz\n", sysinfo.freqPLB / (sysinfo.pllExtBusDiv * +		1000000)); +	printf("\tPCI: %lu MHz\n", sysinfo.freqPCI / 1000000); +#endif + +	return 0; +} + +long int initdram(int board_type) +{ +	return CFG_SDRAM_SIZE; +} diff --git a/board/quad100hd/u-boot.lds b/board/quad100hd/u-boot.lds new file mode 100644 index 000000000..195d91b71 --- /dev/null +++ b/board/quad100hd/u-boot.lds @@ -0,0 +1,133 @@ +/* + * (C) Copyright 2000 + * 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 + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  .resetvec 0xFFFFFFFC : +  { +    *(.resetvec) +  } = 0xffff + +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/ppc4xx/start.o	(.text) + +    *(.text) +    *(.fixup) +    *(.got1) +  } +  _etext = .; +  PROVIDE (etext = .); +  .rodata    : +  { +    *(.rodata) +    *(.rodata1) +    *(.rodata.str1.4) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x00FF) & 0xFFFFFF00; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; +  __fixup_entries = (. - _FIXUP_TABLE_)>>2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  . = .; +  __u_boot_cmd_start = .; +  .u_boot_cmd : { *(.u_boot_cmd) } +  __u_boot_cmd_end = .; + +  . = .; +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(256); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(256); +  __init_end = .; + +  __bss_start = .; +  .bss (NOLOAD)       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} diff --git a/board/sacsng/sacsng.c b/board/sacsng/sacsng.c index 25209e054..e85a0fc4d 100644 --- a/board/sacsng/sacsng.c +++ b/board/sacsng/sacsng.c @@ -842,37 +842,30 @@ void show_boot_progress (int status)  #define SPI_ADC_CS_MASK	0x00000800  #define SPI_DAC_CS_MASK	0x00001000 -void spi_adc_chipsel(int cs) +static const u32 cs_mask[] = { +    SPI_ADC_CS_MASK, +    SPI_DAC_CS_MASK, +}; + +int spi_cs_is_valid(unsigned int bus, unsigned int cs) +{ +    return bus == 0 && cs < sizeof(cs_mask) / sizeof(cs_mask[0]); +} + +void spi_cs_activate(struct spi_slave *slave)  {      volatile ioport_t *iopd = ioport_addr((immap_t *)CFG_IMMR, 3 /* port D */); -    if(cs) -	iopd->pdat &= ~SPI_ADC_CS_MASK;	/* activate the chip select */ -    else -	iopd->pdat |=  SPI_ADC_CS_MASK;	/* deactivate the chip select */ +    iopd->pdat &= ~cs_mask[slave->cs];  } -void spi_dac_chipsel(int cs) +void spi_cs_deactivate(struct spi_slave *slave)  {      volatile ioport_t *iopd = ioport_addr((immap_t *)CFG_IMMR, 3 /* port D */); -    if(cs) -	iopd->pdat &= ~SPI_DAC_CS_MASK;	/* activate the chip select */ -    else -	iopd->pdat |=  SPI_DAC_CS_MASK;	/* deactivate the chip select */ +    iopd->pdat |= cs_mask[slave->cs];  } -/* - * The SPI command uses this table of functions for controlling the SPI - * chip selects: it calls the appropriate function to control the SPI - * chip selects. - */ -spi_chipsel_type spi_chipsel[] = { -	spi_adc_chipsel, -	spi_dac_chipsel -}; -int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]); -  #endif  #endif /* CONFIG_MISC_INIT_R */ diff --git a/board/ssv/adnpesc1/adnpesc1.c b/board/ssv/adnpesc1/adnpesc1.c index 2ec3a728d..3ee8ba588 100644 --- a/board/ssv/adnpesc1/adnpesc1.c +++ b/board/ssv/adnpesc1/adnpesc1.c @@ -69,25 +69,24 @@ long int initdram (int board_type)  #define	SPI_RTC_CS_MASK	0x00000001 -void spi_rtc_chipsel(int cs) +int spi_cs_is_valid(unsigned int bus, unsigned int cs) +{ +	return bus == 0 && cs == 0; +} + +void spi_cs_activate(struct spi_slave *slave)  {  	nios_spi_t *spi = (nios_spi_t *)CFG_NIOS_SPIBASE; -	if (cs) -		spi->slaveselect = SPI_RTC_CS_MASK;	/* activate (1) */ -	else -		spi->slaveselect = 0;			/* deactivate (0) */ +	spi->slaveselect = SPI_RTC_CS_MASK;	/* activate (1) */  } -/* - * The SPI command uses this table of functions for controlling the SPI - * chip selects: it calls the appropriate function to control the SPI - * chip selects. - */ -spi_chipsel_type spi_chipsel[] = { -	spi_rtc_chipsel -}; -int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]); +void spi_cs_deactivate(struct spi_slave *slave) +{ +	nios_spi_t *spi = (nios_spi_t *)CFG_NIOS_SPIBASE; + +	spi->slaveselect = 0;			/* deactivate (0) */ +}  #endif diff --git a/common/Makefile b/common/Makefile index 967879922..b425795e9 100644 --- a/common/Makefile +++ b/common/Makefile @@ -113,6 +113,7 @@ COBJS-y += env_dataflash.o  COBJS-y += env_flash.o  COBJS-y += env_eeprom.o  COBJS-y += env_onenand.o +COBJS-y += env_sf.o  COBJS-y += env_nvram.o  COBJS-y += env_nowhere.o  COBJS-y += exports.o @@ -143,6 +144,7 @@ COBJS-y += xyzModem.o  COBJS-y += cmd_mac.o  COBJS-$(CONFIG_CMD_MFSL) += cmd_mfsl.o  COBJS-$(CONFIG_MP) += cmd_mp.o +COBJS-$(CONFIG_CMD_SF) += cmd_sf.o  COBJS	:= $(COBJS-y)  SRCS	:= $(AOBJS:.o=.S) $(COBJS:.o=.c) diff --git a/common/cmd_df.c b/common/cmd_df.c new file mode 100644 index 000000000..5f650442c --- /dev/null +++ b/common/cmd_df.c @@ -0,0 +1,37 @@ +/* + * Command for accessing DataFlash. + * + * Copyright (C) 2008 Atmel Corporation + */ +#include <common.h> +#include <df.h> + +static int do_df(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ +	const char *cmd; + +	/* need at least two arguments */ +	if (argc < 2) +		goto usage; + +	cmd = argv[1]; + +	if (strcmp(cmd, "init") == 0) { +		df_init(0, 0, 1000000); +		return 0; +	} + +	if (strcmp(cmd, "info") == 0) { +		df_show_info(); +		return 0; +	} + +usage: +	printf("Usage:\n%s\n", cmdtp->usage); +	return 1; +} + +U_BOOT_CMD( +	sf,	2,	1,	do_serial_flash, +	"sf	- Serial flash sub-system\n", +	"probe [bus:]cs		- init flash device on given SPI bus and CS\n") diff --git a/common/cmd_log.c b/common/cmd_log.c index c6e72ac3c..fdcc57571 100644 --- a/common/cmd_log.c +++ b/common/cmd_log.c @@ -66,6 +66,12 @@ static logbuff_t *log;  #endif  static char *lbuf; +unsigned long __logbuffer_base(void) +{ +	return CFG_SDRAM_BASE + gd->bd->bi_memsize - LOGBUFF_LEN; +} +unsigned long logbuffer_base (void) __attribute__((weak, alias("__logbuffer_base"))); +  void logbuff_init_ptrs (void)  {  	unsigned long tag, post_word; @@ -75,7 +81,7 @@ void logbuff_init_ptrs (void)  	log = (logbuff_t *)CONFIG_ALT_LH_ADDR;  	lbuf = (char *)CONFIG_ALT_LB_ADDR;  #else -	log = (logbuff_t *)(gd->bd->bi_memsize-LOGBUFF_LEN) - 1; +	log = (logbuff_t *)(logbuffer_base ()) - 1;  	lbuf = (char *)log->buf;  #endif diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 37eb41b20..37198d21e 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -37,8 +37,6 @@ int find_dev_and_part(const char *id, struct mtd_device **dev,  		u8 *part_num, struct part_info **part);  #endif -extern nand_info_t nand_info[];       /* info for NAND chips */ -  static int nand_dump_oob(nand_info_t *nand, ulong off)  {  	return 0; diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 9c5d1fcb9..49f134a92 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -58,8 +58,9 @@ DECLARE_GLOBAL_DATA_PTR;      !defined(CFG_ENV_IS_IN_DATAFLASH)	&& \      !defined(CFG_ENV_IS_IN_NAND)	&& \      !defined(CFG_ENV_IS_IN_ONENAND)	&& \ +    !defined(CFG_ENV_IS_IN_SPI_FLASH)	&& \      !defined(CFG_ENV_IS_NOWHERE) -# error Define one of CFG_ENV_IS_IN_{NVRAM|EEPROM|FLASH|DATAFLASH|ONENAND|NOWHERE} +# error Define one of CFG_ENV_IS_IN_{NVRAM|EEPROM|FLASH|DATAFLASH|ONENAND|SPI_FLASH|NOWHERE}  #endif  #define XMK_STR(x)	#x diff --git a/common/cmd_sf.c b/common/cmd_sf.c new file mode 100644 index 000000000..8c0a7514d --- /dev/null +++ b/common/cmd_sf.c @@ -0,0 +1,191 @@ +/* + * Command for accessing SPI flash. + * + * Copyright (C) 2008 Atmel Corporation + */ +#include <common.h> +#include <spi_flash.h> + +#include <asm/io.h> + +#ifndef CONFIG_SF_DEFAULT_SPEED +# define CONFIG_SF_DEFAULT_SPEED	1000000 +#endif +#ifndef CONFIG_SF_DEFAULT_MODE +# define CONFIG_SF_DEFAULT_MODE		SPI_MODE_3 +#endif + +static struct spi_flash *flash; + +static int do_spi_flash_probe(int argc, char *argv[]) +{ +	unsigned int bus = 0; +	unsigned int cs; +	unsigned int speed = CONFIG_SF_DEFAULT_SPEED; +	unsigned int mode = CONFIG_SF_DEFAULT_MODE; +	char *endp; +	struct spi_flash *new; + +	if (argc < 2) +		goto usage; + +	cs = simple_strtoul(argv[1], &endp, 0); +	if (*argv[1] == 0 || (*endp != 0 && *endp != ':')) +		goto usage; +	if (*endp == ':') { +		if (endp[1] == 0) +			goto usage; + +		bus = cs; +		cs = simple_strtoul(endp + 1, &endp, 0); +		if (*endp != 0) +			goto usage; +	} + +	if (argc >= 3) { +		speed = simple_strtoul(argv[2], &endp, 0); +		if (*argv[2] == 0 || *endp != 0) +			goto usage; +	} +	if (argc >= 4) { +		mode = simple_strtoul(argv[3], &endp, 0); +		if (*argv[3] == 0 || *endp != 0) +			goto usage; +	} + +	new = spi_flash_probe(bus, cs, speed, mode); +	if (!new) { +		printf("Failed to initialize SPI flash at %u:%u\n", bus, cs); +		return 1; +	} + +	if (flash) +		spi_flash_free(flash); +	flash = new; + +	printf("%u KiB %s at %u:%u is now current device\n", +			flash->size >> 10, flash->name, bus, cs); + +	return 0; + +usage: +	puts("Usage: sf probe [bus:]cs [hz] [mode]\n"); +	return 1; +} + +static int do_spi_flash_read_write(int argc, char *argv[]) +{ +	unsigned long addr; +	unsigned long offset; +	unsigned long len; +	void *buf; +	char *endp; +	int ret; + +	if (argc < 4) +		goto usage; + +	addr = simple_strtoul(argv[1], &endp, 16); +	if (*argv[1] == 0 || *endp != 0) +		goto usage; +	offset = simple_strtoul(argv[2], &endp, 16); +	if (*argv[2] == 0 || *endp != 0) +		goto usage; +	len = simple_strtoul(argv[3], &endp, 16); +	if (*argv[3] == 0 || *endp != 0) +		goto usage; + +	buf = map_physmem(addr, len, MAP_WRBACK); +	if (!buf) { +		puts("Failed to map physical memory\n"); +		return 1; +	} + +	if (strcmp(argv[0], "read") == 0) +		ret = spi_flash_read(flash, offset, len, buf); +	else +		ret = spi_flash_write(flash, offset, len, buf); + +	unmap_physmem(buf, len); + +	if (ret) { +		printf("SPI flash %s failed\n", argv[0]); +		return 1; +	} + +	return 0; + +usage: +	printf("Usage: sf %s addr offset len\n", argv[0]); +	return 1; +} + +static int do_spi_flash_erase(int argc, char *argv[]) +{ +	unsigned long offset; +	unsigned long len; +	char *endp; +	int ret; + +	if (argc < 3) +		goto usage; + +	offset = simple_strtoul(argv[1], &endp, 16); +	if (*argv[1] == 0 || *endp != 0) +		goto usage; +	len = simple_strtoul(argv[2], &endp, 16); +	if (*argv[2] == 0 || *endp != 0) +		goto usage; + +	ret = spi_flash_erase(flash, offset, len); +	if (ret) { +		printf("SPI flash %s failed\n", argv[0]); +		return 1; +	} + +	return 0; + +usage: +	puts("Usage: sf erase offset len\n"); +	return 1; +} + +static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ +	const char *cmd; + +	/* need at least two arguments */ +	if (argc < 2) +		goto usage; + +	cmd = argv[1]; + +	if (strcmp(cmd, "probe") == 0) +		return do_spi_flash_probe(argc - 1, argv + 1); + +	/* The remaining commands require a selected device */ +	if (!flash) { +		puts("No SPI flash selected. Please run `sf probe'\n"); +		return 1; +	} + +	if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0) +		return do_spi_flash_read_write(argc - 1, argv + 1); +	if (strcmp(cmd, "erase") == 0) +		return do_spi_flash_erase(argc - 1, argv + 1); + +usage: +	printf("Usage:\n%s\n", cmdtp->usage); +	return 1; +} + +U_BOOT_CMD( +	sf,	5,	1,	do_spi_flash, +	"sf	- SPI flash sub-system\n", +	"probe [bus:]cs [hz] [mode]	- init flash device on given SPI bus\n" +	"				  and chip select\n" +	"sf read addr offset len 	- read `len' bytes starting at\n" +	"				  `offset' to memory at `addr'\n" +	"sf write addr offset len	- write `len' bytes from memory\n" +	"				  at `addr' to flash at `offset'\n" +	"sf erase offset len		- erase `len' bytes from `offset'\n"); diff --git a/common/cmd_spi.c b/common/cmd_spi.c index 760442214..40ee7e7dd 100644 --- a/common/cmd_spi.c +++ b/common/cmd_spi.c @@ -37,20 +37,20 @@  #   define MAX_SPI_BYTES 32	/* Maximum number of bytes we can handle */  #endif -/* - * External table of chip select functions (see the appropriate board - * support for the actual definition of the table). - */ -extern spi_chipsel_type spi_chipsel[]; -extern int spi_chipsel_cnt; +#ifndef CONFIG_DEFAULT_SPI_BUS +#   define CONFIG_DEFAULT_SPI_BUS	0 +#endif +#ifndef CONFIG_DEFAULT_SPI_MODE +#   define CONFIG_DEFAULT_SPI_MODE	SPI_MODE_0 +#endif  /*   * Values from last command.   */ -static int   device; -static int   bitlen; -static uchar dout[MAX_SPI_BYTES]; -static uchar din[MAX_SPI_BYTES]; +static unsigned int	device; +static int   		bitlen; +static uchar 		dout[MAX_SPI_BYTES]; +static uchar 		din[MAX_SPI_BYTES];  /*   * SPI read/write @@ -65,6 +65,7 @@ static uchar din[MAX_SPI_BYTES];  int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  { +	struct spi_slave *slave;  	char  *cp = 0;  	uchar tmp;  	int   j; @@ -101,19 +102,24 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		}  	} -	if ((device < 0) || (device >=  spi_chipsel_cnt)) { -		printf("Invalid device %d, giving up.\n", device); -		return 1; -	}  	if ((bitlen < 0) || (bitlen >  (MAX_SPI_BYTES * 8))) {  		printf("Invalid bitlen %d, giving up.\n", bitlen);  		return 1;  	} -	debug ("spi_chipsel[%d] = %08X\n", -		device, (uint)spi_chipsel[device]); +	/* FIXME: Make these parameters run-time configurable */ +	slave = spi_setup_slave(CONFIG_DEFAULT_SPI_BUS, device, 1000000, +			CONFIG_DEFAULT_SPI_MODE); +	if (!slave) { +		printf("Invalid device %d, giving up.\n", device); +		return 1; +	} + +	debug ("spi chipsel = %08X\n", device); -	if(spi_xfer(spi_chipsel[device], bitlen, dout, din) != 0) { +	spi_claim_bus(slave); +	if(spi_xfer(slave, bitlen, dout, din, +				SPI_XFER_BEGIN | SPI_XFER_END) != 0) {  		printf("Error with the SPI transaction.\n");  		rcode = 1;  	} else { @@ -123,6 +129,8 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		}  		printf("\n");  	} +	spi_release_bus(slave); +	spi_free_slave(slave);  	return rcode;  } diff --git a/common/dlmalloc.c b/common/dlmalloc.c index 20c206913..c51351e96 100644 --- a/common/dlmalloc.c +++ b/common/dlmalloc.c @@ -1,3 +1,5 @@ +#include <common.h> +  #if 0	/* Moved to malloc.h */  /* ---------- To make a malloc.h, start cutting here ------------ */ @@ -947,7 +949,6 @@ void malloc_stats();  #endif	/* 0 */  #endif	/* 0 */			/* Moved to malloc.h */ -#include <common.h>  DECLARE_GLOBAL_DATA_PTR; diff --git a/common/env_common.c b/common/env_common.c index a49481244..e6df9a588 100644 --- a/common/env_common.c +++ b/common/env_common.c @@ -134,7 +134,8 @@ uchar default_environment[] = {  	"\0"  }; -#if defined(CFG_ENV_IS_IN_NAND)		/* Environment is in Nand Flash */ +#if defined(CFG_ENV_IS_IN_NAND)		/* Environment is in Nand Flash */ \ +	|| defined(CFG_ENV_IS_IN_SPI_FLASH)  int default_environment_size = sizeof(default_environment);  #endif diff --git a/common/env_nand.c b/common/env_nand.c index 70d05ad15..3a98d2b94 100644 --- a/common/env_nand.c +++ b/common/env_nand.c @@ -57,9 +57,6 @@ int nand_legacy_rw (struct nand_chip* nand, int cmd,  	    size_t start, size_t len,  	    size_t * retlen, u_char * buf); -/* info for NAND chips, defined in drivers/mtd/nand/nand.c */ -extern nand_info_t nand_info[]; -  /* references to names in env_common.c */  extern uchar default_environment[];  extern int default_environment_size; diff --git a/common/env_sf.c b/common/env_sf.c new file mode 100644 index 000000000..d641a9a73 --- /dev/null +++ b/common/env_sf.c @@ -0,0 +1,131 @@ +/* + * (C) Copyright 2000-2002 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Andreas Heppel <aheppel@sysgo.de> + * + * (C) Copyright 2008 Atmel Corporation + * + * 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> + +#ifdef CFG_ENV_IS_IN_SPI_FLASH + +#include <environment.h> +#include <spi_flash.h> + +#ifndef CFG_ENV_SPI_BUS +# define CFG_ENV_SPI_BUS	0 +#endif +#ifndef CFG_ENV_SPI_CS +# define CFG_ENV_SPI_CS		0 +#endif +#ifndef CFG_ENV_SPI_MAX_HZ +# define CFG_ENV_SPI_MAX_HZ	1000000 +#endif +#ifndef CFG_ENV_SPI_MODE +# define CFG_ENV_SPI_MODE	SPI_MODE_3 +#endif + +DECLARE_GLOBAL_DATA_PTR; + +/* references to names in env_common.c */ +extern uchar default_environment[]; +extern int default_environment_size; + +char * env_name_spec = "SPI Flash"; +env_t *env_ptr; + +static struct spi_flash *env_flash; + +uchar env_get_char_spec(int index) +{ +	return *((uchar *)(gd->env_addr + index)); +} + +int saveenv(void) +{ +	if (!env_flash) { +		puts("Environment SPI flash not initialized\n"); +		return 1; +	} + +	puts("Erasing SPI flash..."); +	if (spi_flash_erase(env_flash, CFG_ENV_OFFSET, CFG_ENV_SIZE)) +		return 1; + +	puts("Writing to SPI flash..."); +	if (spi_flash_write(env_flash, CFG_ENV_OFFSET, CFG_ENV_SIZE, env_ptr)) +		return 1; + +	puts("done\n"); +	return 0; +} + +void env_relocate_spec(void) +{ +	int ret; + +	env_flash = spi_flash_probe(CFG_ENV_SPI_BUS, CFG_ENV_SPI_CS, +			CFG_ENV_SPI_MAX_HZ, CFG_ENV_SPI_MODE); +	if (!env_flash) +		goto err_probe; + +	ret = spi_flash_read(env_flash, CFG_ENV_OFFSET, CFG_ENV_SIZE, env_ptr); +	if (ret) +		goto err_read; + +	if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc) +		goto err_crc; + +	gd->env_valid = 1; + +	return; + +err_read: +	spi_flash_free(env_flash); +	env_flash = NULL; +err_probe: +err_crc: +	puts("*** Warning - bad CRC, using default environment\n\n"); + +	if (default_environment_size > CFG_ENV_SIZE) { +		gd->env_valid = 0; +		puts("*** Error - default environment is too large\n\n"); +		return; +	} + +	memset(env_ptr, 0, sizeof(env_t)); +	memcpy(env_ptr->data, default_environment, default_environment_size); +	env_ptr->crc = crc32(0, env_ptr->data, ENV_SIZE); +	gd->env_valid = 1; +} + +int env_init(void) +{ +	/* SPI flash isn't usable before relocation */ +	gd->env_addr = (ulong)&default_environment[0]; +	gd->env_valid = 1; + +	return 0; +} + +#endif /* CFG_ENV_IS_IN_SPI_FLASH */ diff --git a/common/image.c b/common/image.c index 67e594df6..918802480 100644 --- a/common/image.c +++ b/common/image.c @@ -35,6 +35,10 @@  #include <dataflash.h>  #endif +#ifdef CONFIG_LOGBUFFER +#include <logbuff.h> +#endif +  #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)  #include <rtc.h>  #endif @@ -1013,6 +1017,12 @@ int boot_ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len,  		initrd_high = ~0;  	} + +#ifdef CONFIG_LOGBUFFER +	/* Prevent initrd from overwriting logbuffer */ +	lmb_reserve(lmb, logbuffer_base() - LOGBUFF_OVERHEAD, LOGBUFF_RESERVE); +#endif +  	debug ("## initrd_high = 0x%08lx, copy_to_ram = %d\n",  			initrd_high, initrd_copy_to_ram); diff --git a/common/lcd.c b/common/lcd.c index 914dc2ef7..ebf377aa8 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -50,6 +50,11 @@  #include <lcdvideo.h>  #endif +#if defined(CONFIG_ATMEL_LCD) +#include <atmel_lcdc.h> +#include <nand.h> +#endif +  #ifdef CONFIG_LCD  /************************************************************************/ @@ -474,14 +479,22 @@ ulong lcd_setmem (ulong addr)  static void lcd_setfgcolor (int color)  { +#ifdef CONFIG_ATMEL_LCD +	lcd_color_fg = color; +#else  	lcd_color_fg = color & 0x0F; +#endif  }  /*----------------------------------------------------------------------*/  static void lcd_setbgcolor (int color)  { +#ifdef CONFIG_ATMEL_LCD +	lcd_color_bg = color; +#else  	lcd_color_bg = color & 0x0F; +#endif  }  /*----------------------------------------------------------------------*/ @@ -508,7 +521,11 @@ static int lcd_getbgcolor (void)  #ifdef CONFIG_LCD_LOGO  void bitmap_plot (int x, int y)  { +#ifdef CONFIG_ATMEL_LCD +	uint *cmap; +#else  	ushort *cmap; +#endif  	ushort i, j;  	uchar *bmap;  	uchar *fb; @@ -533,6 +550,8 @@ void bitmap_plot (int x, int y)  		cmap = (ushort *)fbi->palette;  #elif defined(CONFIG_MPC823)  		cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]); +#elif defined(CONFIG_ATMEL_LCD) +		cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0));  #endif  		WATCHDOG_RESET(); @@ -540,11 +559,26 @@ void bitmap_plot (int x, int y)  		/* Set color map */  		for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) {  			ushort colreg = bmp_logo_palette[i]; +#ifdef CONFIG_ATMEL_LCD +			uint lut_entry; +#ifdef CONFIG_ATMEL_LCD_BGR555 +			lut_entry = ((colreg & 0x000F) << 11) | +				    ((colreg & 0x00F0) <<  2) | +				    ((colreg & 0x0F00) >>  7); +#else /* CONFIG_ATMEL_LCD_RGB565 */ +			lut_entry = ((colreg & 0x000F) << 1) | +				    ((colreg & 0x00F0) << 3) | +				    ((colreg & 0x0F00) << 4); +#endif +			*(cmap + BMP_LOGO_OFFSET) = lut_entry; +			cmap++; +#else /* !CONFIG_ATMEL_LCD */  #ifdef  CFG_INVERT_COLORS  			*cmap++ = 0xffff - colreg;  #else  			*cmap++ = colreg;  #endif +#endif /* CONFIG_ATMEL_LCD */  		}  		WATCHDOG_RESET(); @@ -578,7 +612,9 @@ void bitmap_plot (int x, int y)   */  int lcd_display_bitmap(ulong bmp_image, int x, int y)  { -#if !defined(CONFIG_MCC200) +#ifdef CONFIG_ATMEL_LCD +	uint *cmap; +#elif !defined(CONFIG_MCC200)  	ushort *cmap;  #endif  	ushort i, j; @@ -633,6 +669,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)  		cmap = (ushort *)fbi->palette;  #elif defined(CONFIG_MPC823)  		cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]); +#elif defined(CONFIG_ATMEL_LCD) +		cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0));  #else  # error "Don't know location of color map"  #endif @@ -708,6 +746,10 @@ static void *lcd_logo (void)  #ifdef CONFIG_LCD_INFO  	char info[80];  	char temp[32]; +#ifdef CONFIG_ATMEL_LCD +	int i; +	ulong dram_size, nand_size; +#endif  #endif /* CONFIG_LCD_INFO */  #ifdef CONFIG_SPLASH_SCREEN @@ -765,6 +807,40 @@ static void *lcd_logo (void)  # endif /* CONFIG_LCD_INFO */  #endif /* CONFIG_MPC823 */ +#ifdef CONFIG_ATMEL_LCD +# ifdef CONFIG_LCD_INFO +	sprintf (info, "%s", U_BOOT_VERSION); +	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y, (uchar *)info, strlen(info)); + +	sprintf (info, "(C) 2008 ATMEL Corp"); +	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT, +					(uchar *)info, strlen(info)); + +	sprintf (info, "at91support@atmel.com"); +	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 2, +					(uchar *)info, strlen(info)); + +	sprintf (info, "%s CPU at %s MHz", +		AT91_CPU_NAME, +		strmhz(temp, AT91_MAIN_CLOCK)); +	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 3, +					(uchar *)info, strlen(info)); + +	dram_size = 0; +	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) +		dram_size += gd->bd->bi_dram[i].size; +	nand_size = 0; +	for (i = 0; i < CFG_MAX_NAND_DEVICE; i++) +		nand_size += nand_info[i].size; +	sprintf (info, "  %ld MB SDRAM, %ld MB NAND", +		dram_size >> 20, +		nand_size >> 20 ); +	lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 4, +					(uchar *)info, strlen(info)); +# endif /* CONFIG_LCD_INFO */ +#endif /* CONFIG_ATMEL_LCD */ + +  #if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)  	return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length));  #else diff --git a/common/main.c b/common/main.c index a17b60b3a..046da6f23 100644 --- a/common/main.c +++ b/common/main.c @@ -940,12 +940,6 @@ int readline_into_buffer (const char *const prompt, char * buffer)  	int rc;  	static int initted = 0; -	if (!initted) { -		hist_init(); -		initted = 1; -	} - -  	/*  	 * History uses a global array which is not  	 * writable until after relocation to RAM. diff --git a/common/soft_i2c.c b/common/soft_i2c.c index c5d7e205e..5ef7f303b 100644 --- a/common/soft_i2c.c +++ b/common/soft_i2c.c @@ -252,6 +252,7 @@ static uchar read_byte(int ack)  	 * Read 8 bits, MSB first.  	 */  	I2C_TRISTATE; +	I2C_SDA(1);  	data = 0;  	for(j = 0; j < 8; j++) {  		I2C_SCL(0); diff --git a/common/soft_spi.c b/common/soft_spi.c index e4250616c..c13165030 100644 --- a/common/soft_spi.c +++ b/common/soft_spi.c @@ -29,6 +29,8 @@  #if defined(CONFIG_SOFT_SPI) +#include <malloc.h> +  /*-----------------------------------------------------------------------   * Definitions   */ @@ -39,6 +41,15 @@  #define PRINTD(fmt,args...)  #endif +struct soft_spi_slave { +	struct spi_slave slave; +	unsigned int mode; +}; + +static inline struct soft_spi_slave *to_soft_spi(struct spi_slave *slave) +{ +	return container_of(slave, struct soft_spi_slave, slave); +}  /*=====================================================================*/  /*                         Public Functions                            */ @@ -56,6 +67,57 @@ void spi_init (void)  #endif  } +struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs, +		unsigned int max_hz, unsigned int mode) +{ +	struct soft_spi_slave *ss; + +	if (!spi_cs_is_valid(bus, cs)) +		return NULL; + +	ss = malloc(sizeof(struct soft_spi_slave)); +	if (!ss) +		return NULL; + +	ss->slave.bus = bus; +	ss->slave.cs = cs; +	ss->mode = mode; + +	/* TODO: Use max_hz to limit the SCK rate */ + +	return &ss->slave; +} + +void spi_free_slave(struct spi_slave *slave) +{ +	struct soft_spi_slave *ss = to_soft_spi(slave); + +	free(ss); +} + +int spi_claim_bus(struct spi_slave *slave) +{ +#ifdef CFG_IMMR +	volatile immap_t *immr = (immap_t *)CFG_IMMR; +#endif +	struct soft_spi_slave *ss = to_soft_spi(slave); + +	/* +	 * Make sure the SPI clock is in idle state as defined for +	 * this slave. +	 */ +	if (ss->mode & SPI_CPOL) +		SPI_SCL(1); +	else +		SPI_SCL(0); + +	return 0; +} + +void spi_release_bus(struct spi_slave *slave) +{ +	/* Nothing to do */ +}  /*-----------------------------------------------------------------------   * SPI transfer @@ -68,50 +130,54 @@ void spi_init (void)   * and "din" can point to the same memory location, in which case the   * input data overwrites the output data (since both are buffered by   * temporary variables, this is OK). - * - * If the chipsel() function is not NULL, it is called with a parameter - * of '1' (chip select active) at the start of the transfer and again with - * a parameter of '0' at the end of the transfer. - * - * If the chipsel() function _is_ NULL, it the responsibility of the - * caller to make the appropriate chip select active before calling - * spi_xfer() and making it inactive after spi_xfer() returns.   */ -int  spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din) +int  spi_xfer(struct spi_slave *slave, unsigned int bitlen, +		const void *dout, void *din, unsigned long flags)  {  #ifdef CFG_IMMR  	volatile immap_t *immr = (immap_t *)CFG_IMMR;  #endif -	uchar tmpdin  = 0; -	uchar tmpdout = 0; -	int   j; +	struct soft_spi_slave *ss = to_soft_spi(slave); +	uchar		tmpdin  = 0; +	uchar		tmpdout = 0; +	const u8	*txd = dout; +	u8		*rxd = din; +	int		cpol = ss->mode & SPI_CPOL; +	int		cpha = ss->mode & SPI_CPHA; +	unsigned int	j; -	PRINTD("spi_xfer: chipsel %08X dout %08X din %08X bitlen %d\n", -		(int)chipsel, *(uint *)dout, *(uint *)din, bitlen); +	PRINTD("spi_xfer: slave %u:%u dout %08X din %08X bitlen %u\n", +		slave->bus, slave->cs, *(uint *)txd, *(uint *)rxd, bitlen); -	if(chipsel != NULL) { -		(*chipsel)(1);	/* select the target chip */ -	} +	if (flags & SPI_XFER_BEGIN) +		spi_cs_activate(slave);  	for(j = 0; j < bitlen; j++) {  		/*  		 * Check if it is time to work on a new byte.  		 */  		if((j % 8) == 0) { -			tmpdout = *dout++; +			tmpdout = *txd++;  			if(j != 0) { -				*din++ = tmpdin; +				*rxd++ = tmpdin;  			}  			tmpdin  = 0;  		} -		SPI_SCL(0); + +		if (!cpha) +			SPI_SCL(!cpol);  		SPI_SDA(tmpdout & 0x80);  		SPI_DELAY; -		SPI_SCL(1); +		if (cpha) +			SPI_SCL(!cpol); +		else +			SPI_SCL(cpol); +		tmpdin	<<= 1; +		tmpdin	|= SPI_READ; +		tmpdout	<<= 1;  		SPI_DELAY; -		tmpdin  <<= 1; -		tmpdin   |= SPI_READ; -		tmpdout <<= 1; +		if (cpha) +			SPI_SCL(cpol);  	}  	/*  	 * If the number of bits isn't a multiple of 8, shift the last @@ -120,14 +186,10 @@ int  spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)  	 */  	if((bitlen % 8) != 0)  		tmpdin <<= 8 - (bitlen % 8); -	*din++ = tmpdin; - -	SPI_SCL(0);		/* SPI wants the clock left low for idle */ +	*rxd++ = tmpdin; -	if(chipsel != NULL) { -		(*chipsel)(0);	/* deselect the target chip */ - -	} +	if (flags & SPI_XFER_END) +		spi_cs_deactivate(slave);  	return(0);  } diff --git a/cpu/74xx_7xx/start.S b/cpu/74xx_7xx/start.S index b5834b91e..42b0f72ac 100644 --- a/cpu/74xx_7xx/start.S +++ b/cpu/74xx_7xx/start.S @@ -316,7 +316,7 @@ invalidate_bats:  	mtspr	IBAT1U, r0  	mtspr	IBAT2U, r0  	mtspr	IBAT3U, r0 -#ifdef CONFIG_750FX +#ifdef CONFIG_HIGH_BATS  	mtspr   IBAT4U, r0  	mtspr   IBAT5U, r0  	mtspr   IBAT6U, r0 @@ -327,7 +327,7 @@ invalidate_bats:  	mtspr	DBAT1U, r0  	mtspr	DBAT2U, r0  	mtspr	DBAT3U, r0 -#ifdef CONFIG_750FX +#ifdef CONFIG_HIGH_BATS  	mtspr   DBAT4U, r0  	mtspr   DBAT5U, r0  	mtspr   DBAT6U, r0 @@ -414,7 +414,7 @@ setup_bats:  	mtspr	DBAT3U, r3  	isync -#ifdef CONFIG_750FX +#ifdef CONFIG_HIGH_BATS  	/* IBAT 4 */  	addis   r4, r0, CFG_IBAT4L@h  	ori     r4, r4, CFG_IBAT4L@l diff --git a/cpu/arm926ejs/at91sam9/config.mk b/cpu/arm926ejs/at91sam9/config.mk index ca2cae181..83040ebe7 100644 --- a/cpu/arm926ejs/at91sam9/config.mk +++ b/cpu/arm926ejs/at91sam9/config.mk @@ -1,2 +1,3 @@  PLATFORM_CPPFLAGS += -march=armv5te  PLATFORM_CPPFLAGS += $(call cc-option,-mtune=arm926ejs,) +LDSCRIPT := $(SRCTREE)/cpu/arm926ejs/at91sam9/u-boot.lds diff --git a/board/atmel/at91cap9adk/u-boot.lds b/cpu/arm926ejs/at91sam9/u-boot.lds index 996f401f0..996f401f0 100644 --- a/board/atmel/at91cap9adk/u-boot.lds +++ b/cpu/arm926ejs/at91sam9/u-boot.lds diff --git a/cpu/arm926ejs/at91sam9/usb.c b/cpu/arm926ejs/at91sam9/usb.c index 441349df3..2a92f734d 100644 --- a/cpu/arm926ejs/at91sam9/usb.c +++ b/cpu/arm926ejs/at91sam9/usb.c @@ -33,7 +33,11 @@ int usb_cpu_init(void)  {  	/* Enable USB host clock. */  	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_UHP); +#ifdef CONFIG_AT91SAM9261 +	at91_sys_write(AT91_PMC_SCER, AT91_PMC_UHP | AT91_PMC_HCK0); +#else  	at91_sys_write(AT91_PMC_SCER, AT91_PMC_UHP); +#endif  	return 0;  } @@ -42,7 +46,11 @@ int usb_cpu_stop(void)  {  	/* Disable USB host clock. */  	at91_sys_write(AT91_PMC_PCDR, 1 << AT91_ID_UHP); +#ifdef CONFIG_AT91SAM9261 +	at91_sys_write(AT91_PMC_SCDR, AT91_PMC_UHP | AT91_PMC_HCK0); +#else  	at91_sys_write(AT91_PMC_SCDR, AT91_PMC_UHP); +#endif  	return 0;  } diff --git a/cpu/at32ap/Makefile b/cpu/at32ap/Makefile index f69b1f385..d16c58b77 100644 --- a/cpu/at32ap/Makefile +++ b/cpu/at32ap/Makefile @@ -27,13 +27,19 @@ include $(TOPDIR)/config.mk  LIB	:= $(obj)lib$(CPU).a -START	:= start.o -SOBJS	:= entry.o -COBJS	:= cpu.o hsdramc.o exception.o cache.o -COBJS	+= interrupts.o pio.o atmel_mci.o -SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) -OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS)) -START	:= $(addprefix $(obj),$(START)) +START-y			+= start.o + +COBJS-y			+= cpu.o +COBJS-y			+= hsdramc.o +COBJS-y			+= exception.o +COBJS-y			+= cache.o +COBJS-y			+= interrupts.o +COBJS-y			+= pio.o +COBJS-$(CONFIG_MMC)	+= atmel_mci.o + +SRCS	:= $(START-y:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) +OBJS	:= $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) +START	:= $(addprefix $(obj),$(START-y))  all: $(obj).depend $(START) $(LIB) diff --git a/cpu/at32ap/at32ap700x/Makefile b/cpu/at32ap/at32ap700x/Makefile index d27671211..740423563 100644 --- a/cpu/at32ap/at32ap700x/Makefile +++ b/cpu/at32ap/at32ap700x/Makefile @@ -24,7 +24,7 @@ include $(TOPDIR)/config.mk  LIB	:= $(obj)lib$(SOC).a -COBJS	:= gpio.o +COBJS	:= gpio.o clk.o  SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/cpu/at32ap/at32ap700x/clk.c b/cpu/at32ap/at32ap700x/clk.c new file mode 100644 index 000000000..b3aa03495 --- /dev/null +++ b/cpu/at32ap/at32ap700x/clk.c @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2005-2008 Atmel Corporation + * + * 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/clk.h> +#include <asm/arch/memory-map.h> + +#include "sm.h" + +void clk_init(void) +{ +	uint32_t cksel; + +	/* in case of soft resets, disable watchdog */ +	sm_writel(WDT_CTRL, SM_BF(KEY, 0x55)); +	sm_writel(WDT_CTRL, SM_BF(KEY, 0xaa)); + +#ifdef CONFIG_PLL +	/* Initialize the PLL */ +	sm_writel(PM_PLL0, (SM_BF(PLLCOUNT, CFG_PLL0_SUPPRESS_CYCLES) +			    | SM_BF(PLLMUL, CFG_PLL0_MUL - 1) +			    | SM_BF(PLLDIV, CFG_PLL0_DIV - 1) +			    | SM_BF(PLLOPT, CFG_PLL0_OPT) +			    | SM_BF(PLLOSC, 0) +			    | SM_BIT(PLLEN))); + +	/* Wait for lock */ +	while (!(sm_readl(PM_ISR) & SM_BIT(LOCK0))) ; +#endif + +	/* Set up clocks for the CPU and all peripheral buses */ +	cksel = 0; +	if (CFG_CLKDIV_CPU) +		cksel |= SM_BIT(CPUDIV) | SM_BF(CPUSEL, CFG_CLKDIV_CPU - 1); +	if (CFG_CLKDIV_HSB) +		cksel |= SM_BIT(HSBDIV) | SM_BF(HSBSEL, CFG_CLKDIV_HSB - 1); +	if (CFG_CLKDIV_PBA) +		cksel |= SM_BIT(PBADIV) | SM_BF(PBASEL, CFG_CLKDIV_PBA - 1); +	if (CFG_CLKDIV_PBB) +		cksel |= SM_BIT(PBBDIV) | SM_BF(PBBSEL, CFG_CLKDIV_PBB - 1); +	sm_writel(PM_CKSEL, cksel); + +#ifdef CONFIG_PLL +	/* Use PLL0 as main clock */ +	sm_writel(PM_MCCTRL, SM_BIT(PLLSEL)); +#endif +} diff --git a/cpu/at32ap/at32ap700x/gpio.c b/cpu/at32ap/at32ap700x/gpio.c index 859124a91..3da35d4fe 100644 --- a/cpu/at32ap/at32ap700x/gpio.c +++ b/cpu/at32ap/at32ap700x/gpio.c @@ -21,8 +21,11 @@   */  #include <common.h> +#include <asm/io.h> +  #include <asm/arch/chip-features.h>  #include <asm/arch/gpio.h> +#include <asm/arch/memory-map.h>  /*   * Lots of small functions here. We depend on --gc-sections getting @@ -142,3 +145,43 @@ void gpio_enable_mmci(void)  	gpio_select_periph_A(GPIO_PIN_PA15, 0);	/* DATA3 */  }  #endif + +#ifdef AT32AP700x_CHIP_HAS_SPI +void gpio_enable_spi0(unsigned long cs_mask) +{ +	u32 pa_mask = 0; + +	gpio_select_periph_A(GPIO_PIN_PA0,  0);	/* MISO	*/ +	gpio_select_periph_A(GPIO_PIN_PA1,  0);	/* MOSI	*/ +	gpio_select_periph_A(GPIO_PIN_PA2,  0);	/* SCK	*/ + +	if (cs_mask & (1 << 0)) +		pa_mask |= 1 << 3;	/* NPCS0 */ +	if (cs_mask & (1 << 1)) +		pa_mask |= 1 << 4;	/* NPCS1 */ +	if (cs_mask & (1 << 2)) +		pa_mask |= 1 << 5;	/* NPCS2 */ +	if (cs_mask & (1 << 3)) +		pa_mask |= 1 << 20;	/* NPCS3 */ + +	__raw_writel(pa_mask, PIOA_BASE + 0x00); +	__raw_writel(pa_mask, PIOA_BASE + 0x30); +	__raw_writel(pa_mask, PIOA_BASE + 0x10); +} + +void gpio_enable_spi1(unsigned long cs_mask) +{ +	gpio_select_periph_B(GPIO_PIN_PA0,  0);	/* MISO	*/ +	gpio_select_periph_B(GPIO_PIN_PB1,  0);	/* MOSI	*/ +	gpio_select_periph_B(GPIO_PIN_PB5,  0);	/* SCK	*/ + +	if (cs_mask & (1 << 0)) +		gpio_select_periph_B(GPIO_PIN_PB2,  0);	/* NPCS0 */ +	if (cs_mask & (1 << 1)) +		gpio_select_periph_B(GPIO_PIN_PB3,  0);	/* NPCS1 */ +	if (cs_mask & (1 << 2)) +		gpio_select_periph_B(GPIO_PIN_PB4,  0);	/* NPCS2 */ +	if (cs_mask & (1 << 3)) +		gpio_select_periph_A(GPIO_PIN_PA27, 0);	/* NPCS3 */ +} +#endif diff --git a/cpu/at32ap/sm.h b/cpu/at32ap/at32ap700x/sm.h index 6492c8e81..6492c8e81 100644 --- a/cpu/at32ap/sm.h +++ b/cpu/at32ap/at32ap700x/sm.h diff --git a/cpu/at32ap/atmel_mci.c b/cpu/at32ap/atmel_mci.c index f59dfb599..3795addf0 100644 --- a/cpu/at32ap/atmel_mci.c +++ b/cpu/at32ap/atmel_mci.c @@ -21,8 +21,6 @@   */  #include <common.h> -#ifdef CONFIG_MMC -  #include <part.h>  #include <mmc.h> @@ -139,7 +137,7 @@ mmc_cmd(unsigned long cmd, unsigned long arg,  	pr_debug("mmc: status 0x%08lx\n", status); -	if (status & ERROR_FLAGS) { +	if (status & error_flags) {  		printf("mmc: command %lu failed (status: 0x%08lx)\n",  		       cmd, status);  		return -EIO; @@ -182,12 +180,13 @@ static int mmc_acmd(unsigned long cmd, unsigned long arg,  static unsigned long  mmc_bread(int dev, unsigned long start, lbaint_t blkcnt, -	  unsigned long *buffer) +	  void *buffer)  {  	int ret, i = 0;  	unsigned long resp[4];  	unsigned long card_status, data;  	unsigned long wordcount; +	u32 *p = buffer;  	u32 status;  	if (blkcnt == 0) @@ -225,7 +224,7 @@ mmc_bread(int dev, unsigned long start, lbaint_t blkcnt,  			if (status & MMCI_BIT(RXRDY)) {  				data = mmci_readl(RDR);  				/* pr_debug("%x\n", data); */ -				*buffer++ = data; +				*p++ = data;  				wordcount++;  			}  		} while(wordcount < (mmc_blkdev.blksz / 4)); @@ -443,6 +442,7 @@ static void mci_set_data_timeout(struct mmc_csd *csd)  	dtocyc = timeout_clks;  	dtomul = 0; +	shift = 0;  	while (dtocyc > 15 && dtomul < 8) {  		dtomul++;  		shift = dtomul_to_shift[dtomul]; @@ -546,5 +546,3 @@ int mmc2info(ulong addr)  {  	return 0;  } - -#endif /* CONFIG_MMC */ diff --git a/cpu/at32ap/cpu.c b/cpu/at32ap/cpu.c index 311466b78..0ba836180 100644 --- a/cpu/at32ap/cpu.c +++ b/cpu/at32ap/cpu.c @@ -30,7 +30,6 @@  #include <asm/arch/memory-map.h>  #include "hsmc3.h" -#include "sm.h"  /* Sanity checks */  #if (CFG_CLKDIV_CPU > CFG_CLKDIV_HSB)		\ @@ -44,47 +43,9 @@  DECLARE_GLOBAL_DATA_PTR; -static void pm_init(void) -{ -	uint32_t cksel; - -#ifdef CONFIG_PLL -	/* Initialize the PLL */ -	sm_writel(PM_PLL0, (SM_BF(PLLCOUNT, CFG_PLL0_SUPPRESS_CYCLES) -			    | SM_BF(PLLMUL, CFG_PLL0_MUL - 1) -			    | SM_BF(PLLDIV, CFG_PLL0_DIV - 1) -			    | SM_BF(PLLOPT, CFG_PLL0_OPT) -			    | SM_BF(PLLOSC, 0) -			    | SM_BIT(PLLEN))); - -	/* Wait for lock */ -	while (!(sm_readl(PM_ISR) & SM_BIT(LOCK0))) ; -#endif - -	/* Set up clocks for the CPU and all peripheral buses */ -	cksel = 0; -	if (CFG_CLKDIV_CPU) -		cksel |= SM_BIT(CPUDIV) | SM_BF(CPUSEL, CFG_CLKDIV_CPU - 1); -	if (CFG_CLKDIV_HSB) -		cksel |= SM_BIT(HSBDIV) | SM_BF(HSBSEL, CFG_CLKDIV_HSB - 1); -	if (CFG_CLKDIV_PBA) -		cksel |= SM_BIT(PBADIV) | SM_BF(PBASEL, CFG_CLKDIV_PBA - 1); -	if (CFG_CLKDIV_PBB) -		cksel |= SM_BIT(PBBDIV) | SM_BF(PBBSEL, CFG_CLKDIV_PBB - 1); -	sm_writel(PM_CKSEL, cksel); - -	gd->cpu_hz = get_cpu_clk_rate(); - -#ifdef CONFIG_PLL -	/* Use PLL0 as main clock */ -	sm_writel(PM_MCCTRL, SM_BIT(PLLSEL)); -#endif -} -  int cpu_init(void)  {  	extern void _evba(void); -	char *p;  	gd->cpu_hz = CFG_OSC0_HZ; @@ -95,16 +56,15 @@ int cpu_init(void)  	hsmc3_writel(PULSE0, 0x0b0a0906);  	hsmc3_writel(SETUP0, 0x00010002); -	pm_init(); +	clk_init(); +	/* Update the CPU speed according to the PLL configuration */ +	gd->cpu_hz = get_cpu_clk_rate(); + +	/* Set up the exception handler table and enable exceptions */  	sysreg_write(EVBA, (unsigned long)&_evba);  	asm volatile("csrf	%0" : : "i"(SYSREG_EM_OFFSET)); -	/* Lock everything that mess with the flash in the icache */ -	for (p = __flashprog_start; p <= (__flashprog_end + CFG_ICACHE_LINESZ); -	     p += CFG_ICACHE_LINESZ) -		asm volatile("cache %0, 0x02" : "=m"(*p) :: "memory"); -  	return 0;  } diff --git a/cpu/at32ap/entry.S b/cpu/at32ap/entry.S deleted file mode 100644 index a6fc68867..000000000 --- a/cpu/at32ap/entry.S +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2004-2006 Atmel Corporation - * - * 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/sysreg.h> -#include <asm/ptrace.h> - -	.section .text.exception,"ax" -	.global	_evba -	.type	_evba,@function -	.align	10 -_evba: -	.irp	x,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 -	.align	2 -	rjmp	unknown_exception -	.endr - -	.global	timer_interrupt_handler -	.type	timer_interrupt_handler,@function -	.align	2 -timer_interrupt_handler: -	/* -	 * Increment timer_overflow and re-write COMPARE with 0xffffffff. -	 * -	 * We're running at interrupt level 3, so we don't need to save -	 * r8-r12 or lr to the stack. -	 */ -	lda.w	r8, timer_overflow -	ld.w	r9, r8[0] -	mov	r10, -1 -	mtsr	SYSREG_COMPARE, r10 -	sub	r9, -1 -	st.w	r8[0], r9 -	rete - -	.type	unknown_exception, @function -unknown_exception: -	pushm	r0-r12 -	sub	r8, sp, REG_R12 - REG_R0 - 4 -	mov	r9, lr -	mfsr	r10, SYSREG_RAR_EX -	mfsr	r11, SYSREG_RSR_EX -	pushm	r8-r11 -	mfsr	r12, SYSREG_ECR -	mov	r11, sp -	rcall	do_unknown_exception -1:	rjmp	1b diff --git a/cpu/at32ap/exception.c b/cpu/at32ap/exception.c index 0672685cd..dc9c3002a 100644 --- a/cpu/at32ap/exception.c +++ b/cpu/at32ap/exception.c @@ -111,7 +111,8 @@ void do_unknown_exception(unsigned int ecr, struct pt_regs *regs)  	printf("CPU Mode: %s\n", cpu_modes[mode]);  	/* Avoid exception loops */ -	if (regs->sp < CFG_SDRAM_BASE || regs->sp >= gd->stack_end) +	if (regs->sp < (gd->stack_end - CONFIG_STACKSIZE) +			|| regs->sp >= gd->stack_end)  		printf("\nStack pointer seems bogus, won't do stack dump\n");  	else  		dump_mem("\nStack: ", regs->sp, gd->stack_end); diff --git a/cpu/at32ap/hsdramc.c b/cpu/at32ap/hsdramc.c index 1fcfe75d7..992612b46 100644 --- a/cpu/at32ap/hsdramc.c +++ b/cpu/at32ap/hsdramc.c @@ -30,39 +30,32 @@  #include "hsdramc1.h" -unsigned long sdram_init(const struct sdram_info *info) +unsigned long sdram_init(void *sdram_base, const struct sdram_config *config)  { -	unsigned long *sdram = (unsigned long *)uncached(info->phys_addr);  	unsigned long sdram_size; -	unsigned long tmp; -	unsigned long bus_hz; +	uint32_t cfgreg;  	unsigned int i; -	if (!info->refresh_period) -		panic("ERROR: SDRAM refresh period == 0. " -				"Please update the board code\n"); +	cfgreg = (HSDRAMC1_BF(NC, config->col_bits - 8) +		       | HSDRAMC1_BF(NR, config->row_bits - 11) +		       | HSDRAMC1_BF(NB, config->bank_bits - 1) +		       | HSDRAMC1_BF(CAS, config->cas) +		       | HSDRAMC1_BF(TWR, config->twr) +		       | HSDRAMC1_BF(TRC, config->trc) +		       | HSDRAMC1_BF(TRP, config->trp) +		       | HSDRAMC1_BF(TRCD, config->trcd) +		       | HSDRAMC1_BF(TRAS, config->tras) +		       | HSDRAMC1_BF(TXSR, config->txsr)); -	tmp = (HSDRAMC1_BF(NC, info->col_bits - 8) -	       | HSDRAMC1_BF(NR, info->row_bits - 11) -	       | HSDRAMC1_BF(NB, info->bank_bits - 1) -	       | HSDRAMC1_BF(CAS, info->cas) -	       | HSDRAMC1_BF(TWR, info->twr) -	       | HSDRAMC1_BF(TRC, info->trc) -	       | HSDRAMC1_BF(TRP, info->trp) -	       | HSDRAMC1_BF(TRCD, info->trcd) -	       | HSDRAMC1_BF(TRAS, info->tras) -	       | HSDRAMC1_BF(TXSR, info->txsr)); +	if (config->data_bits == SDRAM_DATA_16BIT) +		cfgreg |= HSDRAMC1_BIT(DBW); -#ifdef CFG_SDRAM_16BIT -	tmp |= HSDRAMC1_BIT(DBW); -	sdram_size = 1 << (info->row_bits + info->col_bits -			   + info->bank_bits + 1); -#else -	sdram_size = 1 << (info->row_bits + info->col_bits -			   + info->bank_bits + 2); -#endif +	hsdramc1_writel(CR, cfgreg); -	hsdramc1_writel(CR, tmp); +	/* Send a NOP to turn on the clock (necessary on some chips) */ +	hsdramc1_writel(MR, HSDRAMC1_MODE_NOP); +	hsdramc1_readl(MR); +	writel(0, sdram_base);  	/*  	 * Initialization sequence for SDRAM, from the data sheet: @@ -77,7 +70,7 @@ unsigned long sdram_init(const struct sdram_info *info)  	 */  	hsdramc1_writel(MR, HSDRAMC1_MODE_BANKS_PRECHARGE);  	hsdramc1_readl(MR); -	writel(0, sdram); +	writel(0, sdram_base);  	/*  	 * 3. Eight auto-refresh (CBR) cycles are provided @@ -85,58 +78,41 @@ unsigned long sdram_init(const struct sdram_info *info)  	hsdramc1_writel(MR, HSDRAMC1_MODE_AUTO_REFRESH);  	hsdramc1_readl(MR);  	for (i = 0; i < 8; i++) -		writel(0, sdram); +		writel(0, sdram_base);  	/*  	 * 4. A mode register set (MRS) cycle is issued to program  	 *    SDRAM parameters, in particular CAS latency and burst  	 *    length.  	 * -	 * CAS from info struct, burst length 1, serial burst type +	 * The address will be chosen by the SDRAMC automatically; we +	 * just have to make sure BA[1:0] are set to 0.  	 */  	hsdramc1_writel(MR, HSDRAMC1_MODE_LOAD_MODE);  	hsdramc1_readl(MR); -	writel(0, sdram + (info->cas << 4)); +	writel(0, sdram_base);  	/* -	 * 5. A Normal Mode command is provided, 3 clocks after tMRD -	 *    is met. -	 * -	 * From the timing diagram, it looks like tMRD is 3 -	 * cycles...try a dummy read from the peripheral bus. +	 * 5. The application must go into Normal Mode, setting Mode +	 *    to 0 in the Mode Register and performing a write access +	 *    at any location in the SDRAM.  	 */ -	hsdramc1_readl(MR);  	hsdramc1_writel(MR, HSDRAMC1_MODE_NORMAL);  	hsdramc1_readl(MR); -	writel(0, sdram); +	writel(0, sdram_base);  	/*  	 * 6. Write refresh rate into SDRAMC refresh timer count  	 *    register (refresh rate = timing between refresh cycles). -	 * -	 * 15.6 us is a typical value for a burst of length one  	 */ -	bus_hz = get_sdram_clk_rate(); -	hsdramc1_writel(TR, info->refresh_period); - -	printf("SDRAM: %u MB at address 0x%08lx\n", -	       sdram_size >> 20, info->phys_addr); - -	printf("Testing SDRAM..."); -	for (i = 0; i < sdram_size / 4; i++) -		sdram[i] = i; - -	for (i = 0; i < sdram_size / 4; i++) { -		tmp = sdram[i]; -		if (tmp != i) { -			printf("FAILED at address 0x%08lx\n", -			       info->phys_addr + i * 4); -			printf("SDRAM: read 0x%lx, expected 0x%lx\n", tmp, i); -			return 0; -		} -	} +	hsdramc1_writel(TR, config->refresh_period); -	puts("OK\n"); +	if (config->data_bits == SDRAM_DATA_16BIT) +		sdram_size = 1 << (config->row_bits + config->col_bits +				   + config->bank_bits + 1); +	else +		sdram_size = 1 << (config->row_bits + config->col_bits +				   + config->bank_bits + 2);  	return sdram_size;  } diff --git a/cpu/at32ap/interrupts.c b/cpu/at32ap/interrupts.c index bef1f30d7..160838eee 100644 --- a/cpu/at32ap/interrupts.c +++ b/cpu/at32ap/interrupts.c @@ -98,18 +98,16 @@ void set_timer(unsigned long t)   */  void udelay(unsigned long usec)  { -	unsigned long now, end; +	unsigned long cycles; +	unsigned long base; +	unsigned long now; -	now = sysreg_read(COUNT); +	base = sysreg_read(COUNT); +	cycles = ((usec * (get_tbclk() / 10000)) + 50) / 100; -	end = ((usec * (get_tbclk() / 10000)) + 50) / 100; -	end += now; - -	while (now > end) -		now = sysreg_read(COUNT); - -	while (now < end) +	do {  		now = sysreg_read(COUNT); +	} while ((now - base) < cycles);  }  static int set_interrupt_handler(unsigned int nr, void (*handler)(void), diff --git a/cpu/at32ap/start.S b/cpu/at32ap/start.S index ab8c2b73d..907e9b153 100644 --- a/cpu/at32ap/start.S +++ b/cpu/at32ap/start.S @@ -1,5 +1,5 @@  /* - * Copyright (C) 2005-2006 Atmel Corporation + * Copyright (C) 2005-2008 Atmel Corporation   *   * See file CREDITS for list of people who contributed to this   * project. @@ -20,12 +20,9 @@   * MA 02111-1307 USA   */  #include <config.h> +#include <asm/ptrace.h>  #include <asm/sysreg.h> -#ifndef PART_SPECIFIC_BOOTSTRAP -# define PART_SPECIFIC_BOOTSTRAP -#endif -  #define SYSREG_MMUCR_I_OFFSET	2  #define SYSREG_MMUCR_S_OFFSET	4 @@ -34,11 +31,115 @@  		    | SYSREG_BIT(FE) | SYSREG_BIT(RE)		\  		    | SYSREG_BIT(IBE) | SYSREG_BIT(IEE)) -	.text +	/* +	 * To save some space, we use the same entry point for +	 * exceptions and reset. This avoids lots of alignment padding +	 * since the reset vector is always suitably aligned. +	 */ +	.section .exception.text, "ax", @progbits  	.global	_start +	.global	_evba +	.type	_start, @function +	.type	_evba, @function  _start: -	PART_SPECIFIC_BOOTSTRAP +	.size	_start, 0 +_evba: +	.org	0x00 +	rjmp	unknown_exception	/* Unrecoverable exception */ +	.org	0x04 +	rjmp	unknown_exception	/* TLB multiple hit */ +	.org	0x08 +	rjmp	unknown_exception	/* Bus error data fetch */ +	.org	0x0c +	rjmp	unknown_exception	/* Bus error instruction fetch */ +	.org	0x10 +	rjmp	unknown_exception	/* NMI */ +	.org	0x14 +	rjmp	unknown_exception	/* Instruction address */ +	.org	0x18 +	rjmp	unknown_exception	/* ITLB protection */ +	.org	0x1c +	rjmp	unknown_exception	/* Breakpoint */ +	.org	0x20 +	rjmp	unknown_exception	/* Illegal opcode */ +	.org	0x24 +	rjmp	unknown_exception	/* Unimplemented instruction */ +	.org	0x28 +	rjmp	unknown_exception	/* Privilege violation */ +	.org	0x2c +	rjmp	unknown_exception	/* Floating-point */ +	.org	0x30 +	rjmp	unknown_exception	/* Coprocessor absent */ +	.org	0x34 +	rjmp	unknown_exception	/* Data Address (read) */ +	.org	0x38 +	rjmp	unknown_exception	/* Data Address (write) */ +	.org	0x3c +	rjmp	unknown_exception	/* DTLB Protection (read) */ +	.org	0x40 +	rjmp	unknown_exception	/* DTLB Protection (write) */ +	.org	0x44 +	rjmp	unknown_exception	/* DTLB Modified */ + +	.org	0x50 +	rjmp	unknown_exception	/* ITLB Miss */ +	.org	0x60 +	rjmp	unknown_exception	/* DTLB Miss (read) */ +	.org	0x70 +	rjmp	unknown_exception	/* DTLB Miss (write) */ + +	.size	_evba, . - _evba + +	.align	2 +	.type	unknown_exception, @function +unknown_exception: +	/* Figure out whether we're handling an exception (Exception +	 * mode) or just booting (Supervisor mode). */ +	csrfcz	SYSREG_M1_OFFSET +	brcc	at32ap_cpu_bootstrap + +	/* This is an exception. Complain. */ +	pushm	r0-r12 +	sub	r8, sp, REG_R12 - REG_R0 - 4 +	mov	r9, lr +	mfsr	r10, SYSREG_RAR_EX +	mfsr	r11, SYSREG_RSR_EX +	pushm	r8-r11 +	mfsr	r12, SYSREG_ECR +	mov	r11, sp +	rcall	do_unknown_exception +1:	rjmp	1b + +	/* The COUNT/COMPARE timer interrupt handler */ +	.global	timer_interrupt_handler +	.type	timer_interrupt_handler,@function +	.align	2 +timer_interrupt_handler: +	/* +	 * Increment timer_overflow and re-write COMPARE with 0xffffffff. +	 * +	 * We're running at interrupt level 3, so we don't need to save +	 * r8-r12 or lr to the stack. +	 */ +	lda.w	r8, timer_overflow +	ld.w	r9, r8[0] +	mov	r10, -1 +	mtsr	SYSREG_COMPARE, r10 +	sub	r9, -1 +	st.w	r8[0], r9 +	rete +	/* +	 * CPU bootstrap after reset is handled here. SoC code may +	 * override this in case they need to initialize oscillators, +	 * etc. +	 */ +	.section .text.at32ap_cpu_bootstrap, "ax", @progbits +	.global	at32ap_cpu_bootstrap +	.weak	at32ap_cpu_bootstrap +	.type	at32ap_cpu_bootstrap, @function +	.align	2 +at32ap_cpu_bootstrap:  	/* Reset the Status Register */  	mov	r0, lo(SR_INIT)  	orh	r0, hi(SR_INIT) @@ -66,9 +167,16 @@ _start:  	lddpc	pc, 1f  	.align	2 -1:	.long	2f +1:	.long	at32ap_low_level_init +	.size	_start, . - _start -2:	lddpc	sp, sp_init +	/* Common CPU bootstrap code after oscillator/cache/etc. init */ +	.section .text.avr32ap_low_level_init, "ax", @progbits +	.global	at32ap_low_level_init +	.type	at32ap_low_level_init, @function +	.align	2 +at32ap_low_level_init: +	lddpc	sp, sp_init  	/* Initialize the GOT pointer */  	lddpc	r6, got_init @@ -90,6 +198,7 @@ got_init:  	 * Relocate the u-boot image into RAM and continue from there.  	 * Does not return.  	 */ +	.section .text.relocate_code,"ax",@progbits  	.global	relocate_code  	.type	relocate_code,@function  relocate_code: @@ -162,3 +271,5 @@ in_ram:  	.align	2  got_init_reloc:  	.long	3b - _GLOBAL_OFFSET_TABLE_ + +	.size	relocate_code, . - relocate_code diff --git a/cpu/mips/cpu.c b/cpu/mips/cpu.c index e267bba46..0f58d25b8 100644 --- a/cpu/mips/cpu.c +++ b/cpu/mips/cpu.c @@ -66,10 +66,10 @@ void flush_cache(ulong start_addr, ulong size)  void write_one_tlb(int index, u32 pagemask, u32 hi, u32 low0, u32 low1)  { -	write_32bit_cp0_register(CP0_ENTRYLO0, low0); -	write_32bit_cp0_register(CP0_PAGEMASK, pagemask); -	write_32bit_cp0_register(CP0_ENTRYLO1, low1); -	write_32bit_cp0_register(CP0_ENTRYHI, hi); -	write_32bit_cp0_register(CP0_INDEX, index); +	write_c0_entrylo0(low0); +	write_c0_pagemask(pagemask); +	write_c0_entrylo1(low1); +	write_c0_entryhi(hi); +	write_c0_index(index);  	tlb_write_indexed();  } diff --git a/cpu/mpc512x/traps.c b/cpu/mpc512x/traps.c index 8455c9276..8000fabd4 100644 --- a/cpu/mpc512x/traps.c +++ b/cpu/mpc512x/traps.c @@ -34,7 +34,13 @@ DECLARE_GLOBAL_DATA_PTR;  extern unsigned long search_exception_table(unsigned long); -#define END_OF_MEM	(gd->bd->bi_memstart + gd->bd->bi_memsize) +/* + * End of addressable memory.  This may be less than the actual + * amount of memory on the system if we're unable to keep all + * the memory mapped in. + */ +extern ulong get_effective_memsize(void); +#define END_OF_MEM (gd->bd->bi_memstart + get_effective_memsize())  /*   * Trap & Exception support diff --git a/cpu/mpc83xx/start.S b/cpu/mpc83xx/start.S index 309eb30e8..c18217479 100644 --- a/cpu/mpc83xx/start.S +++ b/cpu/mpc83xx/start.S @@ -557,7 +557,7 @@ invalidate_bats:  	mtspr	IBAT1U, r0  	mtspr	IBAT2U, r0  	mtspr	IBAT3U, r0 -#if (CFG_HID2 & HID2_HBE) +#ifdef CONFIG_HIGH_BATS  	mtspr   IBAT4U, r0  	mtspr   IBAT5U, r0  	mtspr   IBAT6U, r0 @@ -568,7 +568,7 @@ invalidate_bats:  	mtspr	DBAT1U, r0  	mtspr	DBAT2U, r0  	mtspr	DBAT3U, r0 -#if (CFG_HID2 & HID2_HBE) +#ifdef CONFIG_HIGH_BATS  	mtspr   DBAT4U, r0  	mtspr   DBAT5U, r0  	mtspr   DBAT6U, r0 @@ -655,7 +655,7 @@ setup_bats:  	mtspr	DBAT3U, r3  	isync -#if (CFG_HID2 & HID2_HBE) +#ifdef CONFIG_HIGH_BATS  	/* IBAT 4 */  	addis   r4, r0, CFG_IBAT4L@h  	ori     r4, r4, CFG_IBAT4L@l diff --git a/cpu/mpc86xx/cpu.c b/cpu/mpc86xx/cpu.c index 3c7476445..e26bf3671 100644 --- a/cpu/mpc86xx/cpu.c +++ b/cpu/mpc86xx/cpu.c @@ -26,6 +26,7 @@  #include <watchdog.h>  #include <command.h>  #include <asm/cache.h> +#include <asm/mmu.h>  #include <mpc86xx.h>  #include <asm/fsl_law.h> @@ -268,13 +269,14 @@ dma_xfer(void *dest, uint count, void *src)  /*   * Print out the state of various machine registers. - * Currently prints out LAWs and BR0/OR0 + * Currently prints out LAWs, BR0/OR0, and BATs   */  void mpc86xx_reginfo(void)  {  	immap_t *immap = (immap_t *)CFG_IMMR;  	ccsr_lbc_t *lbc = &immap->im_lbc; +	print_bats();  	print_laws();  	printf ("Local Bus Controller Registers\n" diff --git a/cpu/nios/spi.c b/cpu/nios/spi.c index f37146b79..640818014 100644 --- a/cpu/nios/spi.c +++ b/cpu/nios/spi.c @@ -63,10 +63,10 @@ static char quickhex (int i)  	return hex_digit[i];  } -static void memdump (void *pv, int num) +static void memdump (const void *pv, int num)  {  	int i; -	unsigned char *pc = (unsigned char *) pv; +	const unsigned char *pc = (const unsigned char *) pv;  	for (i = 0; i < num; i++)  		printf ("%c%c ", quickhex (pc[i] >> 4), quickhex (pc[i] & 0x0f)); @@ -83,26 +83,64 @@ static void memdump (void *pv, int num)  #endif  /* DEBUG */ +struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs, +		unsigned int max_hz, unsigned int mode) +{ +	struct spi_slave *slave; + +	if (!spi_cs_is_valid(bus, cs)) +		return NULL; + +	slave = malloc(sizeof(struct spi_slave)); +	if (!slave) +		return NULL; + +	slave->bus = bus; +	slave->cs = cs; + +	/* TODO: Add support for different modes and speeds */ + +	return slave; +} + +void spi_free_slave(struct spi_slave *slave) +{ +	free(slave); +} + +int spi_claim_bus(struct spi_slave *slave) +{ +	return 0; +} + +void spi_release_bus(struct spi_slave *slave) +{ + +} +  /*   * SPI transfer:   *   * See include/spi.h and http://www.altera.com/literature/ds/ds_nios_spi.pdf   * for more informations.   */ -int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din) +int spi_xfer(struct spi_slave *slave, int bitlen, const void *dout, +		void *din, unsigned long flags)  { +	const u8 *txd = dout; +	u8 *rxd = din;  	int j; -	DPRINT(("spi_xfer: chipsel %08X dout %08X din %08X bitlen %d\n", -		(int)chipsel, *(uint *)dout, *(uint *)din, bitlen)); +	DPRINT(("spi_xfer: slave %u:%u dout %08X din %08X bitlen %d\n", +		slave->bus, slave->cs, *(uint *)dout, *(uint *)din, bitlen)); -	memdump((void*)dout, (bitlen + 7) / 8); +	memdump(dout, (bitlen + 7) / 8); -	if(chipsel != NULL) { -		chipsel(1);	/* select the target chip */ -	} +	if (flags & SPI_XFER_BEGIN) +		spi_cs_activate(slave); -	if (bitlen > CFG_NIOS_SPIBITS) {	/* leave chip select active */ +	if (!(flags & SPI_XFER_END) || bitlen > CFG_NIOS_SPIBITS) { +		/* leave chip select active */  		spi->control |= NIOS_SPI_SSO;  	} @@ -114,11 +152,11 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)  		while ((spi->status & NIOS_SPI_TRDY) == 0)  			; -		spi->txdata = (unsigned)(dout[j]); +		spi->txdata = (unsigned)(txd[j]);  		while ((spi->status & NIOS_SPI_RRDY) == 0)  			; -		din[j] = (unsigned char)(spi->rxdata & 0xff); +		rxd[j] = (unsigned char)(spi->rxdata & 0xff);  #elif	(CFG_NIOS_SPIBITS == 16)  		j++, j++) { @@ -126,15 +164,15 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)  		while ((spi->status & NIOS_SPI_TRDY) == 0)  			;  		if ((j+1) < ((bitlen + 7) / 8)) -			spi->txdata = (unsigned)((dout[j] << 8) | dout[j+1]); +			spi->txdata = (unsigned)((txd[j] << 8) | txd[j+1]);  		else -			spi->txdata = (unsigned)(dout[j] << 8); +			spi->txdata = (unsigned)(txd[j] << 8);  		while ((spi->status & NIOS_SPI_RRDY) == 0)  			; -		din[j] = (unsigned char)((spi->rxdata >> 8) & 0xff); +		rxd[j] = (unsigned char)((spi->rxdata >> 8) & 0xff);  		if ((j+1) < ((bitlen + 7) / 8)) -			din[j+1] = (unsigned char)(spi->rxdata & 0xff); +			rxd[j+1] = (unsigned char)(spi->rxdata & 0xff);  #else  #error "*** unsupported value of CFG_NIOS_SPIBITS ***" @@ -142,15 +180,14 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)  	} -	if (bitlen > CFG_NIOS_SPIBITS) { +	if (bitlen > CFG_NIOS_SPIBITS && (flags & SPI_XFER_END)) {  		spi->control &= ~NIOS_SPI_SSO;  	} -	if(chipsel != NULL) { -		chipsel(0);	/* deselect the target chip */ -	} +	if (flags & SPI_XFER_END) +		spi_cs_deactivate(slave); -	memdump((void*)din, (bitlen + 7) / 8); +	memdump(din, (bitlen + 7) / 8);  	return 0;  } diff --git a/cpu/ppc4xx/commproc.c b/cpu/ppc4xx/commproc.c index 22156dd9d..8b2954c16 100644 --- a/cpu/ppc4xx/commproc.c +++ b/cpu/ppc4xx/commproc.c @@ -30,29 +30,25 @@  #if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER) -#if defined(CFG_POST_ALT_WORD_ADDR) -void post_word_store (ulong a) -{ -	out_be32((void *)CFG_POST_ALT_WORD_ADDR, a); -} +#if defined(CFG_POST_WORD_ADDR) +# define _POST_ADDR	((CFG_OCM_DATA_ADDR) + (CFG_POST_WORD_ADDR)) +#elif defined(CFG_POST_ALT_WORD_ADDR) +# define _POST_ADDR	(CFG_POST_ALT_WORD_ADDR) +#endif -ulong post_word_load (void) -{ -	return in_be32((void *)CFG_POST_ALT_WORD_ADDR); -} -#else /* CFG_POST_ALT_WORD_ADDR */  void post_word_store (ulong a)  { -	volatile void *save_addr = (volatile void *)(CFG_OCM_DATA_ADDR + CFG_POST_WORD_ADDR); -	*(volatile ulong *) save_addr = a; +	volatile void *save_addr = (volatile void *)(_POST_ADDR); + +	out_be32(save_addr, a);  }  ulong post_word_load (void)  { -	volatile void *save_addr = (volatile void *)(CFG_OCM_DATA_ADDR + CFG_POST_WORD_ADDR); -	return *(volatile ulong *) save_addr; +	volatile void *save_addr = (volatile void *)(_POST_ADDR); + +	return in_be32(save_addr);  } -#endif /* CFG_POST_ALT_WORD_ADDR */  #endif	/* CONFIG_POST || CONFIG_LOGBUFFER*/ diff --git a/disk/part.c b/disk/part.c index 316e25473..5c4bf6b61 100644 --- a/disk/part.c +++ b/disk/part.c @@ -109,7 +109,7 @@ void dev_print (block_dev_desc_t *dev_desc)  	lbaint_t lba512;  #endif -	switch (dev_desc->type) { +	switch (dev_desc->if_type) {  	case IF_TYPE_SCSI:  		printf ("(%d:%d) Vendor: %s Prod.: %s Rev: %s\n",  			dev_desc->target,dev_desc->lun, @@ -124,7 +124,7 @@ void dev_print (block_dev_desc_t *dev_desc)  			dev_desc->revision,  			dev_desc->product);  		break; -	case DEV_TYPE_UNKNOWN: +	case IF_TYPE_UNKNOWN:  	default:  		puts ("not available\n");  		return; diff --git a/drivers/hwmon/lm75.c b/drivers/hwmon/lm75.c index e29b29440..c34851725 100644 --- a/drivers/hwmon/lm75.c +++ b/drivers/hwmon/lm75.c @@ -47,6 +47,19 @@ int dtt_read(int sensor, int reg)      int dlen;      uchar data[2]; +#ifdef CONFIG_DTT_AD7414 +    /* +     * On AD7414 the first value upon bootup is not read correctly. +     * This is most likely because of the 800ms update time of the +     * temp register in normal update mode. To get current values +     * each time we issue the "dtt" command including upon powerup +     * we switch into one-short mode. +     * +     * Issue one-shot mode command +     */ +    dtt_write(sensor, DTT_CONFIG, 0x64); +#endif +      /*       * Validate 'reg' param       */ diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index 68ab55f8a..d84f0fc55 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -1720,6 +1720,8 @@ ulong flash_get_size (ulong base, int banknum)  	int erase_region_count;  	struct cfi_qry qry; +	memset(&qry, 0, sizeof(qry)); +  	info->ext_addr = 0;  	info->cfi_version = 0;  #ifdef CFG_FLASH_PROTECTION diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 6c5624a49..c82f77b55 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -153,6 +153,13 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)  		priv_nand->bbt = NULL;  	} +	if (erase_length < meminfo->erasesize) { +		printf("Warning: Erase size 0x%08x smaller than one "	\ +		       "erase block 0x%08x\n",erase_length, meminfo->erasesize); +		printf("         Erasing 0x%08x instead\n", meminfo->erasesize); +		erase_length = meminfo->erasesize; +	} +  	for (;  	     erase.addr < opts->offset + erase_length;  	     erase.addr += meminfo->erasesize) { diff --git a/drivers/mtd/spi/Makefile b/drivers/mtd/spi/Makefile new file mode 100644 index 000000000..af6af97d1 --- /dev/null +++ b/drivers/mtd/spi/Makefile @@ -0,0 +1,47 @@ +# +# (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 + +LIB	:= $(obj)libspi_flash.a + +COBJS-$(CONFIG_SPI_FLASH)	+= spi_flash.o +COBJS-$(CONFIG_SPI_FLASH_ATMEL)	+= atmel.o + +COBJS	:= $(COBJS-y) +SRCS	:= $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) + +all:	$(LIB) + +$(LIB): $(obj).depend $(OBJS) +	$(AR) $(ARFLAGS) $@ $(OBJS) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/drivers/mtd/spi/atmel.c b/drivers/mtd/spi/atmel.c new file mode 100644 index 000000000..fb7a4a939 --- /dev/null +++ b/drivers/mtd/spi/atmel.c @@ -0,0 +1,362 @@ +/* + * Atmel SPI DataFlash support + * + * Copyright (C) 2008 Atmel Corporation + */ +#define DEBUG +#include <common.h> +#include <malloc.h> +#include <spi_flash.h> + +#include "spi_flash_internal.h" + +/* AT45-specific commands */ +#define CMD_AT45_READ_STATUS		0xd7 +#define CMD_AT45_ERASE_PAGE		0x81 +#define CMD_AT45_LOAD_PROG_BUF1		0x82 +#define CMD_AT45_LOAD_BUF1		0x84 +#define CMD_AT45_LOAD_PROG_BUF2		0x85 +#define CMD_AT45_LOAD_BUF2		0x87 +#define CMD_AT45_PROG_BUF1		0x88 +#define CMD_AT45_PROG_BUF2		0x89 + +/* AT45 status register bits */ +#define AT45_STATUS_P2_PAGE_SIZE	(1 << 0) +#define AT45_STATUS_READY		(1 << 7) + +/* DataFlash family IDs, as obtained from the second idcode byte */ +#define DF_FAMILY_AT26F			0 +#define DF_FAMILY_AT45			1 +#define DF_FAMILY_AT26DF		2	/* AT25DF and AT26DF */ + +struct atmel_spi_flash_params { +	u8		idcode1; +	/* Log2 of page size in power-of-two mode */ +	u8		l2_page_size; +	u8		pages_per_block; +	u8		blocks_per_sector; +	u8		nr_sectors; +	const char	*name; +}; + +struct atmel_spi_flash { +	const struct atmel_spi_flash_params *params; +	struct spi_flash flash; +}; + +static inline struct atmel_spi_flash * +to_atmel_spi_flash(struct spi_flash *flash) +{ +	return container_of(flash, struct atmel_spi_flash, flash); +} + +static const struct atmel_spi_flash_params atmel_spi_flash_table[] = { +	{ +		.idcode1		= 0x28, +		.l2_page_size		= 10, +		.pages_per_block	= 8, +		.blocks_per_sector	= 32, +		.nr_sectors		= 32, +		.name			= "AT45DB642D", +	}, +}; + +static int at45_wait_ready(struct spi_flash *flash, unsigned long timeout) +{ +	struct spi_slave *spi = flash->spi; +	unsigned long timebase; +	int ret; +	u8 cmd = CMD_AT45_READ_STATUS; +	u8 status; + +	timebase = get_timer(0); + +	ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN); +	if (ret) +		return -1; + +	do { +		ret = spi_xfer(spi, 8, NULL, &status, 0); +		if (ret) +			return -1; + +		if (status & AT45_STATUS_READY) +			break; +	} while (get_timer(timebase) < timeout); + +	/* Deactivate CS */ +	spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END); + +	if (status & AT45_STATUS_READY) +		return 0; + +	/* Timed out */ +	return -1; +} + +/* + * Assemble the address part of a command for AT45 devices in + * non-power-of-two page size mode. + */ +static void at45_build_address(struct atmel_spi_flash *asf, u8 *cmd, u32 offset) +{ +	unsigned long page_addr; +	unsigned long byte_addr; +	unsigned long page_size; +	unsigned int page_shift; + +	/* +	 * The "extra" space per page is the power-of-two page size +	 * divided by 32. +	 */ +	page_shift = asf->params->l2_page_size; +	page_size = (1 << page_shift) + (1 << (page_shift - 5)); +	page_shift++; +	page_addr = offset / page_size; +	byte_addr = offset % page_size; + +	cmd[0] = page_addr >> (16 - page_shift); +	cmd[1] = page_addr << (page_shift - 8) | (byte_addr >> 8); +	cmd[2] = byte_addr; +} + +static int dataflash_read_fast_p2(struct spi_flash *flash, +		u32 offset, size_t len, void *buf) +{ +	u8 cmd[5]; + +	cmd[0] = CMD_READ_ARRAY_FAST; +	cmd[1] = offset >> 16; +	cmd[2] = offset >> 8; +	cmd[3] = offset; +	cmd[4] = 0x00; + +	return spi_flash_read_common(flash, cmd, sizeof(cmd), buf, len); +} + +static int dataflash_read_fast_at45(struct spi_flash *flash, +		u32 offset, size_t len, void *buf) +{ +	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash); +	u8 cmd[5]; + +	cmd[0] = CMD_READ_ARRAY_FAST; +	at45_build_address(asf, cmd + 1, offset); +	cmd[4] = 0x00; + +	return spi_flash_read_common(flash, cmd, sizeof(cmd), buf, len); +} + +static int dataflash_write_at45(struct spi_flash *flash, +		u32 offset, size_t len, const void *buf) +{ +	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash); +	unsigned long page_addr; +	unsigned long byte_addr; +	unsigned long page_size; +	unsigned int page_shift; +	size_t chunk_len; +	size_t actual; +	int ret; +	u8 cmd[4]; + +	page_shift = asf->params->l2_page_size; +	page_size = (1 << page_shift) + (1 << (page_shift - 5)); +	page_shift++; +	page_addr = offset / page_size; +	byte_addr = offset % page_size; + +	ret = spi_claim_bus(flash->spi); +	if (ret) { +		debug("SF: Unable to claim SPI bus\n"); +		return ret; +	} + +	for (actual = 0; actual < len; actual += chunk_len) { +		chunk_len = min(len - actual, page_size - byte_addr); + +		/* Use the same address bits for both commands */ +		cmd[0] = CMD_AT45_LOAD_BUF1; +		cmd[1] = page_addr >> (16 - page_shift); +		cmd[2] = page_addr << (page_shift - 8) | (byte_addr >> 8); +		cmd[3] = byte_addr; + +		ret = spi_flash_cmd_write(flash->spi, cmd, 4, +				buf + actual, chunk_len); +		if (ret < 0) { +			debug("SF: Loading AT45 buffer failed\n"); +			goto out; +		} + +		cmd[0] = CMD_AT45_PROG_BUF1; +		ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0); +		if (ret < 0) { +			debug("SF: AT45 page programming failed\n"); +			goto out; +		} + +		ret = at45_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT); +		if (ret < 0) { +			debug("SF: AT45 page programming timed out\n"); +			goto out; +		} + +		page_addr++; +		byte_addr = 0; +	} + +	debug("SF: AT45: Successfully programmed %u bytes @ 0x%x\n", +			len, offset); +	ret = 0; + +out: +	spi_release_bus(flash->spi); +	return ret; +} + +int dataflash_erase_at45(struct spi_flash *flash, u32 offset, size_t len) +{ +	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash); +	unsigned long page_addr; +	unsigned long page_size; +	unsigned int page_shift; +	size_t actual; +	int ret; +	u8 cmd[4]; + +	/* +	 * TODO: This function currently uses page erase only. We can +	 * probably speed things up by using block and/or sector erase +	 * when possible. +	 */ + +	page_shift = asf->params->l2_page_size; +	page_size = (1 << page_shift) + (1 << (page_shift - 5)); +	page_shift++; +	page_addr = offset / page_size; + +	if (offset % page_size || len % page_size) { +		debug("SF: Erase offset/length not multiple of page size\n"); +		return -1; +	} + +	cmd[0] = CMD_AT45_ERASE_PAGE; +	cmd[3] = 0x00; + +	ret = spi_claim_bus(flash->spi); +	if (ret) { +		debug("SF: Unable to claim SPI bus\n"); +		return ret; +	} + +	for (actual = 0; actual < len; actual += page_size) { +		cmd[1] = page_addr >> (16 - page_shift); +		cmd[2] = page_addr << (page_shift - 8); + +		ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0); +		if (ret < 0) { +			debug("SF: AT45 page erase failed\n"); +			goto out; +		} + +		ret = at45_wait_ready(flash, SPI_FLASH_PAGE_ERASE_TIMEOUT); +		if (ret < 0) { +			debug("SF: AT45 page erase timed out\n"); +			goto out; +		} + +		page_addr++; +	} + +	debug("SF: AT45: Successfully erased %u bytes @ 0x%x\n", +			len, offset); +	ret = 0; + +out: +	spi_release_bus(flash->spi); +	return ret; +} + +struct spi_flash *spi_flash_probe_atmel(struct spi_slave *spi, u8 *idcode) +{ +	const struct atmel_spi_flash_params *params; +	unsigned long page_size; +	unsigned int family; +	struct atmel_spi_flash *asf; +	unsigned int i; +	int ret; +	u8 status; + +	for (i = 0; i < ARRAY_SIZE(atmel_spi_flash_table); i++) { +		params = &atmel_spi_flash_table[i]; +		if (params->idcode1 == idcode[1]) +			break; +	} + +	if (i == ARRAY_SIZE(atmel_spi_flash_table)) { +		debug("SF: Unsupported DataFlash ID %02x\n", +				idcode[1]); +		return NULL; +	} + +	asf = malloc(sizeof(struct atmel_spi_flash)); +	if (!asf) { +		debug("SF: Failed to allocate memory\n"); +		return NULL; +	} + +	asf->params = params; +	asf->flash.spi = spi; +	asf->flash.name = params->name; + +	/* Assuming power-of-two page size initially. */ +	page_size = 1 << params->l2_page_size; + +	family = idcode[1] >> 5; + +	switch (family) { +	case DF_FAMILY_AT45: +		/* +		 * AT45 chips have configurable page size. The status +		 * register indicates which configuration is active. +		 */ +		ret = spi_flash_cmd(spi, CMD_AT45_READ_STATUS, &status, 1); +		if (ret) +			goto err; + +		debug("SF: AT45 status register: %02x\n", status); + +		if (!(status & AT45_STATUS_P2_PAGE_SIZE)) { +			asf->flash.read = dataflash_read_fast_at45; +			asf->flash.write = dataflash_write_at45; +			asf->flash.erase = dataflash_erase_at45; +			page_size += 1 << (params->l2_page_size - 5); +		} else { +			asf->flash.read = dataflash_read_fast_p2; +		} + +		break; + +	case DF_FAMILY_AT26F: +	case DF_FAMILY_AT26DF: +		asf->flash.read = dataflash_read_fast_p2; +		break; + +	default: +		debug("SF: Unsupported DataFlash family %u\n", family); +		goto err; +	} + +	asf->flash.size = page_size * params->pages_per_block +				* params->blocks_per_sector +				* params->nr_sectors; + +	debug("SF: Detected %s with page size %u, total %u bytes\n", +			params->name, page_size, asf->flash.size); + +	return &asf->flash; + +err: +	free(asf); +	return NULL; +} diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c new file mode 100644 index 000000000..d581cb3e8 --- /dev/null +++ b/drivers/mtd/spi/spi_flash.c @@ -0,0 +1,162 @@ +/* + * SPI flash interface + * + * Copyright (C) 2008 Atmel Corporation + */ +#define DEBUG +#include <common.h> +#include <malloc.h> +#include <spi.h> +#include <spi_flash.h> + +#include "spi_flash_internal.h" + +int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len) +{ +	unsigned long flags = SPI_XFER_BEGIN; +	int ret; + +	if (len == 0) +		flags |= SPI_XFER_END; + +	ret = spi_xfer(spi, 8, &cmd, NULL, flags); +	if (ret) { +		debug("SF: Failed to send command %02x: %d\n", cmd, ret); +		return ret; +	} + +	if (len) { +		ret = spi_xfer(spi, len * 8, NULL, response, SPI_XFER_END); +		if (ret) +			debug("SF: Failed to read response (%zu bytes): %d\n", +					len, ret); +	} + +	return ret; +} + +int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd, +		size_t cmd_len, void *data, size_t data_len) +{ +	unsigned long flags = SPI_XFER_BEGIN; +	int ret; + +	if (data_len == 0) +		flags |= SPI_XFER_END; + +	ret = spi_xfer(spi, cmd_len * 8, cmd, NULL, flags); +	if (ret) { +		debug("SF: Failed to send read command (%zu bytes): %d\n", +				cmd_len, ret); +	} else if (data_len != 0) { +		ret = spi_xfer(spi, data_len * 8, NULL, data, SPI_XFER_END); +		if (ret) +			debug("SF: Failed to read %zu bytes of data: %d\n", +					data_len, ret); +	} + +	return ret; +} + +int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len, +		const void *data, size_t data_len) +{ +	unsigned long flags = SPI_XFER_BEGIN; +	int ret; + +	if (data_len == 0) +		flags |= SPI_XFER_END; + +	ret = spi_xfer(spi, cmd_len * 8, cmd, NULL, flags); +	if (ret) { +		debug("SF: Failed to send read command (%zu bytes): %d\n", +				cmd_len, ret); +	} else if (data_len != 0) { +		ret = spi_xfer(spi, data_len * 8, data, NULL, SPI_XFER_END); +		if (ret) +			debug("SF: Failed to read %zu bytes of data: %d\n", +					data_len, ret); +	} + +	return ret; +} + + +int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd, +		size_t cmd_len, void *data, size_t data_len) +{ +	struct spi_slave *spi = flash->spi; +	int ret; + +	spi_claim_bus(spi); +	ret = spi_flash_cmd_read(spi, cmd, cmd_len, data, data_len); +	spi_release_bus(spi); + +	return ret; +} + +struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs, +		unsigned int max_hz, unsigned int spi_mode) +{ +	struct spi_slave *spi; +	struct spi_flash *flash; +	int ret; +	u8 idcode[3]; + +	spi = spi_setup_slave(bus, cs, max_hz, spi_mode); +	if (!spi) { +		debug("SF: Failed to set up slave\n"); +		return NULL; +	} + +	ret = spi_claim_bus(spi); +	if (ret) { +		debug("SF: Failed to claim SPI bus: %d\n", ret); +		goto err_claim_bus; +	} + +	/* Read the ID codes */ +	ret = spi_flash_cmd(spi, CMD_READ_ID, &idcode, sizeof(idcode)); +	if (ret) +		goto err_read_id; + +	debug("SF: Got idcode %02x %02x %02x\n", idcode[0], +			idcode[1], idcode[2]); + +	switch (idcode[0]) { +#ifdef CONFIG_SPI_FLASH_SPANSION +	case 0x01: +		flash = spi_flash_probe_spansion(spi, idcode); +		break; +#endif +#ifdef CONFIG_SPI_FLASH_ATMEL +	case 0x1F: +		flash = spi_flash_probe_atmel(spi, idcode); +		break; +#endif +	default: +		debug("SF: Unsupported manufacturer %02X\n", idcode[0]); +		flash = NULL; +		break; +	} + +	if (!flash) +		goto err_manufacturer_probe; + +	spi_release_bus(spi); + +	return flash; + +err_manufacturer_probe: +err_read_id: +	spi_release_bus(spi); +err_claim_bus: +	spi_free_slave(spi); +	return NULL; +} + +void spi_flash_free(struct spi_flash *flash) +{ +	spi_free_slave(flash->spi); +	free(flash); +} diff --git a/drivers/mtd/spi/spi_flash_internal.h b/drivers/mtd/spi/spi_flash_internal.h new file mode 100644 index 000000000..14380500a --- /dev/null +++ b/drivers/mtd/spi/spi_flash_internal.h @@ -0,0 +1,45 @@ +/* + * SPI flash internal definitions + * + * Copyright (C) 2008 Atmel Corporation + */ + +/* Common parameters */ +#define SPI_FLASH_PROG_TIMEOUT		((10 * CFG_HZ) / 1000) +#define SPI_FLASH_PAGE_ERASE_TIMEOUT	((50 * CFG_HZ) / 1000) +#define SPI_FLASH_SECTOR_ERASE_TIMEOUT	(10 * CFG_HZ) + +/* Common commands */ +#define CMD_READ_ID			0x9f + +#define CMD_READ_ARRAY_SLOW		0x03 +#define CMD_READ_ARRAY_FAST		0x0b +#define CMD_READ_ARRAY_LEGACY		0xe8 + +/* Send a single-byte command to the device and read the response */ +int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len); + +/* + * Send a multi-byte command to the device and read the response. Used + * for flash array reads, etc. + */ +int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd, +		size_t cmd_len, void *data, size_t data_len); + +/* + * Send a multi-byte command to the device followed by (optional) + * data. Used for programming the flash array, etc. + */ +int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len, +		const void *data, size_t data_len); + +/* + * Same as spi_flash_cmd_read() except it also claims/releases the SPI + * bus. Used as common part of the ->read() operation. + */ +int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd, +		size_t cmd_len, void *data, size_t data_len); + +/* Manufacturer-specific probe functions */ +struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode); +struct spi_flash *spi_flash_probe_atmel(struct spi_slave *spi, u8 *idcode); diff --git a/drivers/net/dm9000x.c b/drivers/net/dm9000x.c index 01e2f14a9..68901cd81 100644 --- a/drivers/net/dm9000x.c +++ b/drivers/net/dm9000x.c @@ -300,8 +300,10 @@ eth_init(bd_t * bd)  	DM9000_iow(DM9000_ISR, 0x0f);	/* Clear interrupt status */  	/* Set Node address */ +#ifndef CONFIG_AT91SAM9261EK  	for (i = 0; i < 6; i++)  		((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i); +#endif  	if (is_zero_ether_addr(bd->bi_enetaddr) ||  	    is_multicast_ether_addr(bd->bi_enetaddr)) { diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 703784ee0..e5733f6e5 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -417,13 +417,15 @@ static int macb_init(struct eth_device *netdev, bd_t *bd)  	/* choose RMII or MII mode. This depends on the board */  #ifdef CONFIG_RMII -#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) +#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ +    defined(CONFIG_AT91SAM9263)  	macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));  #else  	macb_writel(macb, USRIO, 0);  #endif  #else -#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) +#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ +    defined(CONFIG_AT91SAM9263)  	macb_writel(macb, USRIO, MACB_BIT(CLKEN));  #else  	macb_writel(macb, USRIO, MACB_BIT(MII)); diff --git a/drivers/rtc/ds1306.c b/drivers/rtc/ds1306.c index 1c8ac7f29..29854fc7c 100644 --- a/drivers/rtc/ds1306.c +++ b/drivers/rtc/ds1306.c @@ -62,13 +62,6 @@  #define	RTC_USER_RAM_BASE	0x20 -/* - * External table of chip select functions (see the appropriate board - * support for the actual definition of the table). - */ -extern spi_chipsel_type spi_chipsel[]; -extern int spi_chipsel_cnt; -  static unsigned int bin2bcd (unsigned int n);  static unsigned char bcd2bin (unsigned char c); @@ -305,11 +298,29 @@ void rtc_reset (void)  static unsigned char rtc_read (unsigned char reg);  static void rtc_write (unsigned char reg, unsigned char val); +static struct spi_slave *slave; +  /* read clock time from DS1306 and return it in *tmp */  int rtc_get (struct rtc_time *tmp)  {  	unsigned char sec, min, hour, mday, wday, mon, year; +	/* +	 * Assuming Vcc = 2.0V (lowest speed) +	 * +	 * REVISIT: If we add an rtc_init() function we can do this +	 * step just once. +	 */ +	if (!slave) { +		slave = spi_setup_slave(0, CFG_SPI_RTC_DEVID, 600000, +				SPI_MODE_3 | SPI_CS_HIGH); +		if (!slave) +			return; +	} + +	if (spi_claim_bus(slave)) +		return; +  	sec = rtc_read (RTC_SECONDS);  	min = rtc_read (RTC_MINUTES);  	hour = rtc_read (RTC_HOURS); @@ -318,6 +329,8 @@ int rtc_get (struct rtc_time *tmp)  	mon = rtc_read (RTC_MONTH);  	year = rtc_read (RTC_YEAR); +	spi_release_bus(slave); +  	debug ("Get RTC year: %02x mon: %02x mday: %02x wday: %02x "  	       "hr: %02x min: %02x sec: %02x\n",  	       year, mon, mday, wday, hour, min, sec); @@ -360,6 +373,17 @@ int rtc_get (struct rtc_time *tmp)  /* set clock time from *tmp in DS1306 RTC */  void rtc_set (struct rtc_time *tmp)  { +	/* Assuming Vcc = 2.0V (lowest speed) */ +	if (!slave) { +		slave = spi_setup_slave(0, CFG_SPI_RTC_DEVID, 600000, +				SPI_MODE_3 | SPI_CS_HIGH); +		if (!slave) +			return; +	} + +	if (spi_claim_bus(slave)) +		return; +  	debug ("Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",  	       tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,  	       tmp->tm_hour, tmp->tm_min, tmp->tm_sec); @@ -371,6 +395,8 @@ void rtc_set (struct rtc_time *tmp)  	rtc_write (RTC_DATE_OF_MONTH, bin2bcd (tmp->tm_mday));  	rtc_write (RTC_MONTH, bin2bcd (tmp->tm_mon));  	rtc_write (RTC_YEAR, bin2bcd (tmp->tm_year - 2000)); + +	spi_release_bus(slave);  }  /* ------------------------------------------------------------------------- */ @@ -378,6 +404,17 @@ void rtc_set (struct rtc_time *tmp)  /* reset the DS1306 */  void rtc_reset (void)  { +	/* Assuming Vcc = 2.0V (lowest speed) */ +	if (!slave) { +		slave = spi_setup_slave(0, CFG_SPI_RTC_DEVID, 600000, +				SPI_MODE_3 | SPI_CS_HIGH); +		if (!slave) +			return; +	} + +	if (spi_claim_bus(slave)) +		return; +  	/* clear the control register */  	rtc_write (RTC_CONTROL, 0x00);	/* 1st step: reset WP */  	rtc_write (RTC_CONTROL, 0x00);	/* 2nd step: reset 1Hz, AIE1, AIE0 */ @@ -391,22 +428,18 @@ void rtc_reset (void)  	rtc_write (RTC_HOURS_ALARM1, 0x00);  	rtc_write (RTC_DAY_OF_WEEK_ALARM0, 0x00);  	rtc_write (RTC_DAY_OF_WEEK_ALARM1, 0x00); + +	spi_release_bus(slave);  }  /* ------------------------------------------------------------------------- */  static unsigned char rtc_read (unsigned char reg)  { -	unsigned char dout[2];	/* SPI Output Data Bytes */ -	unsigned char din[2];	/* SPI Input Data Bytes */ - -	dout[0] = reg; +	int ret; -	if (spi_xfer (spi_chipsel[CFG_SPI_RTC_DEVID], 16, dout, din) != 0) { -		return 0; -	} else { -		return din[1]; -	} +	ret = spi_w8r8(slave, reg); +	return ret < 0 ? 0 : ret;  }  /* ------------------------------------------------------------------------- */ @@ -419,7 +452,7 @@ static void rtc_write (unsigned char reg, unsigned char val)  	dout[0] = 0x80 | reg;  	dout[1] = val; -	spi_xfer (spi_chipsel[CFG_SPI_RTC_DEVID], 16, dout, din); +	spi_xfer (slave, 16, dout, din, SPI_XFER_BEGIN | SPI_XFER_END);  }  #endif /* end of code exclusion (see #ifdef CONFIG_SXNI855T above) */ diff --git a/drivers/rtc/mc13783-rtc.c b/drivers/rtc/mc13783-rtc.c index 35b1b8b25..b6e15014b 100644 --- a/drivers/rtc/mc13783-rtc.c +++ b/drivers/rtc/mc13783-rtc.c @@ -24,34 +24,50 @@  #include <rtc.h>  #include <spi.h> +static struct spi_slave *slave; +  int rtc_get(struct rtc_time *rtc)  {  	u32 day1, day2, time;  	u32 reg;  	int err, tim, i = 0; -	spi_select(1, 0, SPI_MODE_2 | SPI_CS_HIGH); +	if (!slave) { +		/* FIXME: Verify the max SCK rate */ +		slave = spi_setup_slave(1, 0, 1000000, +				SPI_MODE_2 | SPI_CS_HIGH); +		if (!slave) +			return -1; +	} + +	if (spi_claim_bus(slave)) +		return -1;  	do {  		reg = 0x2c000000; -		err = spi_xfer(0, 32, (uchar *)®, (uchar *)&day1); +		err = spi_xfer(slave, 32, (uchar *)®, (uchar *)&day1, +				SPI_XFER_BEGIN | SPI_XFER_END);  		if (err)  			return err;  		reg = 0x28000000; -		err = spi_xfer(0, 32, (uchar *)®, (uchar *)&time); +		err = spi_xfer(slave, 32, (uchar *)®, (uchar *)&time, +				SPI_XFER_BEGIN | SPI_XFER_END);  		if (err)  			return err;  		reg = 0x2c000000; -		err = spi_xfer(0, 32, (uchar *)®, (uchar *)&day2); +		err = spi_xfer(slave, 32, (uchar *)®, (uchar *)&day2, +				SPI_XFER_BEGIN | SPI_XFER_END);  		if (err)  			return err;  	} while (day1 != day2 && i++ < 3); +	spi_release_bus(slave); +  	tim = day1 * 86400 + time;  	to_tm(tim, rtc); @@ -65,16 +81,31 @@ void rtc_set(struct rtc_time *rtc)  {  	u32 time, day, reg; +	if (!slave) { +		/* FIXME: Verify the max SCK rate */ +		slave = spi_setup_slave(1, 0, 1000000, +				SPI_MODE_2 | SPI_CS_HIGH); +		if (!slave) +			return; +	} +  	time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,  		      rtc->tm_hour, rtc->tm_min, rtc->tm_sec);  	day = time / 86400;  	time %= 86400; +	if (spi_claim_bus(slave)) +		return; +  	reg = 0x2c000000 | day | 0x80000000; -	spi_xfer(0, 32, (uchar *)®, (uchar *)&day); +	spi_xfer(slave, 32, (uchar *)®, (uchar *)&day, +			SPI_XFER_BEGIN | SPI_XFER_END);  	reg = 0x28000000 | time | 0x80000000; -	spi_xfer(0, 32, (uchar *)®, (uchar *)&time); +	spi_xfer(slave, 32, (uchar *)®, (uchar *)&time, +			SPI_XFER_BEGIN | SPI_XFER_END); + +	spi_release_bus(slave);  }  void rtc_reset(void) diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index bc8a10412..e66e0ee09 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile @@ -26,6 +26,7 @@ include $(TOPDIR)/config.mk  LIB	:= $(obj)libspi.a  COBJS-y += mpc8xxx_spi.o +COBJS-$(CONFIG_ATMEL_SPI) += atmel_spi.o  COBJS-$(CONFIG_MXC_SPI) += mxc_spi.o  COBJS	:= $(COBJS-y) diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c new file mode 100644 index 000000000..317c0b41b --- /dev/null +++ b/drivers/spi/atmel_spi.c @@ -0,0 +1,210 @@ +/* + * Copyright (C) 2007 Atmel Corporation + * + * 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 <spi.h> +#include <malloc.h> + +#include <asm/io.h> + +#include <asm/arch/clk.h> +#include <asm/arch/memory-map.h> + +#include "atmel_spi.h" + +void spi_init() +{ + +} + +struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs, +			unsigned int max_hz, unsigned int mode) +{ +	struct atmel_spi_slave	*as; +	unsigned int		scbr; +	u32			csrx; +	void			*regs; + +	if (cs > 3 || !spi_cs_is_valid(bus, cs)) +		return NULL; + +	switch (bus) { +	case 0: +		regs = (void *)SPI0_BASE; +		break; +#ifdef SPI1_BASE +	case 1: +		regs = (void *)SPI1_BASE; +		break; +#endif +#ifdef SPI2_BASE +	case 2: +		regs = (void *)SPI2_BASE; +		break; +#endif +#ifdef SPI3_BASE +	case 3: +		regs = (void *)SPI3_BASE; +		break; +#endif +	default: +		return NULL; +	} + + +	scbr = (get_spi_clk_rate(bus) + max_hz - 1) / max_hz; +	if (scbr > ATMEL_SPI_CSRx_SCBR_MAX) +		/* Too low max SCK rate */ +		return NULL; +	if (scbr < 1) +		scbr = 1; + +	csrx = ATMEL_SPI_CSRx_SCBR(scbr); +	csrx |= ATMEL_SPI_CSRx_BITS(ATMEL_SPI_BITS_8); +	if (!(mode & SPI_CPHA)) +		csrx |= ATMEL_SPI_CSRx_NCPHA; +	if (mode & SPI_CPOL) +		csrx |= ATMEL_SPI_CSRx_CPOL; + +	as = malloc(sizeof(struct atmel_spi_slave)); +	if (!as) +		return NULL; + +	as->slave.bus = bus; +	as->slave.cs = cs; +	as->regs = regs; +	as->mr = ATMEL_SPI_MR_MSTR | ATMEL_SPI_MR_MODFDIS +			| ATMEL_SPI_MR_PCS(~(1 << cs) & 0xf); +	spi_writel(as, CSR(cs), csrx); + +	return &as->slave; +} + +void spi_free_slave(struct spi_slave *slave) +{ +	struct atmel_spi_slave *as = to_atmel_spi(slave); + +	free(as); +} + +int spi_claim_bus(struct spi_slave *slave) +{ +	struct atmel_spi_slave *as = to_atmel_spi(slave); + +	/* Enable the SPI hardware */ +	spi_writel(as, CR, ATMEL_SPI_CR_SPIEN); + +	/* +	 * Select the slave. This should set SCK to the correct +	 * initial state, etc. +	 */ +	spi_writel(as, MR, as->mr); + +	return 0; +} + +void spi_release_bus(struct spi_slave *slave) +{ +	struct atmel_spi_slave *as = to_atmel_spi(slave); + +	/* Disable the SPI hardware */ +	spi_writel(as, CR, ATMEL_SPI_CR_SPIDIS); +} + +int spi_xfer(struct spi_slave *slave, unsigned int bitlen, +		const void *dout, void *din, unsigned long flags) +{ +	struct atmel_spi_slave *as = to_atmel_spi(slave); +	unsigned int	len_tx; +	unsigned int	len_rx; +	unsigned int	len; +	int		ret; +	u32		status; +	const u8	*txp = dout; +	u8		*rxp = din; +	u8		value; + +	ret = 0; +	if (bitlen == 0) +		/* Finish any previously submitted transfers */ +		goto out; + +	/* +	 * TODO: The controller can do non-multiple-of-8 bit +	 * transfers, but this driver currently doesn't support it. +	 * +	 * It's also not clear how such transfers are supposed to be +	 * represented as a stream of bytes...this is a limitation of +	 * the current SPI interface. +	 */ +	if (bitlen % 8) { +		/* Errors always terminate an ongoing transfer */ +		flags |= SPI_XFER_END; +		goto out; +	} + +	len = bitlen / 8; + +	/* +	 * The controller can do automatic CS control, but it is +	 * somewhat quirky, and it doesn't really buy us much anyway +	 * in the context of U-Boot. +	 */ +	if (flags & SPI_XFER_BEGIN) +		spi_cs_activate(slave); + +	for (len_tx = 0, len_rx = 0; len_rx < len; ) { +		status = spi_readl(as, SR); + +		if (status & ATMEL_SPI_SR_OVRES) +			return -1; + +		if (len_tx < len && (status & ATMEL_SPI_SR_TDRE)) { +			if (txp) +				value = *txp++; +			else +				value = 0; +			spi_writel(as, TDR, value); +			len_tx++; +		} +		if (status & ATMEL_SPI_SR_RDRF) { +			value = spi_readl(as, RDR); +			if (rxp) +				*rxp++ = value; +			len_rx++; +		} +	} + +out: +	if (flags & SPI_XFER_END) { +		/* +		 * Wait until the transfer is completely done before +		 * we deactivate CS. +		 */ +		do { +			status = spi_readl(as, SR); +		} while (!(status & ATMEL_SPI_SR_TXEMPTY)); + +		spi_cs_deactivate(slave); +	} + +	return 0; +} diff --git a/drivers/spi/atmel_spi.h b/drivers/spi/atmel_spi.h new file mode 100644 index 000000000..8b69a6d21 --- /dev/null +++ b/drivers/spi/atmel_spi.h @@ -0,0 +1,95 @@ +/* + * Register definitions for the Atmel AT32/AT91 SPI Controller + */ + +/* Register offsets */ +#define ATMEL_SPI_CR			0x0000 +#define ATMEL_SPI_MR			0x0004 +#define ATMEL_SPI_RDR			0x0008 +#define ATMEL_SPI_TDR			0x000c +#define ATMEL_SPI_SR			0x0010 +#define ATMEL_SPI_IER			0x0014 +#define ATMEL_SPI_IDR			0x0018 +#define ATMEL_SPI_IMR			0x001c +#define ATMEL_SPI_CSR(x)		(0x0030 + 4 * (x)) +#define ATMEL_SPI_VERSION		0x00fc + +/* Bits in CR */ +#define ATMEL_SPI_CR_SPIEN		(1 << 0) +#define ATMEL_SPI_CR_SPIDIS		(1 << 1) +#define ATMEL_SPI_CR_SWRST		(1 << 7) +#define ATMEL_SPI_CR_LASTXFER		(1 << 24) + +/* Bits in MR */ +#define ATMEL_SPI_MR_MSTR		(1 << 0) +#define ATMEL_SPI_MR_PS			(1 << 1) +#define ATMEL_SPI_MR_PCSDEC		(1 << 2) +#define ATMEL_SPI_MR_FDIV		(1 << 3) +#define ATMEL_SPI_MR_MODFDIS		(1 << 4) +#define ATMEL_SPI_MR_LLB		(1 << 7) +#define ATMEL_SPI_MR_PCS(x)		(((x) & 15) << 16) +#define ATMEL_SPI_MR_DLYBCS(x)		((x) << 24) + +/* Bits in RDR */ +#define ATMEL_SPI_RDR_RD(x)		(x) +#define ATMEL_SPI_RDR_PCS(x)		((x) << 16) + +/* Bits in TDR */ +#define ATMEL_SPI_TDR_TD(x)		(x) +#define ATMEL_SPI_TDR_PCS(x)		((x) << 16) +#define ATMEL_SPI_TDR_LASTXFER		(1 << 24) + +/* Bits in SR/IER/IDR/IMR */ +#define ATMEL_SPI_SR_RDRF		(1 << 0) +#define ATMEL_SPI_SR_TDRE		(1 << 1) +#define ATMEL_SPI_SR_MODF		(1 << 2) +#define ATMEL_SPI_SR_OVRES		(1 << 3) +#define ATMEL_SPI_SR_ENDRX		(1 << 4) +#define ATMEL_SPI_SR_ENDTX		(1 << 5) +#define ATMEL_SPI_SR_RXBUFF		(1 << 6) +#define ATMEL_SPI_SR_TXBUFE		(1 << 7) +#define ATMEL_SPI_SR_NSSR		(1 << 8) +#define ATMEL_SPI_SR_TXEMPTY		(1 << 9) +#define ATMEL_SPI_SR_SPIENS		(1 << 16) + +/* Bits in CSRx */ +#define ATMEL_SPI_CSRx_CPOL		(1 << 0) +#define ATMEL_SPI_CSRx_NCPHA		(1 << 1) +#define ATMEL_SPI_CSRx_CSAAT		(1 << 3) +#define ATMEL_SPI_CSRx_BITS(x)		((x) << 4) +#define ATMEL_SPI_CSRx_SCBR(x)		((x) << 8) +#define ATMEL_SPI_CSRx_SCBR_MAX		0xff +#define ATMEL_SPI_CSRx_DLYBS(x)		((x) << 16) +#define ATMEL_SPI_CSRx_DLYBCT(x)	((x) << 24) + +/* Bits in VERSION */ +#define ATMEL_SPI_VERSION_REV(x)	((x) << 0) +#define ATMEL_SPI_VERSION_MFN(x)	((x) << 16) + +/* Constants for CSRx:BITS */ +#define ATMEL_SPI_BITS_8		0 +#define ATMEL_SPI_BITS_9		1 +#define ATMEL_SPI_BITS_10		2 +#define ATMEL_SPI_BITS_11		3 +#define ATMEL_SPI_BITS_12		4 +#define ATMEL_SPI_BITS_13		5 +#define ATMEL_SPI_BITS_14		6 +#define ATMEL_SPI_BITS_15		7 +#define ATMEL_SPI_BITS_16		8 + +struct atmel_spi_slave { +	struct spi_slave slave; +	void		*regs; +	u32		mr; +}; + +static inline struct atmel_spi_slave *to_atmel_spi(struct spi_slave *slave) +{ +	return container_of(slave, struct atmel_spi_slave, slave); +} + +/* Register access macros */ +#define spi_readl(as, reg)					\ +	readl(as->regs + ATMEL_SPI_##reg) +#define spi_writel(as, reg, value)				\ +	writel(value, as->regs + ATMEL_SPI_##reg) diff --git a/drivers/spi/mpc8xxx_spi.c b/drivers/spi/mpc8xxx_spi.c index 2fe838c45..136fb5005 100644 --- a/drivers/spi/mpc8xxx_spi.c +++ b/drivers/spi/mpc8xxx_spi.c @@ -24,6 +24,7 @@  #include <common.h>  #if defined(CONFIG_MPC8XXX_SPI) && defined(CONFIG_HARD_SPI) +#include <malloc.h>  #include <spi.h>  #include <asm/mpc8xxx_spi.h> @@ -37,6 +38,34 @@  #define SPI_TIMEOUT	1000 +struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs, +		unsigned int max_hz, unsigned int mode) +{ +	struct spi_slave *slave; + +	if (!spi_cs_is_valid(bus, cs)) +		return NULL; + +	slave = malloc(sizeof(struct spi_slave)); +	if (!slave) +		return NULL; + +	slave->bus = bus; +	slave->cs = cs; + +	/* +	 * TODO: Some of the code in spi_init() should probably move +	 * here, or into spi_claim_bus() below. +	 */ + +	return slave; +} + +void spi_free_slave(struct spi_slave *slave) +{ +	free(slave); +} +  void spi_init(void)  {  	volatile spi8xxx_t *spi = &((immap_t *) (CFG_IMMR))->spi; @@ -53,7 +82,18 @@ void spi_init(void)  	spi->com = 0;		/* LST bit doesn't do anything, so disregard */  } -int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din) +int spi_claim_bus(struct spi_slave *slave) +{ +	return 0; +} + +void spi_release_bus(struct spi_slave *slave) +{ + +} + +int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout, +		void *din, unsigned long flags)  {  	volatile spi8xxx_t *spi = &((immap_t *) (CFG_IMMR))->spi;  	unsigned int tmpdout, tmpdin, event; @@ -61,11 +101,11 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)  	int tm, isRead = 0;  	unsigned char charSize = 32; -	debug("spi_xfer: chipsel %08X dout %08X din %08X bitlen %d\n", -	      (int)chipsel, *(uint *) dout, *(uint *) din, bitlen); +	debug("spi_xfer: slave %u:%u dout %08X din %08X bitlen %u\n", +	      slave->bus, slave->cs, *(uint *) dout, *(uint *) din, bitlen); -	if (chipsel != NULL) -		(*chipsel) (1);	/* select the target chip */ +	if (flags & SPI_XFER_BEGIN) +		spi_cs_activate(slave);  	spi->event = 0xffffffff;	/* Clear all SPI events */ @@ -135,8 +175,8 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)  		debug("*** spi_xfer: transfer ended. Value=%08x\n", tmpdin);  	} -	if (chipsel != NULL) -		(*chipsel) (0);	/* deselect the target chip */ +	if (flags & SPI_XFER_END) +		spi_cs_deactivate(slave);  	return 0;  } diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c index c166ec502..5957ada3a 100644 --- a/drivers/spi/mxc_spi.c +++ b/drivers/spi/mxc_spi.c @@ -19,6 +19,7 @@   */  #include <common.h> +#include <malloc.h>  #include <spi.h>  #include <asm/io.h> @@ -61,17 +62,18 @@ static unsigned long spi_bases[] = {  	0x53f84000,  }; -static unsigned long spi_base; -  #endif -spi_chipsel_type spi_chipsel[] = { -	(spi_chipsel_type)0, -	(spi_chipsel_type)1, -	(spi_chipsel_type)2, -	(spi_chipsel_type)3, +struct mxc_spi_slave { +	struct spi_slave slave; +	unsigned long	base; +	u32		ctrl_reg;  }; -int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]); + +static inline struct mxc_spi_slave *to_mxc_spi_slave(struct spi_slave *slave) +{ +	return container_of(slave, struct mxc_spi_slave, slave); +}  static inline u32 reg_read(unsigned long addr)  { @@ -83,30 +85,31 @@ static inline void reg_write(unsigned long addr, u32 val)  	*(volatile unsigned long*)addr = val;  } -static u32 spi_xchg_single(u32 data, int bitlen) +static u32 spi_xchg_single(struct spi_slave *slave, u32 data, int bitlen)  { - -	unsigned int cfg_reg = reg_read(spi_base + MXC_CSPICTRL); +	struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave); +	unsigned int cfg_reg = reg_read(mxcs->base + MXC_CSPICTRL);  	if (MXC_CSPICTRL_BITCOUNT(bitlen - 1) != (cfg_reg & MXC_CSPICTRL_BITCOUNT(31))) {  		cfg_reg = (cfg_reg & ~MXC_CSPICTRL_BITCOUNT(31)) |  			MXC_CSPICTRL_BITCOUNT(bitlen - 1); -		reg_write(spi_base + MXC_CSPICTRL, cfg_reg); +		reg_write(mxcs->base + MXC_CSPICTRL, cfg_reg);  	} -	reg_write(spi_base + MXC_CSPITXDATA, data); +	reg_write(mxcs->base + MXC_CSPITXDATA, data);  	cfg_reg |= MXC_CSPICTRL_XCH; -	reg_write(spi_base + MXC_CSPICTRL, cfg_reg); +	reg_write(mxcs->base + MXC_CSPICTRL, cfg_reg); -	while (reg_read(spi_base + MXC_CSPICTRL) & MXC_CSPICTRL_XCH) +	while (reg_read(mxcs->base + MXC_CSPICTRL) & MXC_CSPICTRL_XCH)  		; -	return reg_read(spi_base + MXC_CSPIRXDATA); +	return reg_read(mxcs->base + MXC_CSPIRXDATA);  } -int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din) +int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout, +		void *din, unsigned long flags)  {  	int n_blks = (bitlen + 31) / 32;  	u32 *out_l, *in_l; @@ -117,13 +120,10 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)  		return 1;  	} -	if (!spi_base) -		spi_select(CONFIG_MXC_SPI_IFACE, (int)chipsel, SPI_MODE_2 | SPI_CS_HIGH); -  	for (i = 0, in_l = (u32 *)din, out_l = (u32 *)dout;  	     i < n_blks;  	     i++, in_l++, out_l++, bitlen -= 32) -		*in_l = spi_xchg_single(*out_l, bitlen); +		*in_l = spi_xchg_single(slave, *out_l, bitlen);  	return 0;  } @@ -132,17 +132,17 @@ void spi_init(void)  {  } -int spi_select(unsigned int bus, unsigned int dev, unsigned long mode) +struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs, +			unsigned int max_hz, unsigned int mode)  {  	unsigned int ctrl_reg; +	struct mxc_spi_slave *mxcs;  	if (bus >= sizeof(spi_bases) / sizeof(spi_bases[0]) || -	    dev > 3) -		return 1; - -	spi_base = spi_bases[bus]; +	    cs > 3) +		return NULL; -	ctrl_reg = MXC_CSPICTRL_CHIPSELECT(dev) | +	ctrl_reg = MXC_CSPICTRL_CHIPSELECT(cs) |  		MXC_CSPICTRL_BITCOUNT(31) |  		MXC_CSPICTRL_DATARATE(7) | /* FIXME: calculate data rate */  		MXC_CSPICTRL_EN | @@ -155,12 +155,38 @@ int spi_select(unsigned int bus, unsigned int dev, unsigned long mode)  	if (mode & SPI_CS_HIGH)  		ctrl_reg |= MXC_CSPICTRL_SSPOL; -	reg_write(spi_base + MXC_CSPIRESET, 1); +	mxcs = malloc(sizeof(struct mxc_spi_slave)); +	if (!mxcs) +		return NULL; + +	mxcs->slave.bus = bus; +	mxcs->slave.cs = cs; +	mxcs->base = spi_bases[bus]; +	mxcs->ctrl_reg = ctrl_reg; + +	return &mxcs->slave; +} + +void spi_free_slave(struct spi_slave *slave) +{ +	free(slave); +} + +int spi_claim_bus(struct spi_slave *slave) +{ +	struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave); + +	reg_write(mxcs->base + MXC_CSPIRESET, 1);  	udelay(1); -	reg_write(spi_base + MXC_CSPICTRL, ctrl_reg); -	reg_write(spi_base + MXC_CSPIPERIOD, +	reg_write(mxcs->base + MXC_CSPICTRL, mxcs->ctrl_reg); +	reg_write(mxcs->base + MXC_CSPIPERIOD,  		  MXC_CSPIPERIOD_32KHZ); -	reg_write(spi_base + MXC_CSPIINT, 0); +	reg_write(mxcs->base + MXC_CSPIINT, 0);  	return 0;  } + +void spi_release_bus(struct spi_slave *slave) +{ +	/* TODO: Shut the controller down */ +} diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 9d2f65b7f..20a54c54d 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -26,6 +26,7 @@ include $(TOPDIR)/config.mk  LIB	:= $(obj)libvideo.a  COBJS-y += ati_radeon_fb.o +COBJS-$(CONFIG_ATMEL_LCD) += atmel_lcdfb.o  COBJS-y += cfb_console.o  COBJS-y += ct69000.o  COBJS-y += mb862xx.o diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c new file mode 100644 index 000000000..27df44966 --- /dev/null +++ b/drivers/video/atmel_lcdfb.c @@ -0,0 +1,160 @@ +/* + * Driver for AT91/AT32 LCD Controller + * + * Copyright (C) 2007 Atmel Corporation + * + * 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/gpio.h> +#include <asm/arch/clk.h> +#include <lcd.h> +#include <atmel_lcdc.h> + +int lcd_line_length; +int lcd_color_fg; +int lcd_color_bg; + +void *lcd_base;				/* Start of framebuffer memory	*/ +void *lcd_console_address;		/* Start of console buffer	*/ + +short console_col; +short console_row; + +/* configurable parameters */ +#define ATMEL_LCDC_CVAL_DEFAULT		0xc8 +#define ATMEL_LCDC_DMA_BURST_LEN	8 + +#if defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91CAP9) +#define ATMEL_LCDC_FIFO_SIZE		2048 +#else +#define ATMEL_LCDC_FIFO_SIZE		512 +#endif + +#define lcdc_readl(mmio, reg)		__raw_readl((mmio)+(reg)) +#define lcdc_writel(mmio, reg, val)	__raw_writel((val), (mmio)+(reg)) + +void lcd_setcolreg(ushort regno, ushort red, ushort green, ushort blue) +{ +#if defined(CONFIG_ATMEL_LCD_BGR555) +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_LUT(regno), +		    (red >> 3) | ((green & 0xf8) << 2) | ((blue & 0xf8) << 7)); +#else +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_LUT(regno), +		    (blue >> 3) | ((green & 0xfc) << 3) | ((red & 0xf8) << 8)); +#endif +} + +void lcd_ctrl_init(void *lcdbase) +{ +	unsigned long value; + +	/* Turn off the LCD controller and the DMA controller */ +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_PWRCON, +		    1 << ATMEL_LCDC_GUARDT_OFFSET); + +	/* Wait for the LCDC core to become idle */ +	while (lcdc_readl(panel_info.mmio, ATMEL_LCDC_PWRCON) & ATMEL_LCDC_BUSY) +		udelay(10); + +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_DMACON, 0); + +	/* Reset LCDC DMA */ +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_DMACON, ATMEL_LCDC_DMARST); + +	/* ...set frame size and burst length = 8 words (?) */ +	value = (panel_info.vl_col * panel_info.vl_row * +		 NBITS(panel_info.vl_bpix)) / 32; +	value |= ((ATMEL_LCDC_DMA_BURST_LEN - 1) << ATMEL_LCDC_BLENGTH_OFFSET); +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_DMAFRMCFG, value); + +	/* Set pixel clock */ +	value = get_lcdc_clk_rate(0) / panel_info.vl_clk; +	if (get_lcdc_clk_rate(0) % panel_info.vl_clk) +		value++; +	value = (value / 2) - 1; + +	if (!value) { +		lcdc_writel(panel_info.mmio, ATMEL_LCDC_LCDCON1, ATMEL_LCDC_BYPASS); +	} else +		lcdc_writel(panel_info.mmio, ATMEL_LCDC_LCDCON1, +			    value << ATMEL_LCDC_CLKVAL_OFFSET); + +	/* Initialize control register 2 */ +	value = ATMEL_LCDC_MEMOR_LITTLE | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE; +	if (panel_info.vl_tft) +		value |= ATMEL_LCDC_DISTYPE_TFT; + +	if (!(panel_info.vl_sync & ATMEL_LCDC_INVLINE_INVERTED)) +		value |= ATMEL_LCDC_INVLINE_INVERTED; +	if (!(panel_info.vl_sync & ATMEL_LCDC_INVFRAME_INVERTED)) +		value |= ATMEL_LCDC_INVFRAME_INVERTED; +	value |= (panel_info.vl_bpix << 5); +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_LCDCON2, value); + +	/* Vertical timing */ +	value = (panel_info.vl_vsync_len - 1) << ATMEL_LCDC_VPW_OFFSET; +	value |= panel_info.vl_upper_margin << ATMEL_LCDC_VBP_OFFSET; +	value |= panel_info.vl_lower_margin; +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_TIM1, value); + +	/* Horizontal timing */ +	value = (panel_info.vl_right_margin - 1) << ATMEL_LCDC_HFP_OFFSET; +	value |= (panel_info.vl_hsync_len - 1) << ATMEL_LCDC_HPW_OFFSET; +	value |= (panel_info.vl_left_margin - 1); +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_TIM2, value); + +	/* Display size */ +	value = (panel_info.vl_col - 1) << ATMEL_LCDC_HOZVAL_OFFSET; +	value |= panel_info.vl_row - 1; +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_LCDFRMCFG, value); + +	/* FIFO Threshold: Use formula from data sheet */ +	value = ATMEL_LCDC_FIFO_SIZE - (2 * ATMEL_LCDC_DMA_BURST_LEN + 3); +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_FIFO, value); + +	/* Toggle LCD_MODE every frame */ +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_MVAL, 0); + +	/* Disable all interrupts */ +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_IDR, ~0UL); + +	/* Set contrast */ +	value = ATMEL_LCDC_PS_DIV8 | +		ATMEL_LCDC_POL_POSITIVE | +		ATMEL_LCDC_ENA_PWMENABLE; +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_CONTRAST_CTR, value); +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_CONTRAST_VAL, ATMEL_LCDC_CVAL_DEFAULT); + +	/* Set framebuffer DMA base address and pixel offset */ +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_DMABADDR1, (u_long)lcdbase); + +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_DMACON, ATMEL_LCDC_DMAEN); +	lcdc_writel(panel_info.mmio, ATMEL_LCDC_PWRCON, +		    (1 << ATMEL_LCDC_GUARDT_OFFSET) | ATMEL_LCDC_PWR); +} + +ulong calc_fbsize(void) +{ +	return ((panel_info.vl_col * panel_info.vl_row * +		NBITS(panel_info.vl_bpix)) / 8) + PAGE_SIZE; +} diff --git a/fs/jffs2/jffs2_1pass.c b/fs/jffs2/jffs2_1pass.c index 1993dc235..7e27ee18a 100644 --- a/fs/jffs2/jffs2_1pass.c +++ b/fs/jffs2/jffs2_1pass.c @@ -164,9 +164,6 @@ static struct part_info *current_part;  /* this one defined in nand_legacy.c */  int read_jffs2_nand(size_t start, size_t len,  		size_t * retlen, u_char * buf, int nanddev); -#else -/* info for NAND chips, defined in drivers/mtd/nand/nand.c */ -extern nand_info_t nand_info[];  #endif  #define NAND_PAGE_SIZE 512 diff --git a/include/ACEX1K.h b/include/ACEX1K.h index 6ea0eed95..354e0f0e4 100644 --- a/include/ACEX1K.h +++ b/include/ACEX1K.h @@ -77,6 +77,8 @@ typedef struct {  #endif  #define Altera_EP1K100_SIZE	(166965*8) +#define Altera_EP2C8_SIZE	247942 +#define Altera_EP2C20_SIZE	586562  #define Altera_EP2C35_SIZE	883905  /* Descriptor Macros diff --git a/include/asm-arm/arch-at91sam9/at91_pmc.h b/include/asm-arm/arch-at91sam9/at91_pmc.h index 103be8699..b57875d79 100644 --- a/include/asm-arm/arch-at91sam9/at91_pmc.h +++ b/include/asm-arm/arch-at91sam9/at91_pmc.h @@ -96,4 +96,9 @@  #define		AT91_PMC_PCK3RDY	(1 << 11)		/* Programmable Clock 3 */  #define	AT91_PMC_IMR		(AT91_PMC + 0x6c)	/* Interrupt Mask Register */ +#define AT91_PMC_PROT		(AT91_PMC + 0xe4)	/* Protect Register [AT91CAP9 revC only] */ +#define		AT91_PMC_PROTKEY	0x504d4301		/* Activation Code */ + +#define AT91_PMC_VER	(AT91_PMC + 0xfc)	/* PMC Module Version [AT91CAP9 only] */ +  #endif diff --git a/include/asm-arm/arch-at91sam9/at91cap9.h b/include/asm-arm/arch-at91sam9/at91cap9.h index d1b33a069..0b5222813 100644 --- a/include/asm-arm/arch-at91sam9/at91cap9.h +++ b/include/asm-arm/arch-at91sam9/at91cap9.h @@ -101,13 +101,25 @@  #define AT91_RTT	(0xfffffd20 - AT91_BASE_SYS)  #define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)  #define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS) -#define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS) +#define AT91_SCKCR	(0xfffffd50 - AT91_BASE_SYS) +#define AT91_GPBR_REVB	(0xfffffd50 - AT91_BASE_SYS) +#define AT91_GPBR_REVC	(0xfffffd60 - AT91_BASE_SYS)  #define AT91_USART0	AT91CAP9_BASE_US0  #define AT91_USART1	AT91CAP9_BASE_US1  #define AT91_USART2	AT91CAP9_BASE_US2  /* + * SCKCR flags + */ +#define AT91CAP9_SCKCR_RCEN	(1 << 0)	/* RC Oscillator Enable */ +#define AT91CAP9_SCKCR_OSC32EN	(1 << 1)	/* 32kHz Oscillator Enable */ +#define AT91CAP9_SCKCR_OSC32BYP	(1 << 2)	/* 32kHz Oscillator Bypass */ +#define AT91CAP9_SCKCR_OSCSEL	(1 << 3)	/* Slow Clock Selector */ +#define		AT91CAP9_SCKCR_OSCSEL_RC	(0 << 3) +#define		AT91CAP9_SCKCR_OSCSEL_32	(1 << 3) + +/*   * Internal Memory.   */  #define AT91CAP9_SRAM_BASE	0x00100000	/* Internal SRAM base address */ diff --git a/include/asm-arm/arch-at91sam9/at91sam9261.h b/include/asm-arm/arch-at91sam9/at91sam9261.h new file mode 100644 index 000000000..752d81dfe --- /dev/null +++ b/include/asm-arm/arch-at91sam9/at91sam9261.h @@ -0,0 +1,105 @@ +/* + * [origin: Linux kernel include/asm-arm/arch-at91/at91sam9261.h] + * + * Copyright (C) SAN People + * + * Common definitions. + * Based on AT91SAM9261 datasheet revision E. (Preliminary) + * + * 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. + */ + +#ifndef AT91SAM9261_H +#define AT91SAM9261_H + +/* + * Peripheral identifiers/interrupts. + */ +#define AT91_ID_FIQ		0	/* Advanced Interrupt Controller (FIQ) */ +#define AT91_ID_SYS		1	/* System Peripherals */ +#define AT91SAM9261_ID_PIOA	2	/* Parallel IO Controller A */ +#define AT91SAM9261_ID_PIOB	3	/* Parallel IO Controller B */ +#define AT91SAM9261_ID_PIOC	4	/* Parallel IO Controller C */ +#define AT91SAM9261_ID_US0	6	/* USART 0 */ +#define AT91SAM9261_ID_US1	7	/* USART 1 */ +#define AT91SAM9261_ID_US2	8	/* USART 2 */ +#define AT91SAM9261_ID_MCI	9	/* Multimedia Card Interface */ +#define AT91SAM9261_ID_UDP	10	/* USB Device Port */ +#define AT91SAM9261_ID_TWI	11	/* Two-Wire Interface */ +#define AT91SAM9261_ID_SPI0	12	/* Serial Peripheral Interface 0 */ +#define AT91SAM9261_ID_SPI1	13	/* Serial Peripheral Interface 1 */ +#define AT91SAM9261_ID_SSC0	14	/* Serial Synchronous Controller 0 */ +#define AT91SAM9261_ID_SSC1	15	/* Serial Synchronous Controller 1 */ +#define AT91SAM9261_ID_SSC2	16	/* Serial Synchronous Controller 2 */ +#define AT91SAM9261_ID_TC0	17	/* Timer Counter 0 */ +#define AT91SAM9261_ID_TC1	18	/* Timer Counter 1 */ +#define AT91SAM9261_ID_TC2	19	/* Timer Counter 2 */ +#define AT91SAM9261_ID_UHP	20	/* USB Host port */ +#define AT91SAM9261_ID_LCDC	21	/* LDC Controller */ +#define AT91SAM9261_ID_IRQ0	29	/* Advanced Interrupt Controller (IRQ0) */ +#define AT91SAM9261_ID_IRQ1	30	/* Advanced Interrupt Controller (IRQ1) */ +#define AT91SAM9261_ID_IRQ2	31	/* Advanced Interrupt Controller (IRQ2) */ + + +/* + * User Peripheral physical base addresses. + */ +#define AT91SAM9261_BASE_TCB0		0xfffa0000 +#define AT91SAM9261_BASE_TC0		0xfffa0000 +#define AT91SAM9261_BASE_TC1		0xfffa0040 +#define AT91SAM9261_BASE_TC2		0xfffa0080 +#define AT91SAM9261_BASE_UDP		0xfffa4000 +#define AT91SAM9261_BASE_MCI		0xfffa8000 +#define AT91SAM9261_BASE_TWI		0xfffac000 +#define AT91SAM9261_BASE_US0		0xfffb0000 +#define AT91SAM9261_BASE_US1		0xfffb4000 +#define AT91SAM9261_BASE_US2		0xfffb8000 +#define AT91SAM9261_BASE_SSC0		0xfffbc000 +#define AT91SAM9261_BASE_SSC1		0xfffc0000 +#define AT91SAM9261_BASE_SSC2		0xfffc4000 +#define AT91SAM9261_BASE_SPI0		0xfffc8000 +#define AT91SAM9261_BASE_SPI1		0xfffcc000 +#define AT91_BASE_SYS			0xffffea00 + + +/* + * System Peripherals (offset from AT91_BASE_SYS) + */ +#define AT91_SDRAMC	(0xffffea00 - AT91_BASE_SYS) +#define AT91_SMC	(0xffffec00 - AT91_BASE_SYS) +#define AT91_MATRIX	(0xffffee00 - AT91_BASE_SYS) +#define AT91_AIC	(0xfffff000 - AT91_BASE_SYS) +#define AT91_DBGU	(0xfffff200 - AT91_BASE_SYS) +#define AT91_PIOA	(0xfffff400 - AT91_BASE_SYS) +#define AT91_PIOB	(0xfffff600 - AT91_BASE_SYS) +#define AT91_PIOC	(0xfffff800 - AT91_BASE_SYS) +#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) +#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS) +#define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS) +#define AT91_RTT	(0xfffffd20 - AT91_BASE_SYS) +#define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS) +#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS) +#define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS) + +#define AT91_USART0	AT91SAM9261_BASE_US0 +#define AT91_USART1	AT91SAM9261_BASE_US1 +#define AT91_USART2	AT91SAM9261_BASE_US2 + + +/* + * Internal Memory. + */ +#define AT91SAM9261_SRAM_BASE	0x00300000	/* Internal SRAM base address */ +#define AT91SAM9261_SRAM_SIZE	0x00028000	/* Internal SRAM size (160Kb) */ + +#define AT91SAM9261_ROM_BASE	0x00400000	/* Internal ROM base address */ +#define AT91SAM9261_ROM_SIZE	SZ_32K		/* Internal ROM size (32Kb) */ + +#define AT91SAM9261_UHP_BASE	0x00500000	/* USB Host controller */ +#define AT91SAM9261_LCDC_BASE	0x00600000	/* LDC controller */ + + +#endif diff --git a/include/asm-arm/arch-at91sam9/at91sam9261_matrix.h b/include/asm-arm/arch-at91sam9/at91sam9261_matrix.h new file mode 100644 index 000000000..e2bfc4b0c --- /dev/null +++ b/include/asm-arm/arch-at91sam9/at91sam9261_matrix.h @@ -0,0 +1,64 @@ +/* + * [origin: Linux kernel include/asm-arm/arch-at91/at91sam9261_matrix.h] + * + * Copyright (C) 2007 Atmel Corporation. + * + * Memory Controllers (MATRIX, EBI) - System peripherals registers. + * Based on AT91SAM9261 datasheet revision D. + * + * 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. + */ + +#ifndef AT91SAM9261_MATRIX_H +#define AT91SAM9261_MATRIX_H + +#define AT91_MATRIX_MCFG	(AT91_MATRIX + 0x00)	/* Master Configuration Register */ +#define		AT91_MATRIX_RCB0	(1 << 0)		/* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */ +#define		AT91_MATRIX_RCB1	(1 << 1)		/* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */ + +#define AT91_MATRIX_SCFG0	(AT91_MATRIX + 0x04)	/* Slave Configuration Register 0 */ +#define AT91_MATRIX_SCFG1	(AT91_MATRIX + 0x08)	/* Slave Configuration Register 1 */ +#define AT91_MATRIX_SCFG2	(AT91_MATRIX + 0x0C)	/* Slave Configuration Register 2 */ +#define AT91_MATRIX_SCFG3	(AT91_MATRIX + 0x10)	/* Slave Configuration Register 3 */ +#define AT91_MATRIX_SCFG4	(AT91_MATRIX + 0x14)	/* Slave Configuration Register 4 */ +#define		AT91_MATRIX_SLOT_CYCLE		(0xff << 0)	/* Maximum Number of Allowed Cycles for a Burst */ +#define		AT91_MATRIX_DEFMSTR_TYPE	(3    << 16)	/* Default Master Type */ +#define			AT91_MATRIX_DEFMSTR_TYPE_NONE	(0 << 16) +#define			AT91_MATRIX_DEFMSTR_TYPE_LAST	(1 << 16) +#define			AT91_MATRIX_DEFMSTR_TYPE_FIXED	(2 << 16) +#define		AT91_MATRIX_FIXED_DEFMSTR	(7    << 18)	/* Fixed Index of Default Master */ + +#define AT91_MATRIX_TCR		(AT91_MATRIX + 0x24)	/* TCM Configuration Register */ +#define		AT91_MATRIX_ITCM_SIZE		(0xf << 0)	/* Size of ITCM enabled memory block */ +#define			AT91_MATRIX_ITCM_0		(0 << 0) +#define			AT91_MATRIX_ITCM_16		(5 << 0) +#define			AT91_MATRIX_ITCM_32		(6 << 0) +#define			AT91_MATRIX_ITCM_64		(7 << 0) +#define		AT91_MATRIX_DTCM_SIZE		(0xf << 4)	/* Size of DTCM enabled memory block */ +#define			AT91_MATRIX_DTCM_0		(0 << 4) +#define			AT91_MATRIX_DTCM_16		(5 << 4) +#define			AT91_MATRIX_DTCM_32		(6 << 4) +#define			AT91_MATRIX_DTCM_64		(7 << 4) + +#define AT91_MATRIX_EBICSA	(AT91_MATRIX + 0x30)	/* EBI Chip Select Assignment Register */ +#define		AT91_MATRIX_CS1A		(1 << 1)	/* Chip Select 1 Assignment */ +#define			AT91_MATRIX_CS1A_SMC		(0 << 1) +#define			AT91_MATRIX_CS1A_SDRAMC		(1 << 1) +#define		AT91_MATRIX_CS3A		(1 << 3)	/* Chip Select 3 Assignment */ +#define			AT91_MATRIX_CS3A_SMC		(0 << 3) +#define			AT91_MATRIX_CS3A_SMC_SMARTMEDIA	(1 << 3) +#define		AT91_MATRIX_CS4A		(1 << 4)	/* Chip Select 4 Assignment */ +#define			AT91_MATRIX_CS4A_SMC		(0 << 4) +#define			AT91_MATRIX_CS4A_SMC_CF1	(1 << 4) +#define		AT91_MATRIX_CS5A		(1 << 5)	/* Chip Select 5 Assignment */ +#define			AT91_MATRIX_CS5A_SMC		(0 << 5) +#define			AT91_MATRIX_CS5A_SMC_CF2	(1 << 5) +#define		AT91_MATRIX_DBPUC		(1 << 8)	/* Data Bus Pull-up Configuration */ + +#define AT91_MATRIX_USBPUCR	(AT91_MATRIX + 0x34)	/* USB Pad Pull-Up Control Register */ +#define		AT91_MATRIX_USBPUCR_PUON	(1 << 30)	/* USB Device PAD Pull-up Enable */ + +#endif diff --git a/include/asm-arm/arch-at91sam9/at91sam9263.h b/include/asm-arm/arch-at91sam9/at91sam9263.h new file mode 100644 index 000000000..98251cbee --- /dev/null +++ b/include/asm-arm/arch-at91sam9/at91sam9263.h @@ -0,0 +1,127 @@ +/* + * [origin: Linux kernel include/asm-arm/arch-at91/at91sam9263.h] + * + * (C) 2007 Atmel Corporation. + * + * Common definitions. + * Based on AT91SAM9263 datasheet revision B (Preliminary). + * + * 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. + */ + +#ifndef AT91SAM9263_H +#define AT91SAM9263_H + +/* + * Peripheral identifiers/interrupts. + */ +#define AT91_ID_FIQ		0	/* Advanced Interrupt Controller (FIQ) */ +#define AT91_ID_SYS		1	/* System Peripherals */ +#define AT91SAM9263_ID_PIOA	2	/* Parallel IO Controller A */ +#define AT91SAM9263_ID_PIOB	3	/* Parallel IO Controller B */ +#define AT91SAM9263_ID_PIOCDE	4	/* Parallel IO Controller C, D and E */ +#define AT91SAM9263_ID_US0	7	/* USART 0 */ +#define AT91SAM9263_ID_US1	8	/* USART 1 */ +#define AT91SAM9263_ID_US2	9	/* USART 2 */ +#define AT91SAM9263_ID_MCI0	10	/* Multimedia Card Interface 0 */ +#define AT91SAM9263_ID_MCI1	11	/* Multimedia Card Interface 1 */ +#define AT91SAM9263_ID_CAN	12	/* CAN */ +#define AT91SAM9263_ID_TWI	13	/* Two-Wire Interface */ +#define AT91SAM9263_ID_SPI0	14	/* Serial Peripheral Interface 0 */ +#define AT91SAM9263_ID_SPI1	15	/* Serial Peripheral Interface 1 */ +#define AT91SAM9263_ID_SSC0	16	/* Serial Synchronous Controller 0 */ +#define AT91SAM9263_ID_SSC1	17	/* Serial Synchronous Controller 1 */ +#define AT91SAM9263_ID_AC97C	18	/* AC97 Controller */ +#define AT91SAM9263_ID_TCB	19	/* Timer Counter 0, 1 and 2 */ +#define AT91SAM9263_ID_PWMC	20	/* Pulse Width Modulation Controller */ +#define AT91SAM9263_ID_EMAC	21	/* Ethernet */ +#define AT91SAM9263_ID_2DGE	23	/* 2D Graphic Engine */ +#define AT91SAM9263_ID_UDP	24	/* USB Device Port */ +#define AT91SAM9263_ID_ISI	25	/* Image Sensor Interface */ +#define AT91SAM9263_ID_LCDC	26	/* LCD Controller */ +#define AT91SAM9263_ID_DMA	27	/* DMA Controller */ +#define AT91SAM9263_ID_UHP	29	/* USB Host port */ +#define AT91SAM9263_ID_IRQ0	30	/* Advanced Interrupt Controller (IRQ0) */ +#define AT91SAM9263_ID_IRQ1	31	/* Advanced Interrupt Controller (IRQ1) */ + + +/* + * User Peripheral physical base addresses. + */ +#define AT91SAM9263_BASE_UDP		0xfff78000 +#define AT91SAM9263_BASE_TCB0		0xfff7c000 +#define AT91SAM9263_BASE_TC0		0xfff7c000 +#define AT91SAM9263_BASE_TC1		0xfff7c040 +#define AT91SAM9263_BASE_TC2		0xfff7c080 +#define AT91SAM9263_BASE_MCI0		0xfff80000 +#define AT91SAM9263_BASE_MCI1		0xfff84000 +#define AT91SAM9263_BASE_TWI		0xfff88000 +#define AT91SAM9263_BASE_US0		0xfff8c000 +#define AT91SAM9263_BASE_US1		0xfff90000 +#define AT91SAM9263_BASE_US2		0xfff94000 +#define AT91SAM9263_BASE_SSC0		0xfff98000 +#define AT91SAM9263_BASE_SSC1		0xfff9c000 +#define AT91SAM9263_BASE_AC97C		0xfffa0000 +#define AT91SAM9263_BASE_SPI0		0xfffa4000 +#define AT91SAM9263_BASE_SPI1		0xfffa8000 +#define AT91SAM9263_BASE_CAN		0xfffac000 +#define AT91SAM9263_BASE_PWMC		0xfffb8000 +#define AT91SAM9263_BASE_EMAC		0xfffbc000 +#define AT91SAM9263_BASE_ISI		0xfffc4000 +#define AT91SAM9263_BASE_2DGE		0xfffc8000 +#define AT91_BASE_SYS			0xffffe000 + +/* + * System Peripherals (offset from AT91_BASE_SYS) + */ +#define AT91_ECC0	(0xffffe000 - AT91_BASE_SYS) +#define AT91_SDRAMC0	(0xffffe200 - AT91_BASE_SYS) +#define AT91_SMC0	(0xffffe400 - AT91_BASE_SYS) +#define AT91_ECC1	(0xffffe600 - AT91_BASE_SYS) +#define AT91_SDRAMC1	(0xffffe800 - AT91_BASE_SYS) +#define AT91_SMC1	(0xffffea00 - AT91_BASE_SYS) +#define AT91_MATRIX	(0xffffec00 - AT91_BASE_SYS) +#define AT91_CCFG	(0xffffed10 - AT91_BASE_SYS) +#define AT91_DBGU	(0xffffee00 - AT91_BASE_SYS) +#define AT91_AIC	(0xfffff000 - AT91_BASE_SYS) +#define AT91_PIOA	(0xfffff200 - AT91_BASE_SYS) +#define AT91_PIOB	(0xfffff400 - AT91_BASE_SYS) +#define AT91_PIOC	(0xfffff600 - AT91_BASE_SYS) +#define AT91_PIOD	(0xfffff800 - AT91_BASE_SYS) +#define AT91_PIOE	(0xfffffa00 - AT91_BASE_SYS) +#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) +#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS) +#define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS) +#define AT91_RTT0	(0xfffffd20 - AT91_BASE_SYS) +#define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS) +#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS) +#define AT91_RTT1	(0xfffffd50 - AT91_BASE_SYS) +#define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS) + +#define AT91_USART0	AT91SAM9263_BASE_US0 +#define AT91_USART1	AT91SAM9263_BASE_US1 +#define AT91_USART2	AT91SAM9263_BASE_US2 + +#define AT91_SMC	AT91_SMC0 + +/* + * Internal Memory. + */ +#define AT91SAM9263_SRAM0_BASE	0x00300000	/* Internal SRAM 0 base address */ +#define AT91SAM9263_SRAM0_SIZE	(80 * SZ_1K)	/* Internal SRAM 0 size (80Kb) */ + +#define AT91SAM9263_ROM_BASE	0x00400000	/* Internal ROM base address */ +#define AT91SAM9263_ROM_SIZE	SZ_128K		/* Internal ROM size (128Kb) */ + +#define AT91SAM9263_SRAM1_BASE	0x00500000	/* Internal SRAM 1 base address */ +#define AT91SAM9263_SRAM1_SIZE	SZ_16K		/* Internal SRAM 1 size (16Kb) */ + +#define AT91SAM9263_LCDC_BASE	0x00700000	/* LCD Controller */ +#define AT91SAM9263_DMAC_BASE	0x00800000	/* DMA Controller */ +#define AT91SAM9263_UHP_BASE	0x00a00000	/* USB Host controller */ + + +#endif diff --git a/include/asm-arm/arch-at91sam9/at91sam9263_matrix.h b/include/asm-arm/arch-at91sam9/at91sam9263_matrix.h new file mode 100644 index 000000000..83aaaab77 --- /dev/null +++ b/include/asm-arm/arch-at91sam9/at91sam9263_matrix.h @@ -0,0 +1,129 @@ +/* + * [origin: Linux kernel include/asm-arm/arch-at91/at91sam9263_matrix.h] + * + *  Copyright (C) 2006 Atmel Corporation. + * + * Memory Controllers (MATRIX, EBI) - System peripherals registers. + * Based on AT91SAM9263 datasheet revision B (Preliminary). + * + * 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. + */ + +#ifndef AT91SAM9263_MATRIX_H +#define AT91SAM9263_MATRIX_H + +#define AT91_MATRIX_MCFG0	(AT91_MATRIX + 0x00)	/* Master Configuration Register 0 */ +#define AT91_MATRIX_MCFG1	(AT91_MATRIX + 0x04)	/* Master Configuration Register 1 */ +#define AT91_MATRIX_MCFG2	(AT91_MATRIX + 0x08)	/* Master Configuration Register 2 */ +#define AT91_MATRIX_MCFG3	(AT91_MATRIX + 0x0C)	/* Master Configuration Register 3 */ +#define AT91_MATRIX_MCFG4	(AT91_MATRIX + 0x10)	/* Master Configuration Register 4 */ +#define AT91_MATRIX_MCFG5	(AT91_MATRIX + 0x14)	/* Master Configuration Register 5 */ +#define AT91_MATRIX_MCFG6	(AT91_MATRIX + 0x18)	/* Master Configuration Register 6 */ +#define AT91_MATRIX_MCFG7	(AT91_MATRIX + 0x1C)	/* Master Configuration Register 7 */ +#define AT91_MATRIX_MCFG8	(AT91_MATRIX + 0x20)	/* Master Configuration Register 8 */ +#define		AT91_MATRIX_ULBT	(7 << 0)	/* Undefined Length Burst Type */ +#define			AT91_MATRIX_ULBT_INFINITE	(0 << 0) +#define			AT91_MATRIX_ULBT_SINGLE		(1 << 0) +#define			AT91_MATRIX_ULBT_FOUR		(2 << 0) +#define			AT91_MATRIX_ULBT_EIGHT		(3 << 0) +#define			AT91_MATRIX_ULBT_SIXTEEN	(4 << 0) + +#define AT91_MATRIX_SCFG0	(AT91_MATRIX + 0x40)	/* Slave Configuration Register 0 */ +#define AT91_MATRIX_SCFG1	(AT91_MATRIX + 0x44)	/* Slave Configuration Register 1 */ +#define AT91_MATRIX_SCFG2	(AT91_MATRIX + 0x48)	/* Slave Configuration Register 2 */ +#define AT91_MATRIX_SCFG3	(AT91_MATRIX + 0x4C)	/* Slave Configuration Register 3 */ +#define AT91_MATRIX_SCFG4	(AT91_MATRIX + 0x50)	/* Slave Configuration Register 4 */ +#define AT91_MATRIX_SCFG5	(AT91_MATRIX + 0x54)	/* Slave Configuration Register 5 */ +#define AT91_MATRIX_SCFG6	(AT91_MATRIX + 0x58)	/* Slave Configuration Register 6 */ +#define AT91_MATRIX_SCFG7	(AT91_MATRIX + 0x5C)	/* Slave Configuration Register 7 */ +#define		AT91_MATRIX_SLOT_CYCLE		(0xff << 0)	/* Maximum Number of Allowed Cycles for a Burst */ +#define		AT91_MATRIX_DEFMSTR_TYPE	(3    << 16)	/* Default Master Type */ +#define			AT91_MATRIX_DEFMSTR_TYPE_NONE	(0 << 16) +#define			AT91_MATRIX_DEFMSTR_TYPE_LAST	(1 << 16) +#define			AT91_MATRIX_DEFMSTR_TYPE_FIXED	(2 << 16) +#define		AT91_MATRIX_FIXED_DEFMSTR	(0xf  << 18)	/* Fixed Index of Default Master */ +#define		AT91_MATRIX_ARBT		(3    << 24)	/* Arbitration Type */ +#define			AT91_MATRIX_ARBT_ROUND_ROBIN	(0 << 24) +#define			AT91_MATRIX_ARBT_FIXED_PRIORITY	(1 << 24) + +#define AT91_MATRIX_PRAS0	(AT91_MATRIX + 0x80)	/* Priority Register A for Slave 0 */ +#define AT91_MATRIX_PRBS0	(AT91_MATRIX + 0x84)	/* Priority Register B for Slave 0 */ +#define AT91_MATRIX_PRAS1	(AT91_MATRIX + 0x88)	/* Priority Register A for Slave 1 */ +#define AT91_MATRIX_PRBS1	(AT91_MATRIX + 0x8C)	/* Priority Register B for Slave 1 */ +#define AT91_MATRIX_PRAS2	(AT91_MATRIX + 0x90)	/* Priority Register A for Slave 2 */ +#define AT91_MATRIX_PRBS2	(AT91_MATRIX + 0x94)	/* Priority Register B for Slave 2 */ +#define AT91_MATRIX_PRAS3	(AT91_MATRIX + 0x98)	/* Priority Register A for Slave 3 */ +#define AT91_MATRIX_PRBS3	(AT91_MATRIX + 0x9C)	/* Priority Register B for Slave 3 */ +#define AT91_MATRIX_PRAS4	(AT91_MATRIX + 0xA0)	/* Priority Register A for Slave 4 */ +#define AT91_MATRIX_PRBS4	(AT91_MATRIX + 0xA4)	/* Priority Register B for Slave 4 */ +#define AT91_MATRIX_PRAS5	(AT91_MATRIX + 0xA8)	/* Priority Register A for Slave 5 */ +#define AT91_MATRIX_PRBS5	(AT91_MATRIX + 0xAC)	/* Priority Register B for Slave 5 */ +#define AT91_MATRIX_PRAS6	(AT91_MATRIX + 0xB0)	/* Priority Register A for Slave 6 */ +#define AT91_MATRIX_PRBS6	(AT91_MATRIX + 0xB4)	/* Priority Register B for Slave 6 */ +#define AT91_MATRIX_PRAS7	(AT91_MATRIX + 0xB8)	/* Priority Register A for Slave 7 */ +#define AT91_MATRIX_PRBS7	(AT91_MATRIX + 0xBC)	/* Priority Register B for Slave 7 */ +#define		AT91_MATRIX_M0PR		(3 << 0)	/* Master 0 Priority */ +#define		AT91_MATRIX_M1PR		(3 << 4)	/* Master 1 Priority */ +#define		AT91_MATRIX_M2PR		(3 << 8)	/* Master 2 Priority */ +#define		AT91_MATRIX_M3PR		(3 << 12)	/* Master 3 Priority */ +#define		AT91_MATRIX_M4PR		(3 << 16)	/* Master 4 Priority */ +#define		AT91_MATRIX_M5PR		(3 << 20)	/* Master 5 Priority */ +#define		AT91_MATRIX_M6PR		(3 << 24)	/* Master 6 Priority */ +#define		AT91_MATRIX_M7PR		(3 << 28)	/* Master 7 Priority */ +#define		AT91_MATRIX_M8PR		(3 << 0)	/* Master 8 Priority (in Register B) */ + +#define AT91_MATRIX_MRCR	(AT91_MATRIX + 0x100)	/* Master Remap Control Register */ +#define		AT91_MATRIX_RCB0		(1 << 0)	/* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */ +#define		AT91_MATRIX_RCB1		(1 << 1)	/* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */ +#define		AT91_MATRIX_RCB2		(1 << 2) +#define		AT91_MATRIX_RCB3		(1 << 3) +#define		AT91_MATRIX_RCB4		(1 << 4) +#define		AT91_MATRIX_RCB5		(1 << 5) +#define		AT91_MATRIX_RCB6		(1 << 6) +#define		AT91_MATRIX_RCB7		(1 << 7) +#define		AT91_MATRIX_RCB8		(1 << 8) + +#define AT91_MATRIX_TCMR	(AT91_MATRIX + 0x114)	/* TCM Configuration Register */ +#define		AT91_MATRIX_ITCM_SIZE		(0xf << 0)	/* Size of ITCM enabled memory block */ +#define			AT91_MATRIX_ITCM_0		(0 << 0) +#define			AT91_MATRIX_ITCM_16		(5 << 0) +#define			AT91_MATRIX_ITCM_32		(6 << 0) +#define		AT91_MATRIX_DTCM_SIZE		(0xf << 4)	/* Size of DTCM enabled memory block */ +#define			AT91_MATRIX_DTCM_0		(0 << 4) +#define			AT91_MATRIX_DTCM_16		(5 << 4) +#define			AT91_MATRIX_DTCM_32		(6 << 4) + +#define AT91_MATRIX_EBI0CSA	(AT91_MATRIX + 0x120)	/* EBI0 Chip Select Assignment Register */ +#define		AT91_MATRIX_EBI0_CS1A		(1 << 1)	/* Chip Select 1 Assignment */ +#define			AT91_MATRIX_EBI0_CS1A_SMC		(0 << 1) +#define			AT91_MATRIX_EBI0_CS1A_SDRAMC		(1 << 1) +#define		AT91_MATRIX_EBI0_CS3A		(1 << 3)	/* Chip Select 3 Assignment */ +#define			AT91_MATRIX_EBI0_CS3A_SMC		(0 << 3) +#define			AT91_MATRIX_EBI0_CS3A_SMC_SMARTMEDIA	(1 << 3) +#define		AT91_MATRIX_EBI0_CS4A		(1 << 4)	/* Chip Select 4 Assignment */ +#define			AT91_MATRIX_EBI0_CS4A_SMC		(0 << 4) +#define			AT91_MATRIX_EBI0_CS4A_SMC_CF1		(1 << 4) +#define		AT91_MATRIX_EBI0_CS5A		(1 << 5)	/* Chip Select 5 Assignment */ +#define			AT91_MATRIX_EBI0_CS5A_SMC		(0 << 5) +#define			AT91_MATRIX_EBI0_CS5A_SMC_CF2		(1 << 5) +#define		AT91_MATRIX_EBI0_DBPUC		(1 << 8)	/* Data Bus Pull-up Configuration */ +#define		AT91_MATRIX_EBI0_VDDIOMSEL	(1 << 16)	/* Memory voltage selection */ +#define			AT91_MATRIX_EBI0_VDDIOMSEL_1_8V		(0 << 16) +#define			AT91_MATRIX_EBI0_VDDIOMSEL_3_3V		(1 << 16) + +#define AT91_MATRIX_EBI1CSA	(AT91_MATRIX + 0x124)	/* EBI1 Chip Select Assignment Register */ +#define		AT91_MATRIX_EBI1_CS1A		(1 << 1)	/* Chip Select 1 Assignment */ +#define			AT91_MATRIX_EBI1_CS1A_SMC		(0 << 1) +#define			AT91_MATRIX_EBI1_CS1A_SDRAMC		(1 << 1) +#define		AT91_MATRIX_EBI1_CS2A		(1 << 3)	/* Chip Select 3 Assignment */ +#define			AT91_MATRIX_EBI1_CS2A_SMC		(0 << 3) +#define			AT91_MATRIX_EBI1_CS2A_SMC_SMARTMEDIA	(1 << 3) +#define		AT91_MATRIX_EBI1_DBPUC		(1 << 8)	/* Data Bus Pull-up Configuration */ +#define		AT91_MATRIX_EBI1_VDDIOMSEL	(1 << 16)	/* Memory voltage selection */ +#define			AT91_MATRIX_EBI1_VDDIOMSEL_1_8V		(0 << 16) +#define			AT91_MATRIX_EBI1_VDDIOMSEL_3_3V		(1 << 16) + +#endif diff --git a/include/asm-arm/arch-at91sam9/at91sam9rl.h b/include/asm-arm/arch-at91sam9/at91sam9rl.h new file mode 100644 index 000000000..215bbc8d6 --- /dev/null +++ b/include/asm-arm/arch-at91sam9/at91sam9rl.h @@ -0,0 +1,115 @@ +/* + * [origin: Linux kernel include/asm-arm/arch-at91/at91sam9rl.h] + * + *  Copyright (C) 2007 Atmel Corporation + * + * Common definitions. + * Based on AT91SAM9RL datasheet revision A. (Preliminary) + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file COPYING in the main directory of this archive for + * more details. + */ + +#ifndef AT91SAM9RL_H +#define AT91SAM9RL_H + +/* + * Peripheral identifiers/interrupts. + */ +#define AT91_ID_FIQ		0	/* Advanced Interrupt Controller (FIQ) */ +#define AT91_ID_SYS		1	/* System Controller */ +#define AT91SAM9RL_ID_PIOA	2	/* Parallel IO Controller A */ +#define AT91SAM9RL_ID_PIOB	3	/* Parallel IO Controller B */ +#define AT91SAM9RL_ID_PIOC	4	/* Parallel IO Controller C */ +#define AT91SAM9RL_ID_PIOD	5	/* Parallel IO Controller D */ +#define AT91SAM9RL_ID_US0	6	/* USART 0 */ +#define AT91SAM9RL_ID_US1	7	/* USART 1 */ +#define AT91SAM9RL_ID_US2	8	/* USART 2 */ +#define AT91SAM9RL_ID_US3	9	/* USART 3 */ +#define AT91SAM9RL_ID_MCI	10	/* Multimedia Card Interface */ +#define AT91SAM9RL_ID_TWI0	11	/* TWI 0 */ +#define AT91SAM9RL_ID_TWI1	12	/* TWI 1 */ +#define AT91SAM9RL_ID_SPI	13	/* Serial Peripheral Interface */ +#define AT91SAM9RL_ID_SSC0	14	/* Serial Synchronous Controller 0 */ +#define AT91SAM9RL_ID_SSC1	15	/* Serial Synchronous Controller 1 */ +#define AT91SAM9RL_ID_TC0	16	/* Timer Counter 0 */ +#define AT91SAM9RL_ID_TC1	17	/* Timer Counter 1 */ +#define AT91SAM9RL_ID_TC2	18	/* Timer Counter 2 */ +#define AT91SAM9RL_ID_PWMC	19	/* Pulse Width Modulation Controller */ +#define AT91SAM9RL_ID_TSC	20	/* Touch Screen Controller */ +#define AT91SAM9RL_ID_DMA	21	/* DMA Controller */ +#define AT91SAM9RL_ID_UDPHS	22	/* USB Device HS */ +#define AT91SAM9RL_ID_LCDC	23	/* LCD Controller */ +#define AT91SAM9RL_ID_AC97C	24	/* AC97 Controller */ +#define AT91SAM9RL_ID_IRQ0	31	/* Advanced Interrupt Controller (IRQ0) */ + + +/* + * User Peripheral physical base addresses. + */ +#define AT91SAM9RL_BASE_TCB0	0xfffa0000 +#define AT91SAM9RL_BASE_TC0	0xfffa0000 +#define AT91SAM9RL_BASE_TC1	0xfffa0040 +#define AT91SAM9RL_BASE_TC2	0xfffa0080 +#define AT91SAM9RL_BASE_MCI	0xfffa4000 +#define AT91SAM9RL_BASE_TWI0	0xfffa8000 +#define AT91SAM9RL_BASE_TWI1	0xfffac000 +#define AT91SAM9RL_BASE_US0	0xfffb0000 +#define AT91SAM9RL_BASE_US1	0xfffb4000 +#define AT91SAM9RL_BASE_US2	0xfffb8000 +#define AT91SAM9RL_BASE_US3	0xfffbc000 +#define AT91SAM9RL_BASE_SSC0	0xfffc0000 +#define AT91SAM9RL_BASE_SSC1	0xfffc4000 +#define AT91SAM9RL_BASE_PWMC	0xfffc8000 +#define AT91SAM9RL_BASE_SPI	0xfffcc000 +#define AT91SAM9RL_BASE_TSC	0xfffd0000 +#define AT91SAM9RL_BASE_UDPHS	0xfffd4000 +#define AT91SAM9RL_BASE_AC97C	0xfffd8000 +#define AT91_BASE_SYS		0xffffc000 + + +/* + * System Peripherals (offset from AT91_BASE_SYS) + */ +#define AT91_DMA	(0xffffe600 - AT91_BASE_SYS) +#define AT91_ECC	(0xffffe800 - AT91_BASE_SYS) +#define AT91_SDRAMC	(0xffffea00 - AT91_BASE_SYS) +#define AT91_SMC	(0xffffec00 - AT91_BASE_SYS) +#define AT91_MATRIX	(0xffffee00 - AT91_BASE_SYS) +#define AT91_CCFG	(0xffffef10 - AT91_BASE_SYS) +#define AT91_AIC	(0xfffff000 - AT91_BASE_SYS) +#define AT91_DBGU	(0xfffff200 - AT91_BASE_SYS) +#define AT91_PIOA	(0xfffff400 - AT91_BASE_SYS) +#define AT91_PIOB	(0xfffff600 - AT91_BASE_SYS) +#define AT91_PIOC	(0xfffff800 - AT91_BASE_SYS) +#define AT91_PIOD	(0xfffffa00 - AT91_BASE_SYS) +#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS) +#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS) +#define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS) +#define AT91_RTT	(0xfffffd20 - AT91_BASE_SYS) +#define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS) +#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS) +#define AT91_SCKCR	(0xfffffd50 - AT91_BASE_SYS) +#define AT91_GPBR	(0xfffffd60 - AT91_BASE_SYS) +#define AT91_RTC	(0xfffffe00 - AT91_BASE_SYS) + +#define AT91_USART0	AT91SAM9RL_BASE_US0 +#define AT91_USART1	AT91SAM9RL_BASE_US1 +#define AT91_USART2	AT91SAM9RL_BASE_US2 +#define AT91_USART3	AT91SAM9RL_BASE_US3 + + +/* + * Internal Memory. + */ +#define AT91SAM9RL_SRAM_BASE	0x00300000	/* Internal SRAM base address */ +#define AT91SAM9RL_SRAM_SIZE	SZ_16K		/* Internal SRAM size (16Kb) */ + +#define AT91SAM9RL_ROM_BASE	0x00400000	/* Internal ROM base address */ +#define AT91SAM9RL_ROM_SIZE	(2 * SZ_16K)	/* Internal ROM size (32Kb) */ + +#define AT91SAM9RL_LCDC_BASE	0x00500000	/* LCD Controller */ +#define AT91SAM9RL_UDPHS_BASE	0x00600000	/* USB Device HS controller */ + +#endif diff --git a/include/asm-arm/arch-at91sam9/at91sam9rl_matrix.h b/include/asm-arm/arch-at91sam9/at91sam9rl_matrix.h new file mode 100644 index 000000000..af8d914ac --- /dev/null +++ b/include/asm-arm/arch-at91sam9/at91sam9rl_matrix.h @@ -0,0 +1,96 @@ +/* + * [origin: Linux kernel include/asm-arm/arch-at91/at91sam9rl_matrix.h] + * + *  Copyright (C) 2007 Atmel Corporation + * + * Memory Controllers (MATRIX, EBI) - System peripherals registers. + * Based on AT91SAM9RL datasheet revision A. (Preliminary) + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file COPYING in the main directory of this archive for + * more details. + */ + +#ifndef AT91SAM9RL_MATRIX_H +#define AT91SAM9RL_MATRIX_H + +#define AT91_MATRIX_MCFG0	(AT91_MATRIX + 0x00)	/* Master Configuration Register 0 */ +#define AT91_MATRIX_MCFG1	(AT91_MATRIX + 0x04)	/* Master Configuration Register 1 */ +#define AT91_MATRIX_MCFG2	(AT91_MATRIX + 0x08)	/* Master Configuration Register 2 */ +#define AT91_MATRIX_MCFG3	(AT91_MATRIX + 0x0C)	/* Master Configuration Register 3 */ +#define AT91_MATRIX_MCFG4	(AT91_MATRIX + 0x10)	/* Master Configuration Register 4 */ +#define AT91_MATRIX_MCFG5	(AT91_MATRIX + 0x14)	/* Master Configuration Register 5 */ +#define		AT91_MATRIX_ULBT	(7 << 0)	/* Undefined Length Burst Type */ +#define			AT91_MATRIX_ULBT_INFINITE	(0 << 0) +#define			AT91_MATRIX_ULBT_SINGLE		(1 << 0) +#define			AT91_MATRIX_ULBT_FOUR		(2 << 0) +#define			AT91_MATRIX_ULBT_EIGHT		(3 << 0) +#define			AT91_MATRIX_ULBT_SIXTEEN	(4 << 0) + +#define AT91_MATRIX_SCFG0	(AT91_MATRIX + 0x40)	/* Slave Configuration Register 0 */ +#define AT91_MATRIX_SCFG1	(AT91_MATRIX + 0x44)	/* Slave Configuration Register 1 */ +#define AT91_MATRIX_SCFG2	(AT91_MATRIX + 0x48)	/* Slave Configuration Register 2 */ +#define AT91_MATRIX_SCFG3	(AT91_MATRIX + 0x4C)	/* Slave Configuration Register 3 */ +#define AT91_MATRIX_SCFG4	(AT91_MATRIX + 0x50)	/* Slave Configuration Register 4 */ +#define AT91_MATRIX_SCFG5	(AT91_MATRIX + 0x54)	/* Slave Configuration Register 5 */ +#define		AT91_MATRIX_SLOT_CYCLE		(0xff << 0)	/* Maximum Number of Allowed Cycles for a Burst */ +#define		AT91_MATRIX_DEFMSTR_TYPE	(3    << 16)	/* Default Master Type */ +#define			AT91_MATRIX_DEFMSTR_TYPE_NONE	(0 << 16) +#define			AT91_MATRIX_DEFMSTR_TYPE_LAST	(1 << 16) +#define			AT91_MATRIX_DEFMSTR_TYPE_FIXED	(2 << 16) +#define		AT91_MATRIX_FIXED_DEFMSTR	(0xf  << 18)	/* Fixed Index of Default Master */ +#define		AT91_MATRIX_ARBT		(3    << 24)	/* Arbitration Type */ +#define			AT91_MATRIX_ARBT_ROUND_ROBIN	(0 << 24) +#define			AT91_MATRIX_ARBT_FIXED_PRIORITY	(1 << 24) + +#define AT91_MATRIX_PRAS0	(AT91_MATRIX + 0x80)	/* Priority Register A for Slave 0 */ +#define AT91_MATRIX_PRAS1	(AT91_MATRIX + 0x88)	/* Priority Register A for Slave 1 */ +#define AT91_MATRIX_PRAS2	(AT91_MATRIX + 0x90)	/* Priority Register A for Slave 2 */ +#define AT91_MATRIX_PRAS3	(AT91_MATRIX + 0x98)	/* Priority Register A for Slave 3 */ +#define AT91_MATRIX_PRAS4	(AT91_MATRIX + 0xA0)	/* Priority Register A for Slave 4 */ +#define AT91_MATRIX_PRAS5	(AT91_MATRIX + 0xA8)	/* Priority Register A for Slave 5 */ +#define		AT91_MATRIX_M0PR		(3 << 0)	/* Master 0 Priority */ +#define		AT91_MATRIX_M1PR		(3 << 4)	/* Master 1 Priority */ +#define		AT91_MATRIX_M2PR		(3 << 8)	/* Master 2 Priority */ +#define		AT91_MATRIX_M3PR		(3 << 12)	/* Master 3 Priority */ +#define		AT91_MATRIX_M4PR		(3 << 16)	/* Master 4 Priority */ +#define		AT91_MATRIX_M5PR		(3 << 20)	/* Master 5 Priority */ + +#define AT91_MATRIX_MRCR	(AT91_MATRIX + 0x100)	/* Master Remap Control Register */ +#define		AT91_MATRIX_RCB0		(1 << 0)	/* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */ +#define		AT91_MATRIX_RCB1		(1 << 1)	/* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */ +#define		AT91_MATRIX_RCB2		(1 << 2) +#define		AT91_MATRIX_RCB3		(1 << 3) +#define		AT91_MATRIX_RCB4		(1 << 4) +#define		AT91_MATRIX_RCB5		(1 << 5) + +#define AT91_MATRIX_TCMR	(AT91_MATRIX + 0x114)	/* TCM Configuration Register */ +#define		AT91_MATRIX_ITCM_SIZE		(0xf << 0)	/* Size of ITCM enabled memory block */ +#define			AT91_MATRIX_ITCM_0		(0 << 0) +#define			AT91_MATRIX_ITCM_16		(5 << 0) +#define			AT91_MATRIX_ITCM_32		(6 << 0) +#define		AT91_MATRIX_DTCM_SIZE		(0xf << 4)	/* Size of DTCM enabled memory block */ +#define			AT91_MATRIX_DTCM_0		(0 << 4) +#define			AT91_MATRIX_DTCM_16		(5 << 4) +#define			AT91_MATRIX_DTCM_32		(6 << 4) + +#define AT91_MATRIX_EBICSA	(AT91_MATRIX + 0x120)	/* EBI0 Chip Select Assignment Register */ +#define		AT91_MATRIX_CS1A		(1 << 1)	/* Chip Select 1 Assignment */ +#define			AT91_MATRIX_CS1A_SMC		(0 << 1) +#define			AT91_MATRIX_CS1A_SDRAMC		(1 << 1) +#define		AT91_MATRIX_CS3A		(1 << 3)	/* Chip Select 3 Assignment */ +#define			AT91_MATRIX_CS3A_SMC		(0 << 3) +#define			AT91_MATRIX_CS3A_SMC_SMARTMEDIA	(1 << 3) +#define		AT91_MATRIX_CS4A		(1 << 4)	/* Chip Select 4 Assignment */ +#define			AT91_MATRIX_CS4A_SMC		(0 << 4) +#define			AT91_MATRIX_CS4A_SMC_CF1	(1 << 4) +#define		AT91_MATRIX_CS5A		(1 << 5)	/* Chip Select 5 Assignment */ +#define			AT91_MATRIX_CS5A_SMC		(0 << 5) +#define			AT91_MATRIX_CS5A_SMC_CF2	(1 << 5) +#define		AT91_MATRIX_DBPUC		(1 << 8)	/* Data Bus Pull-up Configuration */ +#define		AT91_MATRIX_VDDIOMSEL		(1 << 16)	/* Memory voltage selection */ +#define			AT91_MATRIX_VDDIOMSEL_1_8V	(0 << 16) +#define			AT91_MATRIX_VDDIOMSEL_3_3V	(1 << 16) + + +#endif diff --git a/include/asm-arm/arch-at91sam9/clk.h b/include/asm-arm/arch-at91sam9/clk.h index f67b4356d..1b502c822 100644 --- a/include/asm-arm/arch-at91sam9/clk.h +++ b/include/asm-arm/arch-at91sam9/clk.h @@ -36,4 +36,10 @@ static inline unsigned long get_usart_clk_rate(unsigned int dev_id)  	return AT91_MASTER_CLOCK;  } +static inline unsigned long get_lcdc_clk_rate(unsigned int dev_id) +{ +	return AT91_MASTER_CLOCK; +} + +  #endif /* __ASM_ARM_ARCH_CLK_H__ */ diff --git a/include/asm-arm/arch-at91sam9/hardware.h b/include/asm-arm/arch-at91sam9/hardware.h index d2fe45388..f31241901 100644 --- a/include/asm-arm/arch-at91sam9/hardware.h +++ b/include/asm-arm/arch-at91sam9/hardware.h @@ -26,10 +26,19 @@  #define AT91_PMC_UHP	AT91SAM926x_PMC_UHP  #elif defined(CONFIG_AT91SAM9261)  #include <asm/arch/at91sam9261.h> +#define AT91_BASE_SPI	AT91SAM9261_BASE_SPI0 +#define AT91_ID_UHP	AT91SAM9261_ID_UHP +#define AT91_PMC_UHP	AT91SAM926x_PMC_UHP  #elif defined(CONFIG_AT91SAM9263)  #include <asm/arch/at91sam9263.h> +#define AT91_BASE_EMAC	AT91SAM9263_BASE_EMAC +#define AT91_BASE_SPI	AT91SAM9263_BASE_SPI0 +#define AT91_ID_UHP	AT91SAM9263_ID_UHP +#define AT91_PMC_UHP	AT91SAM926x_PMC_UHP  #elif defined(CONFIG_AT91SAM9RL)  #include <asm/arch/at91sam9rl.h> +#define AT91_BASE_SPI	AT91SAM9RL_BASE_SPI +#define AT91_ID_UHP	AT91SAM9RL_ID_UHP  #elif defined(CONFIG_AT91CAP9)  #include <asm/arch/at91cap9.h>  #define AT91_BASE_EMAC	AT91CAP9_BASE_EMAC @@ -42,15 +51,4 @@  #error "Unsupported AT91 processor"  #endif -/* - * container_of - cast a member of a structure out to the containing structure - * - * @ptr:	the pointer to the member. - * @type:	the type of the container struct this is embedded in. - * @member:	the name of the member within the struct. - */ -#define container_of(ptr, type, member) ({			\ -	const typeof(((type *)0)->member) *__mptr = (ptr);	\ -	(type *)((char *)__mptr - offsetof(type, member)); }) -  #endif diff --git a/include/asm-avr32/arch-at32ap700x/chip-features.h b/include/asm-avr32/arch-at32ap700x/chip-features.h index 29b1fd663..c47107e2a 100644 --- a/include/asm-avr32/arch-at32ap700x/chip-features.h +++ b/include/asm-avr32/arch-at32ap700x/chip-features.h @@ -25,6 +25,7 @@  /* Currently, all the AP700x chips have these */  #define AT32AP700x_CHIP_HAS_USART  #define AT32AP700x_CHIP_HAS_MMCI +#define AT32AP700x_CHIP_HAS_SPI  /* Only AP7000 has ethernet interface */  #ifdef CONFIG_AT32AP7000 diff --git a/include/asm-avr32/arch-at32ap700x/clk.h b/include/asm-avr32/arch-at32ap700x/clk.h index 385319aac..a9d8431a6 100644 --- a/include/asm-avr32/arch-at32ap700x/clk.h +++ b/include/asm-avr32/arch-at32ap700x/clk.h @@ -58,7 +58,7 @@ static inline unsigned long get_usart_clk_rate(unsigned int dev_id)  	return get_pba_clk_rate();  }  #endif -#ifdef AT32AP700x_CHIP_HAS_USART +#ifdef AT32AP700x_CHIP_HAS_MACB  static inline unsigned long get_macb_pclk_rate(unsigned int dev_id)  {  	return get_pbb_clk_rate(); @@ -74,6 +74,14 @@ static inline unsigned long get_mci_clk_rate(void)  	return get_pbb_clk_rate();  }  #endif +#ifdef AT32AP700x_CHIP_HAS_SPI +static inline unsigned long get_spi_clk_rate(unsigned int dev_id) +{ +	return get_pba_clk_rate(); +} +#endif + +extern void clk_init(void);  /* Board code may need the SDRAM base clock as a compile-time constant */  #define SDRAMC_BUS_HZ	(MAIN_CLK_RATE >> CFG_CLKDIV_HSB) diff --git a/include/asm-avr32/arch-at32ap700x/gpio.h b/include/asm-avr32/arch-at32ap700x/gpio.h index b10a3e4f8..ef20ceaab 100644 --- a/include/asm-avr32/arch-at32ap700x/gpio.h +++ b/include/asm-avr32/arch-at32ap700x/gpio.h @@ -216,5 +216,9 @@ void gpio_enable_macb1(void);  #ifdef AT32AP700x_CHIP_HAS_MMCI  void gpio_enable_mmci(void);  #endif +#ifdef AT32AP700x_CHIP_HAS_SPI +void gpio_enable_spi0(unsigned long cs_mask); +void gpio_enable_spi1(unsigned long cs_mask); +#endif  #endif /* __ASM_AVR32_ARCH_GPIO_H__ */ diff --git a/include/asm-avr32/arch-at32ap700x/hmatrix.h b/include/asm-avr32/arch-at32ap700x/hmatrix.h new file mode 100644 index 000000000..d6b626328 --- /dev/null +++ b/include/asm-avr32/arch-at32ap700x/hmatrix.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2008 Atmel Corporation + * + * 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_AVR32_ARCH_HMATRIX_H__ +#define __ASM_AVR32_ARCH_HMATRIX_H__ + +#include <asm/hmatrix-common.h> + +/* Bitfields in SFR4 (EBI) */ +#define HMATRIX_EBI_SDRAM_ENABLE_OFFSET		1 +#define HMATRIX_EBI_SDRAM_ENABLE_SIZE		1 +#define HMATRIX_EBI_NAND_ENABLE_OFFSET		3 +#define HMATRIX_EBI_NAND_ENABLE_SIZE		1 +#define HMATRIX_EBI_CF0_ENABLE_OFFSET		4 +#define HMATRIX_EBI_CF0_ENABLE_SIZE		1 +#define HMATRIX_EBI_CF1_ENABLE_OFFSET		5 +#define HMATRIX_EBI_CF1_ENABLE_SIZE		1 +#define HMATRIX_EBI_PULLUP_DISABLE_OFFSET	8 +#define HMATRIX_EBI_PULLUP_DISABLE_SIZE		1 + +/* HSB masters */ +#define HMATRIX_MASTER_CPU_DCACHE		0 +#define HMATRIX_MASTER_CPU_ICACHE		1 +#define HMATRIX_MASTER_PDC			2 +#define HMATRIX_MASTER_ISI			3 +#define HMATRIX_MASTER_USBA			4 +#define HMATRIX_MASTER_LCDC			5 +#define HMATRIX_MASTER_MACB0			6 +#define HMATRIX_MASTER_MACB1			7 +#define HMATRIX_MASTER_DMACA_M0			8 +#define HMATRIX_MASTER_DMACA_M1			9 + +/* HSB slaves */ +#define HMATRIX_SLAVE_SRAM0			0 +#define HMATRIX_SLAVE_SRAM1			1 +#define HMATRIX_SLAVE_PBA			2 +#define HMATRIX_SLAVE_PBB			3 +#define HMATRIX_SLAVE_EBI			4 +#define HMATRIX_SLAVE_USBA			5 +#define HMATRIX_SLAVE_LCDC			6 +#define HMATRIX_SLAVE_DMACA			7 + +#endif /* __ASM_AVR32_ARCH_HMATRIX_H__ */ diff --git a/include/asm-avr32/arch-at32ap700x/hmatrix2.h b/include/asm-avr32/arch-at32ap700x/hmatrix2.h deleted file mode 100644 index b0e787a92..000000000 --- a/include/asm-avr32/arch-at32ap700x/hmatrix2.h +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Register definition for the High-speed Bus Matrix - */ -#ifndef __ASM_AVR32_HMATRIX2_H__ -#define __ASM_AVR32_HMATRIX2_H__ - -/* HMATRIX2 register offsets */ -#define HMATRIX2_MCFG0				0x0000 -#define HMATRIX2_MCFG1				0x0004 -#define HMATRIX2_MCFG2				0x0008 -#define HMATRIX2_MCFG3				0x000c -#define HMATRIX2_MCFG4				0x0010 -#define HMATRIX2_MCFG5				0x0014 -#define HMATRIX2_MCFG6				0x0018 -#define HMATRIX2_MCFG7				0x001c -#define HMATRIX2_MCFG8				0x0020 -#define HMATRIX2_MCFG9				0x0024 -#define HMATRIX2_MCFG10				0x0028 -#define HMATRIX2_MCFG11				0x002c -#define HMATRIX2_MCFG12				0x0030 -#define HMATRIX2_MCFG13				0x0034 -#define HMATRIX2_MCFG14				0x0038 -#define HMATRIX2_MCFG15				0x003c -#define HMATRIX2_SCFG0				0x0040 -#define HMATRIX2_SCFG1				0x0044 -#define HMATRIX2_SCFG2				0x0048 -#define HMATRIX2_SCFG3				0x004c -#define HMATRIX2_SCFG4				0x0050 -#define HMATRIX2_SCFG5				0x0054 -#define HMATRIX2_SCFG6				0x0058 -#define HMATRIX2_SCFG7				0x005c -#define HMATRIX2_SCFG8				0x0060 -#define HMATRIX2_SCFG9				0x0064 -#define HMATRIX2_SCFG10				0x0068 -#define HMATRIX2_SCFG11				0x006c -#define HMATRIX2_SCFG12				0x0070 -#define HMATRIX2_SCFG13				0x0074 -#define HMATRIX2_SCFG14				0x0078 -#define HMATRIX2_SCFG15				0x007c -#define HMATRIX2_PRAS0				0x0080 -#define HMATRIX2_PRBS0				0x0084 -#define HMATRIX2_PRAS1				0x0088 -#define HMATRIX2_PRBS1				0x008c -#define HMATRIX2_PRAS2				0x0090 -#define HMATRIX2_PRBS2				0x0094 -#define HMATRIX2_PRAS3				0x0098 -#define HMATRIX2_PRBS3				0x009c -#define HMATRIX2_PRAS4				0x00a0 -#define HMATRIX2_PRBS4				0x00a4 -#define HMATRIX2_PRAS5				0x00a8 -#define HMATRIX2_PRBS5				0x00ac -#define HMATRIX2_PRAS6				0x00b0 -#define HMATRIX2_PRBS6				0x00b4 -#define HMATRIX2_PRAS7				0x00b8 -#define HMATRIX2_PRBS7				0x00bc -#define HMATRIX2_PRAS8				0x00c0 -#define HMATRIX2_PRBS8				0x00c4 -#define HMATRIX2_PRAS9				0x00c8 -#define HMATRIX2_PRBS9				0x00cc -#define HMATRIX2_PRAS10				0x00d0 -#define HMATRIX2_PRBS10				0x00d4 -#define HMATRIX2_PRAS11				0x00d8 -#define HMATRIX2_PRBS11				0x00dc -#define HMATRIX2_PRAS12				0x00e0 -#define HMATRIX2_PRBS12				0x00e4 -#define HMATRIX2_PRAS13				0x00e8 -#define HMATRIX2_PRBS13				0x00ec -#define HMATRIX2_PRAS14				0x00f0 -#define HMATRIX2_PRBS14				0x00f4 -#define HMATRIX2_PRAS15				0x00f8 -#define HMATRIX2_PRBS15				0x00fc -#define HMATRIX2_MRCR				0x0100 -#define HMATRIX2_SFR0				0x0110 -#define HMATRIX2_SFR1				0x0114 -#define HMATRIX2_SFR2				0x0118 -#define HMATRIX2_SFR3				0x011c -#define HMATRIX2_SFR4				0x0120 -#define HMATRIX2_SFR5				0x0124 -#define HMATRIX2_SFR6				0x0128 -#define HMATRIX2_SFR7				0x012c -#define HMATRIX2_SFR8				0x0130 -#define HMATRIX2_SFR9				0x0134 -#define HMATRIX2_SFR10				0x0138 -#define HMATRIX2_SFR11				0x013c -#define HMATRIX2_SFR12				0x0140 -#define HMATRIX2_SFR13				0x0144 -#define HMATRIX2_SFR14				0x0148 -#define HMATRIX2_SFR15				0x014c -#define HMATRIX2_VERSION			0x01fc - -/* Bitfields in MCFG0 */ -#define HMATRIX2_ULBT_OFFSET			0 -#define HMATRIX2_ULBT_SIZE			3 - -/* Bitfields in SCFG0 */ -#define HMATRIX2_SLOT_CYCLE_OFFSET		0 -#define HMATRIX2_SLOT_CYCLE_SIZE		8 -#define HMATRIX2_DEFMSTR_TYPE_OFFSET		16 -#define HMATRIX2_DEFMSTR_TYPE_SIZE		2 -#define HMATRIX2_FIXED_DEFMSTR_OFFSET		18 -#define HMATRIX2_FIXED_DEFMSTR_SIZE		4 -#define HMATRIX2_ARBT_OFFSET			24 -#define HMATRIX2_ARBT_SIZE			2 - -/* Bitfields in PRAS0 */ -#define HMATRIX2_M0PR_OFFSET			0 -#define HMATRIX2_M0PR_SIZE			4 -#define HMATRIX2_M1PR_OFFSET			4 -#define HMATRIX2_M1PR_SIZE			4 -#define HMATRIX2_M2PR_OFFSET			8 -#define HMATRIX2_M2PR_SIZE			4 -#define HMATRIX2_M3PR_OFFSET			12 -#define HMATRIX2_M3PR_SIZE			4 -#define HMATRIX2_M4PR_OFFSET			16 -#define HMATRIX2_M4PR_SIZE			4 -#define HMATRIX2_M5PR_OFFSET			20 -#define HMATRIX2_M5PR_SIZE			4 -#define HMATRIX2_M6PR_OFFSET			24 -#define HMATRIX2_M6PR_SIZE			4 -#define HMATRIX2_M7PR_OFFSET			28 -#define HMATRIX2_M7PR_SIZE			4 - -/* Bitfields in PRBS0 */ -#define HMATRIX2_M8PR_OFFSET			0 -#define HMATRIX2_M8PR_SIZE			4 -#define HMATRIX2_M9PR_OFFSET			4 -#define HMATRIX2_M9PR_SIZE			4 -#define HMATRIX2_M10PR_OFFSET			8 -#define HMATRIX2_M10PR_SIZE			4 -#define HMATRIX2_M11PR_OFFSET			12 -#define HMATRIX2_M11PR_SIZE			4 -#define HMATRIX2_M12PR_OFFSET			16 -#define HMATRIX2_M12PR_SIZE			4 -#define HMATRIX2_M13PR_OFFSET			20 -#define HMATRIX2_M13PR_SIZE			4 -#define HMATRIX2_M14PR_OFFSET			24 -#define HMATRIX2_M14PR_SIZE			4 -#define HMATRIX2_M15PR_OFFSET			28 -#define HMATRIX2_M15PR_SIZE			4 - -/* Bitfields in MRCR */ -#define HMATRIX2_RBC0_OFFSET			0 -#define HMATRIX2_RBC0_SIZE			1 -#define HMATRIX2_RBC1_OFFSET			1 -#define HMATRIX2_RBC1_SIZE			1 -#define HMATRIX2_RBC2_OFFSET			2 -#define HMATRIX2_RBC2_SIZE			1 -#define HMATRIX2_RBC3_OFFSET			3 -#define HMATRIX2_RBC3_SIZE			1 -#define HMATRIX2_RBC4_OFFSET			4 -#define HMATRIX2_RBC4_SIZE			1 -#define HMATRIX2_RBC5_OFFSET			5 -#define HMATRIX2_RBC5_SIZE			1 -#define HMATRIX2_RBC6_OFFSET			6 -#define HMATRIX2_RBC6_SIZE			1 -#define HMATRIX2_RBC7_OFFSET			7 -#define HMATRIX2_RBC7_SIZE			1 -#define HMATRIX2_RBC8_OFFSET			8 -#define HMATRIX2_RBC8_SIZE			1 -#define HMATRIX2_RBC9_OFFSET			9 -#define HMATRIX2_RBC9_SIZE			1 -#define HMATRIX2_RBC10_OFFSET			10 -#define HMATRIX2_RBC10_SIZE			1 -#define HMATRIX2_RBC11_OFFSET			11 -#define HMATRIX2_RBC11_SIZE			1 -#define HMATRIX2_RBC12_OFFSET			12 -#define HMATRIX2_RBC12_SIZE			1 -#define HMATRIX2_RBC13_OFFSET			13 -#define HMATRIX2_RBC13_SIZE			1 -#define HMATRIX2_RBC14_OFFSET			14 -#define HMATRIX2_RBC14_SIZE			1 -#define HMATRIX2_RBC15_OFFSET			15 -#define HMATRIX2_RBC15_SIZE			1 - -/* Bitfields in SFR0 */ -#define HMATRIX2_SFR_OFFSET			0 -#define HMATRIX2_SFR_SIZE			32 - -/* Bitfields in SFR4 */ -#define HMATRIX2_CS1A_OFFSET			1 -#define HMATRIX2_CS1A_SIZE			1 -#define HMATRIX2_CS3A_OFFSET			3 -#define HMATRIX2_CS3A_SIZE			1 -#define HMATRIX2_CS4A_OFFSET			4 -#define HMATRIX2_CS4A_SIZE			1 -#define HMATRIX2_CS5A_OFFSET			5 -#define HMATRIX2_CS5A_SIZE			1 -#define HMATRIX2_DBPUC_OFFSET			8 -#define HMATRIX2_DBPUC_SIZE			1 - -/* Bitfields in VERSION */ -#define HMATRIX2_VERSION_OFFSET			0 -#define HMATRIX2_VERSION_SIZE			12 -#define HMATRIX2_MFN_OFFSET			16 -#define HMATRIX2_MFN_SIZE			3 - -/* Constants for ULBT */ -#define HMATRIX2_ULBT_INFINITE			0 -#define HMATRIX2_ULBT_SINGLE			1 -#define HMATRIX2_ULBT_FOUR_BEAT			2 -#define HMATRIX2_ULBT_SIXTEEN_BEAT		4 - -/* Constants for DEFMSTR_TYPE */ -#define HMATRIX2_DEFMSTR_TYPE_NO_DEFAULT	0 -#define HMATRIX2_DEFMSTR_TYPE_LAST_DEFAULT	1 -#define HMATRIX2_DEFMSTR_TYPE_FIXED_DEFAULT	2 - -/* Constants for ARBT */ -#define HMATRIX2_ARBT_ROUND_ROBIN		0 -#define HMATRIX2_ARBT_FIXED_PRIORITY		1 - -/* Bit manipulation macros */ -#define HMATRIX2_BIT(name)					\ -	(1 << HMATRIX2_##name##_OFFSET) -#define HMATRIX2_BF(name,value)					\ -	(((value) & ((1 << HMATRIX2_##name##_SIZE) - 1))	\ -	 << HMATRIX2_##name##_OFFSET) -#define HMATRIX2_BFEXT(name,value)				\ -	(((value) >> HMATRIX2_##name##_OFFSET)			\ -	 & ((1 << HMATRIX2_##name##_SIZE) - 1)) -#define HMATRIX2_BFINS(name,value,old)				\ -	(((old) & ~(((1 << HMATRIX2_##name##_SIZE) - 1)		\ -		    << HMATRIX2_##name##_OFFSET))		\ -	 | HMATRIX2_BF(name,value)) - -/* Register access macros */ -#define hmatrix2_readl(reg)					\ -	readl((void *)HMATRIX_BASE + HMATRIX2_##reg) -#define hmatrix2_writel(reg,value)				\ -	writel((value), (void *)HMATRIX_BASE + HMATRIX2_##reg) - -#endif /* __ASM_AVR32_HMATRIX2_H__ */ diff --git a/include/asm-avr32/arch-at32ap700x/memory-map.h b/include/asm-avr32/arch-at32ap700x/memory-map.h index 5513e88e7..6592c039f 100644 --- a/include/asm-avr32/arch-at32ap700x/memory-map.h +++ b/include/asm-avr32/arch-at32ap700x/memory-map.h @@ -22,6 +22,26 @@  #ifndef __AT32AP7000_MEMORY_MAP_H__  #define __AT32AP7000_MEMORY_MAP_H__ +/* Internal and external memories */ +#define EBI_SRAM_CS0_BASE			0x00000000 +#define EBI_SRAM_CS0_SIZE			0x04000000 +#define EBI_SRAM_CS4_BASE			0x04000000 +#define EBI_SRAM_CS4_SIZE			0x04000000 +#define EBI_SRAM_CS2_BASE			0x08000000 +#define EBI_SRAM_CS2_SIZE			0x04000000 +#define EBI_SRAM_CS3_BASE			0x0c000000 +#define EBI_SRAM_CS3_SIZE			0x04000000 +#define EBI_SRAM_CS1_BASE			0x10000000 +#define EBI_SRAM_CS1_SIZE			0x10000000 +#define EBI_SRAM_CS5_BASE			0x20000000 +#define EBI_SRAM_CS5_SIZE			0x04000000 + +#define EBI_SDRAM_BASE				EBI_SRAM_CS1_BASE +#define EBI_SDRAM_SIZE				EBI_SRAM_CS1_SIZE + +#define INTERNAL_SRAM_BASE			0x24000000 +#define INTERNAL_SRAM_SIZE			0x00008000 +  /* Devices on the High Speed Bus (HSB) */  #define LCDC_BASE				0xFF000000  #define DMAC_BASE				0xFF200000 diff --git a/include/asm-avr32/hmatrix-common.h b/include/asm-avr32/hmatrix-common.h new file mode 100644 index 000000000..4b7e6105d --- /dev/null +++ b/include/asm-avr32/hmatrix-common.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2008 Atmel Corporation + * + * 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_AVR32_HMATRIX_COMMON_H__ +#define __ASM_AVR32_HMATRIX_COMMON_H__ + +/* HMATRIX register offsets */ +struct hmatrix_regs { +	u32	MCFG[16]; +	u32	SCFG[16]; +	struct { +		u32	A; +		u32	B; +	} PRS[16]; +	u32	MRCR; +	u32	__reserved[3]; +	u32	SFR[16]; +}; + +/* Bitfields in MCFG */ +#define HMATRIX_ULBT_OFFSET			0 +#define HMATRIX_ULBT_SIZE			3 + +/* Bitfields in SCFG */ +#define HMATRIX_SLOT_CYCLE_OFFSET		0 +#define HMATRIX_SLOT_CYCLE_SIZE			8 +#define HMATRIX_DEFMSTR_TYPE_OFFSET		16 +#define HMATRIX_DEFMSTR_TYPE_SIZE		2 +#define HMATRIX_FIXED_DEFMSTR_OFFSET		18 +#define HMATRIX_FIXED_DEFMSTR_SIZE		4 +#define HMATRIX_ARBT_OFFSET			24 +#define HMATRIX_ARBT_SIZE			1 + +/* Bitfields in PRS.A */ +#define HMATRIX_M0PR_OFFSET			0 +#define HMATRIX_M0PR_SIZE			4 +#define HMATRIX_M1PR_OFFSET			4 +#define HMATRIX_M1PR_SIZE			4 +#define HMATRIX_M2PR_OFFSET			8 +#define HMATRIX_M2PR_SIZE			4 +#define HMATRIX_M3PR_OFFSET			12 +#define HMATRIX_M3PR_SIZE			4 +#define HMATRIX_M4PR_OFFSET			16 +#define HMATRIX_M4PR_SIZE			4 +#define HMATRIX_M5PR_OFFSET			20 +#define HMATRIX_M5PR_SIZE			4 +#define HMATRIX_M6PR_OFFSET			24 +#define HMATRIX_M6PR_SIZE			4 +#define HMATRIX_M7PR_OFFSET			28 +#define HMATRIX_M7PR_SIZE			4 + +/* Bitfields in PRS.B */ +#define HMATRIX_M8PR_OFFSET			0 +#define HMATRIX_M8PR_SIZE			4 +#define HMATRIX_M9PR_OFFSET			4 +#define HMATRIX_M9PR_SIZE			4 +#define HMATRIX_M10PR_OFFSET			8 +#define HMATRIX_M10PR_SIZE			4 +#define HMATRIX_M11PR_OFFSET			12 +#define HMATRIX_M11PR_SIZE			4 +#define HMATRIX_M12PR_OFFSET			16 +#define HMATRIX_M12PR_SIZE			4 +#define HMATRIX_M13PR_OFFSET			20 +#define HMATRIX_M13PR_SIZE			4 +#define HMATRIX_M14PR_OFFSET			24 +#define HMATRIX_M14PR_SIZE			4 +#define HMATRIX_M15PR_OFFSET			28 +#define HMATRIX_M15PR_SIZE			4 + +/* Constants for ULBT */ +#define HMATRIX_ULBT_INFINITE			0 +#define HMATRIX_ULBT_SINGLE			1 +#define HMATRIX_ULBT_FOUR_BEAT			2 +#define HMATRIX_ULBT_EIGHT_BEAT			3 +#define HMATRIX_ULBT_SIXTEEN_BEAT		4 + +/* Constants for DEFMSTR_TYPE */ +#define HMATRIX_DEFMSTR_TYPE_NO_DEFAULT		0 +#define HMATRIX_DEFMSTR_TYPE_LAST_DEFAULT	1 +#define HMATRIX_DEFMSTR_TYPE_FIXED_DEFAULT	2 + +/* Constants for ARBT */ +#define HMATRIX_ARBT_ROUND_ROBIN		0 +#define HMATRIX_ARBT_FIXED_PRIORITY		1 + +/* Bit manipulation macros */ +#define HMATRIX_BIT(name)					\ +	(1 << HMATRIX_##name##_OFFSET) +#define HMATRIX_BF(name,value)					\ +	(((value) & ((1 << HMATRIX_##name##_SIZE) - 1))		\ +	 << HMATRIX_##name##_OFFSET) +#define HMATRIX_BFEXT(name,value)				\ +	(((value) >> HMATRIX_##name##_OFFSET)			\ +	 & ((1 << HMATRIX_##name##_SIZE) - 1)) +#define HMATRIX_BFINS(name,value,old)				\ +	(((old) & ~(((1 << HMATRIX_##name##_SIZE) - 1)		\ +		    << HMATRIX_##name##_OFFSET))		\ +	 | HMATRIX_BF(name,value)) + +/* Register access macros */ +#define __hmatrix_reg(reg)					\ +	(((volatile struct hmatrix_regs *)HMATRIX_BASE)->reg) +#define hmatrix_read(reg)					\ +	(__hmatrix_reg(reg)) +#define hmatrix_write(reg, value)				\ +	do { __hmatrix_reg(reg) = (value); } while (0) + +#define hmatrix_slave_read(slave, reg)				\ +	hmatrix_read(reg[HMATRIX_SLAVE_##slave]) +#define hmatrix_slave_write(slave, reg, value)			\ +	hmatrix_write(reg[HMATRIX_SLAVE_##slave], value) + +#endif /* __ASM_AVR32_HMATRIX_COMMON_H__ */ diff --git a/include/asm-avr32/sdram.h b/include/asm-avr32/sdram.h index 833af6e6a..7bdefc1fd 100644 --- a/include/asm-avr32/sdram.h +++ b/include/asm-avr32/sdram.h @@ -22,15 +22,32 @@  #ifndef __ASM_AVR32_SDRAM_H  #define __ASM_AVR32_SDRAM_H -struct sdram_info { -	unsigned long phys_addr; -	unsigned int row_bits, col_bits, bank_bits; -	unsigned int cas, twr, trc, trp, trcd, tras, txsr; +struct sdram_config { +	/* Number of data bits. */ +	enum { +		SDRAM_DATA_16BIT, +		SDRAM_DATA_32BIT, +	} data_bits; + +	/* Number of address bits */ +	uint8_t row_bits, col_bits, bank_bits; + +	/* SDRAM timings in cycles */ +	uint8_t cas, twr, trc, trp, trcd, tras, txsr;  	/* SDRAM refresh period in cycles */  	unsigned long refresh_period;  }; -extern unsigned long sdram_init(const struct sdram_info *info); +/* + * Attempt to initialize the SDRAM controller using the specified + * parameters. Return the expected size of the memory area based on + * the number of address and data bits. + * + * The caller should verify that the configuration is correct by + * running a memory test, e.g. get_ram_size(). + */ +extern unsigned long sdram_init(void *sdram_base, +			const struct sdram_config *config);  #endif /* __ASM_AVR32_SDRAM_H */ diff --git a/include/asm-avr32/sections.h b/include/asm-avr32/sections.h index 75373abde..fe819b2db 100644 --- a/include/asm-avr32/sections.h +++ b/include/asm-avr32/sections.h @@ -25,15 +25,8 @@  /* References to section boundaries */  extern char _text[], _etext[]; -extern char __flashprog_start[], __flashprog_end[];  extern char _data[], __data_lma[], _edata[], __edata_lma[];  extern char __got_start[], __got_lma[], __got_end[];  extern char _end[]; -/* - * Everything in .flashprog will be locked in the icache so it doesn't - * get disturbed when executing flash commands. - */ -#define __flashprog __attribute__((section(".flashprog"), __noinline__)) -  #endif /* __ASM_AVR32_SECTIONS_H */ diff --git a/include/asm-avr32/u-boot.h b/include/asm-avr32/u-boot.h index 71dfcaf28..85ef008b7 100644 --- a/include/asm-avr32/u-boot.h +++ b/include/asm-avr32/u-boot.h @@ -42,15 +42,4 @@ typedef struct bd_info {  #define bi_memstart bi_dram[0].start  #define bi_memsize bi_dram[0].size -/** - *  container_of - cast a member of a structure out to the containing structure - * - *    @ptr:        the pointer to the member. - *    @type:       the type of the container struct this is embedded in. - *    @member:     the name of the member within the struct. - */ -#define container_of(ptr, type, member) ({                      \ -	const typeof( ((type *)0)->member ) *__mptr = (ptr);    \ -	(type *)( (char *)__mptr - offsetof(type,member) );}) -  #endif /* __ASM_U_BOOT_H__ */ diff --git a/include/asm-mips/errno.h b/include/asm-mips/errno.h new file mode 100644 index 000000000..1665a63a8 --- /dev/null +++ b/include/asm-mips/errno.h @@ -0,0 +1,143 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1995, 1999, 2001, 2002 by Ralf Baechle + */ +#ifndef _ASM_MIPS_ERRNO_H +#define _ASM_MIPS_ERRNO_H + +/* + * These first 34 error codes are from Linux 2.6, <asm-generic/errno-base.h> + */ +#define	EPERM		 1	/* Operation not permitted */ +#define	ENOENT		 2	/* No such file or directory */ +#define	ESRCH		 3	/* No such process */ +#define	EINTR		 4	/* Interrupted system call */ +#define	EIO		 5	/* I/O error */ +#define	ENXIO		 6	/* No such device or address */ +#define	E2BIG		 7	/* Argument list too long */ +#define	ENOEXEC		 8	/* Exec format error */ +#define	EBADF		 9	/* Bad file number */ +#define	ECHILD		10	/* No child processes */ +#define	EAGAIN		11	/* Try again */ +#define	ENOMEM		12	/* Out of memory */ +#define	EACCES		13	/* Permission denied */ +#define	EFAULT		14	/* Bad address */ +#define	ENOTBLK		15	/* Block device required */ +#define	EBUSY		16	/* Device or resource busy */ +#define	EEXIST		17	/* File exists */ +#define	EXDEV		18	/* Cross-device link */ +#define	ENODEV		19	/* No such device */ +#define	ENOTDIR		20	/* Not a directory */ +#define	EISDIR		21	/* Is a directory */ +#define	EINVAL		22	/* Invalid argument */ +#define	ENFILE		23	/* File table overflow */ +#define	EMFILE		24	/* Too many open files */ +#define	ENOTTY		25	/* Not a typewriter */ +#define	ETXTBSY		26	/* Text file busy */ +#define	EFBIG		27	/* File too large */ +#define	ENOSPC		28	/* No space left on device */ +#define	ESPIPE		29	/* Illegal seek */ +#define	EROFS		30	/* Read-only file system */ +#define	EMLINK		31	/* Too many links */ +#define	EPIPE		32	/* Broken pipe */ +#define	EDOM		33	/* Math argument out of domain of func */ +#define	ERANGE		34	/* Math result not representable */ + +/* + * These error numbers are intended to be MIPS ABI compatible + */ +#define	ENOMSG		35	/* No message of desired type */ +#define	EIDRM		36	/* Identifier removed */ +#define	ECHRNG		37	/* Channel number out of range */ +#define	EL2NSYNC	38	/* Level 2 not synchronized */ +#define	EL3HLT		39	/* Level 3 halted */ +#define	EL3RST		40	/* Level 3 reset */ +#define	ELNRNG		41	/* Link number out of range */ +#define	EUNATCH		42	/* Protocol driver not attached */ +#define	ENOCSI		43	/* No CSI structure available */ +#define	EL2HLT		44	/* Level 2 halted */ +#define	EDEADLK		45	/* Resource deadlock would occur */ +#define	ENOLCK		46	/* No record locks available */ +#define	EBADE		50	/* Invalid exchange */ +#define	EBADR		51	/* Invalid request descriptor */ +#define	EXFULL		52	/* Exchange full */ +#define	ENOANO		53	/* No anode */ +#define	EBADRQC		54	/* Invalid request code */ +#define	EBADSLT		55	/* Invalid slot */ +#define	EDEADLOCK	56	/* File locking deadlock error */ +#define	EBFONT		59	/* Bad font file format */ +#define	ENOSTR		60	/* Device not a stream */ +#define	ENODATA		61	/* No data available */ +#define	ETIME		62	/* Timer expired */ +#define	ENOSR		63	/* Out of streams resources */ +#define	ENONET		64	/* Machine is not on the network */ +#define	ENOPKG		65	/* Package not installed */ +#define	EREMOTE		66	/* Object is remote */ +#define	ENOLINK		67	/* Link has been severed */ +#define	EADV		68	/* Advertise error */ +#define	ESRMNT		69	/* Srmount error */ +#define	ECOMM		70	/* Communication error on send */ +#define	EPROTO		71	/* Protocol error */ +#define	EDOTDOT		73	/* RFS specific error */ +#define	EMULTIHOP	74	/* Multihop attempted */ +#define	EBADMSG		77	/* Not a data message */ +#define	ENAMETOOLONG	78	/* File name too long */ +#define	EOVERFLOW	79	/* Value too large for defined data type */ +#define	ENOTUNIQ	80	/* Name not unique on network */ +#define	EBADFD		81	/* File descriptor in bad state */ +#define	EREMCHG		82	/* Remote address changed */ +#define	ELIBACC		83	/* Can not access a needed shared library */ +#define	ELIBBAD		84	/* Accessing a corrupted shared library */ +#define	ELIBSCN		85	/* .lib section in a.out corrupted */ +#define	ELIBMAX		86	/* Attempting to link in too many shared libraries */ +#define	ELIBEXEC	87	/* Cannot exec a shared library directly */ +#define	EILSEQ		88	/* Illegal byte sequence */ +#define	ENOSYS		89	/* Function not implemented */ +#define	ELOOP		90	/* Too many symbolic links encountered */ +#define	ERESTART	91	/* Interrupted system call should be restarted */ +#define	ESTRPIPE	92	/* Streams pipe error */ +#define	ENOTEMPTY	93	/* Directory not empty */ +#define	EUSERS		94	/* Too many users */ +#define	ENOTSOCK	95	/* Socket operation on non-socket */ +#define	EDESTADDRREQ	96	/* Destination address required */ +#define	EMSGSIZE	97	/* Message too long */ +#define	EPROTOTYPE	98	/* Protocol wrong type for socket */ +#define	ENOPROTOOPT	99	/* Protocol not available */ +#define	EPROTONOSUPPORT	120	/* Protocol not supported */ +#define	ESOCKTNOSUPPORT	121	/* Socket type not supported */ +#define	EOPNOTSUPP	122	/* Operation not supported on transport endpoint */ +#define	EPFNOSUPPORT	123	/* Protocol family not supported */ +#define	EAFNOSUPPORT	124	/* Address family not supported by protocol */ +#define	EADDRINUSE	125	/* Address already in use */ +#define	EADDRNOTAVAIL	126	/* Cannot assign requested address */ +#define	ENETDOWN	127	/* Network is down */ +#define	ENETUNREACH	128	/* Network is unreachable */ +#define	ENETRESET	129	/* Network dropped connection because of reset */ +#define	ECONNABORTED	130	/* Software caused connection abort */ +#define	ECONNRESET	131	/* Connection reset by peer */ +#define	ENOBUFS		132	/* No buffer space available */ +#define	EISCONN		133	/* Transport endpoint is already connected */ +#define	ENOTCONN	134	/* Transport endpoint is not connected */ +#define	EUCLEAN		135	/* Structure needs cleaning */ +#define	ENOTNAM		137	/* Not a XENIX named type file */ +#define	ENAVAIL		138	/* No XENIX semaphores available */ +#define	EISNAM		139	/* Is a named type file */ +#define	EREMOTEIO	140	/* Remote I/O error */ +#define EINIT		141	/* Reserved */ +#define EREMDEV		142	/* Error 142 */ +#define	ESHUTDOWN	143	/* Cannot send after transport endpoint shutdown */ +#define	ETOOMANYREFS	144	/* Too many references: cannot splice */ +#define	ETIMEDOUT	145	/* Connection timed out */ +#define	ECONNREFUSED	146	/* Connection refused */ +#define	EHOSTDOWN	147	/* Host is down */ +#define	EHOSTUNREACH	148	/* No route to host */ +#define	EWOULDBLOCK	EAGAIN	/* Operation would block */ +#define	EALREADY	149	/* Operation already in progress */ +#define	EINPROGRESS	150	/* Operation now in progress */ +#define	ESTALE		151	/* Stale NFS file handle */ +#define ECANCELED	158	/* AIO operation canceled */ + +#endif /* _ASM_MIPS_ERRNO_H */ diff --git a/include/asm-mips/mipsregs.h b/include/asm-mips/mipsregs.h index 61a0dac1c..be7e5c65e 100644 --- a/include/asm-mips/mipsregs.h +++ b/include/asm-mips/mipsregs.h @@ -7,8 +7,8 @@   * Copyright (C) 2000 Silicon Graphics, Inc.   * Modified for further R[236]000 support by Paul M. Antoine, 1996.   * Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com - * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved. - * Copyright (C) 2003  Maciej W. Rozycki + * Copyright (C) 2000, 07 MIPS Technologies, Inc. + * Copyright (C) 2003, 2004  Maciej W. Rozycki   */  #ifndef _ASM_MIPSREGS_H  #define _ASM_MIPSREGS_H @@ -29,6 +29,15 @@  #endif  /* + *  Configure language + */ +#ifdef __ASSEMBLY__ +#define _ULCAST_ +#else +#define _ULCAST_ (unsigned long) +#endif + +/*   * Coprocessor 0 register names   */  #define CP0_INDEX $0 @@ -55,12 +64,15 @@  #define CP0_XCONTEXT $20  #define CP0_FRAMEMASK $21  #define CP0_DIAGNOSTIC $22 +#define CP0_DEBUG $23 +#define CP0_DEPC $24  #define CP0_PERFORMANCE $25  #define CP0_ECC $26  #define CP0_CACHEERR $27  #define CP0_TAGLO $28  #define CP0_TAGHI $29  #define CP0_ERROREPC $30 +#define CP0_DESAVE $31  /*   * R4640/R4650 cp0 register names.  These registers are listed @@ -82,11 +94,27 @@  #define CP0_S1_DERRADDR0  $26  #define CP0_S1_DERRADDR1  $27  #define CP0_S1_INTCONTROL $20 + +/* + * Coprocessor 0 Set 2 register names + */ +#define CP0_S2_SRSCTL	$12	/* MIPSR2 */ + +/* + * Coprocessor 0 Set 3 register names + */ +#define CP0_S3_SRSMAP	$12	/* MIPSR2 */ + +/* + *  TX39 Series + */ +#define CP0_TX39_CACHE	$7 +  /*   * Coprocessor 1 (FPU) register names   */ -#define CP1_REVISION   $0 -#define CP1_STATUS     $31 +#define CP1_REVISION	$0 +#define CP1_STATUS	$31  /*   * FPU Status Register Values @@ -95,230 +123,113 @@   * Status Register Values   */ -#define FPU_CSR_FLUSH   0x01000000      /* flush denormalised results to 0 */ -#define FPU_CSR_COND    0x00800000      /* $fcc0 */ -#define FPU_CSR_COND0   0x00800000      /* $fcc0 */ -#define FPU_CSR_COND1   0x02000000      /* $fcc1 */ -#define FPU_CSR_COND2   0x04000000      /* $fcc2 */ -#define FPU_CSR_COND3   0x08000000      /* $fcc3 */ -#define FPU_CSR_COND4   0x10000000      /* $fcc4 */ -#define FPU_CSR_COND5   0x20000000      /* $fcc5 */ -#define FPU_CSR_COND6   0x40000000      /* $fcc6 */ -#define FPU_CSR_COND7   0x80000000      /* $fcc7 */ +#define FPU_CSR_FLUSH	0x01000000	/* flush denormalised results to 0 */ +#define FPU_CSR_COND	0x00800000	/* $fcc0 */ +#define FPU_CSR_COND0	0x00800000	/* $fcc0 */ +#define FPU_CSR_COND1	0x02000000	/* $fcc1 */ +#define FPU_CSR_COND2	0x04000000	/* $fcc2 */ +#define FPU_CSR_COND3	0x08000000	/* $fcc3 */ +#define FPU_CSR_COND4	0x10000000	/* $fcc4 */ +#define FPU_CSR_COND5	0x20000000	/* $fcc5 */ +#define FPU_CSR_COND6	0x40000000	/* $fcc6 */ +#define FPU_CSR_COND7	0x80000000	/* $fcc7 */  /*   * X the exception cause indicator   * E the exception enable   * S the sticky/flag bit -*/ -#define FPU_CSR_ALL_X 0x0003f000 -#define FPU_CSR_UNI_X   0x00020000 -#define FPU_CSR_INV_X   0x00010000 -#define FPU_CSR_DIV_X   0x00008000 -#define FPU_CSR_OVF_X   0x00004000 -#define FPU_CSR_UDF_X   0x00002000 -#define FPU_CSR_INE_X   0x00001000 + */ +#define FPU_CSR_ALL_X	0x0003f000 +#define FPU_CSR_UNI_X	0x00020000 +#define FPU_CSR_INV_X	0x00010000 +#define FPU_CSR_DIV_X	0x00008000 +#define FPU_CSR_OVF_X	0x00004000 +#define FPU_CSR_UDF_X	0x00002000 +#define FPU_CSR_INE_X	0x00001000 -#define FPU_CSR_ALL_E   0x00000f80 -#define FPU_CSR_INV_E   0x00000800 -#define FPU_CSR_DIV_E   0x00000400 -#define FPU_CSR_OVF_E   0x00000200 -#define FPU_CSR_UDF_E   0x00000100 -#define FPU_CSR_INE_E   0x00000080 +#define FPU_CSR_ALL_E	0x00000f80 +#define FPU_CSR_INV_E	0x00000800 +#define FPU_CSR_DIV_E	0x00000400 +#define FPU_CSR_OVF_E	0x00000200 +#define FPU_CSR_UDF_E	0x00000100 +#define FPU_CSR_INE_E	0x00000080 -#define FPU_CSR_ALL_S   0x0000007c -#define FPU_CSR_INV_S   0x00000040 -#define FPU_CSR_DIV_S   0x00000020 -#define FPU_CSR_OVF_S   0x00000010 -#define FPU_CSR_UDF_S   0x00000008 -#define FPU_CSR_INE_S   0x00000004 +#define FPU_CSR_ALL_S	0x0000007c +#define FPU_CSR_INV_S	0x00000040 +#define FPU_CSR_DIV_S	0x00000020 +#define FPU_CSR_OVF_S	0x00000010 +#define FPU_CSR_UDF_S	0x00000008 +#define FPU_CSR_INE_S	0x00000004  /* rounding mode */ -#define FPU_CSR_RN      0x0     /* nearest */ -#define FPU_CSR_RZ      0x1     /* towards zero */ -#define FPU_CSR_RU      0x2     /* towards +Infinity */ -#define FPU_CSR_RD      0x3     /* towards -Infinity */ - +#define FPU_CSR_RN	0x0	/* nearest */ +#define FPU_CSR_RZ	0x1	/* towards zero */ +#define FPU_CSR_RU	0x2	/* towards +Infinity */ +#define FPU_CSR_RD	0x3	/* towards -Infinity */  /*   * Values for PageMask register   */ -#include <linux/config.h>  #ifdef CONFIG_CPU_VR41XX -#define PM_1K   0x00000000 -#define PM_4K   0x00001800 -#define PM_16K  0x00007800 -#define PM_64K  0x0001f800 -#define PM_256K 0x0007f800 -#else -#define PM_4K   0x00000000 -#define PM_16K  0x00006000 -#define PM_64K  0x0001e000 -#define PM_256K 0x0007e000 -#define PM_1M   0x001fe000 -#define PM_4M   0x007fe000 -#define PM_16M  0x01ffe000 -#endif - -/* - * Values used for computation of new tlb entries - */ -#define PL_4K   12 -#define PL_16K  14 -#define PL_64K  16 -#define PL_256K 18 -#define PL_1M   20 -#define PL_4M   22 -#define PL_16M  24 - -/* - * Macros to access the system control coprocessor - */ -#define read_32bit_cp0_register(source)                         \ -({ int __res;                                                   \ -	__asm__ __volatile__(                                   \ -	".set\tpush\n\t"					\ -	".set\treorder\n\t"					\ -	"mfc0\t%0,"STR(source)"\n\t"                            \ -	".set\tpop"						\ -	: "=r" (__res));                                        \ -	__res;}) -#define read_32bit_cp0_set1_register(source)                    \ -({ int __res;                                                   \ -	__asm__ __volatile__(                                   \ -	".set\tpush\n\t"					\ -	".set\treorder\n\t"					\ -	"cfc0\t%0,"STR(source)"\n\t"                            \ -	".set\tpop"						\ -	: "=r" (__res));                                        \ -	__res;}) +/* Why doesn't stupidity hurt ... */ -/* - * For now use this only with interrupts disabled! - */ -#define read_64bit_cp0_register(source)                         \ -({ int __res;                                                   \ -	__asm__ __volatile__(                                   \ -	".set\tmips3\n\t"                                       \ -	"dmfc0\t%0,"STR(source)"\n\t"                           \ -	".set\tmips0"                                           \ -	: "=r" (__res));                                        \ -	__res;}) +#define PM_1K		0x00000000 +#define PM_4K		0x00001800 +#define PM_16K		0x00007800 +#define PM_64K		0x0001f800 +#define PM_256K		0x0007f800 -#define write_32bit_cp0_register(register,value)                \ -	__asm__ __volatile__(                                   \ -	"mtc0\t%0,"STR(register)"\n\t"				\ -	"nop"							\ -	: : "r" (value)); +#else -#define write_32bit_cp0_set1_register(register,value)           \ -	__asm__ __volatile__(                                   \ -	"ctc0\t%0,"STR(register)"\n\t"				\ -	"nop"							\ -	: : "r" (value)); +#define PM_4K		0x00000000 +#define PM_16K		0x00006000 +#define PM_64K		0x0001e000 +#define PM_256K		0x0007e000 +#define PM_1M		0x001fe000 +#define PM_4M		0x007fe000 +#define PM_16M		0x01ffe000 +#define PM_64M		0x07ffe000 +#define PM_256M		0x1fffe000 -#define write_64bit_cp0_register(register,value)                \ -	__asm__ __volatile__(                                   \ -	".set\tmips3\n\t"                                       \ -	"dmtc0\t%0,"STR(register)"\n\t"                         \ -	".set\tmips0"                                           \ -	: : "r" (value)) +#endif  /* - * This should be changed when we get a compiler that support the MIPS32 ISA. + * Values used for computation of new tlb entries   */ -#define read_mips32_cp0_config1()                               \ -({ int __res;                                                   \ -	__asm__ __volatile__(                                   \ -	".set\tnoreorder\n\t"                                   \ -	".set\tnoat\n\t"                                        \ -	".word\t0x40018001\n\t"                                 \ -	"move\t%0,$1\n\t"                                       \ -	".set\tat\n\t"                                          \ -	".set\treorder"                                         \ -	:"=r" (__res));                                         \ -	__res;}) - -#define tlb_write_indexed()                                     \ -	__asm__ __volatile__(                                   \ -		".set noreorder\n\t"                            \ -		"tlbwi\n\t"                                     \ -".set reorder") +#define PL_4K		12 +#define PL_16K		14 +#define PL_64K		16 +#define PL_256K		18 +#define PL_1M		20 +#define PL_4M		22 +#define PL_16M		24 +#define PL_64M		26 +#define PL_256M		28  /*   * R4x00 interrupt enable / cause bits   */ -#define IE_SW0          (1<< 8) -#define IE_SW1          (1<< 9) -#define IE_IRQ0         (1<<10) -#define IE_IRQ1         (1<<11) -#define IE_IRQ2         (1<<12) -#define IE_IRQ3         (1<<13) -#define IE_IRQ4         (1<<14) -#define IE_IRQ5         (1<<15) +#define IE_SW0		(_ULCAST_(1) <<  8) +#define IE_SW1		(_ULCAST_(1) <<  9) +#define IE_IRQ0		(_ULCAST_(1) << 10) +#define IE_IRQ1		(_ULCAST_(1) << 11) +#define IE_IRQ2		(_ULCAST_(1) << 12) +#define IE_IRQ3		(_ULCAST_(1) << 13) +#define IE_IRQ4		(_ULCAST_(1) << 14) +#define IE_IRQ5		(_ULCAST_(1) << 15)  /*   * R4x00 interrupt cause bits   */ -#define C_SW0           (1<< 8) -#define C_SW1           (1<< 9) -#define C_IRQ0          (1<<10) -#define C_IRQ1          (1<<11) -#define C_IRQ2          (1<<12) -#define C_IRQ3          (1<<13) -#define C_IRQ4          (1<<14) -#define C_IRQ5          (1<<15) - -#ifndef _LANGUAGE_ASSEMBLY -/* - * Manipulate the status register. - * Mostly used to access the interrupt bits. - */ -#define __BUILD_SET_CP0(name,register)                          \ -extern __inline__ unsigned int                                  \ -set_cp0_##name(unsigned int set)				\ -{                                                               \ -	unsigned int res;                                       \ -								\ -	res = read_32bit_cp0_register(register);                \ -	res |= set;						\ -	write_32bit_cp0_register(register, res);		\ -								\ -	return res;                                             \ -}								\ -								\ -extern __inline__ unsigned int                                  \ -clear_cp0_##name(unsigned int clear)				\ -{                                                               \ -	unsigned int res;                                       \ -								\ -	res = read_32bit_cp0_register(register);                \ -	res &= ~clear;						\ -	write_32bit_cp0_register(register, res);		\ -								\ -	return res;                                             \ -}								\ -								\ -extern __inline__ unsigned int                                  \ -change_cp0_##name(unsigned int change, unsigned int new)	\ -{                                                               \ -	unsigned int res;                                       \ -								\ -	res = read_32bit_cp0_register(register);                \ -	res &= ~change;                                         \ -	res |= (new & change);                                  \ -	if(change)                                              \ -		write_32bit_cp0_register(register, res);        \ -								\ -	return res;                                             \ -} - -__BUILD_SET_CP0(status,CP0_STATUS) -__BUILD_SET_CP0(cause,CP0_CAUSE) -__BUILD_SET_CP0(config,CP0_CONFIG) - -#endif /* defined (_LANGUAGE_ASSEMBLY) */ +#define C_SW0		(_ULCAST_(1) <<  8) +#define C_SW1		(_ULCAST_(1) <<  9) +#define C_IRQ0		(_ULCAST_(1) << 10) +#define C_IRQ1		(_ULCAST_(1) << 11) +#define C_IRQ2		(_ULCAST_(1) << 12) +#define C_IRQ3		(_ULCAST_(1) << 13) +#define C_IRQ4		(_ULCAST_(1) << 14) +#define C_IRQ5		(_ULCAST_(1) << 15)  /*   * Bitfields in the R4xx0 cp0 status register @@ -337,9 +248,16 @@ __BUILD_SET_CP0(config,CP0_CONFIG)  #define ST0_CE			0x00020000  /* + * Setting c0_status.co enables Hit_Writeback and Hit_Writeback_Invalidate + * cacheops in userspace.  This bit exists only on RM7000 and RM9000 + * processors. + */ +#define ST0_CO			0x08000000 + +/*   * Bitfields in the R[23]000 cp0 status register.   */ -#define ST0_IEC                 0x00000001 +#define ST0_IEC			0x00000001  #define ST0_KUC			0x00000002  #define ST0_IEP			0x00000004  #define ST0_KUP			0x00000008 @@ -353,9 +271,14 @@ __BUILD_SET_CP0(config,CP0_CONFIG)  /*   * Bits specific to the R4640/R4650   */ -#define ST0_UM                 (1   <<  4) -#define ST0_IL                 (1   << 23) -#define ST0_DL                 (1   << 24) +#define ST0_UM			(_ULCAST_(1) <<  4) +#define ST0_IL			(_ULCAST_(1) << 23) +#define ST0_DL			(_ULCAST_(1) << 24) + +/* + * Enable the MIPS MDMX and DSP ASEs + */ +#define ST0_MX			0x01000000  /*   * Bitfields in the TX39 family CP0 Configuration Register 3 @@ -395,39 +318,40 @@ __BUILD_SET_CP0(config,CP0_CONFIG)   */  #define ST0_IM			0x0000ff00  #define  STATUSB_IP0		8 -#define  STATUSF_IP0		(1   <<  8) +#define  STATUSF_IP0		(_ULCAST_(1) <<  8)  #define  STATUSB_IP1		9 -#define  STATUSF_IP1		(1   <<  9) +#define  STATUSF_IP1		(_ULCAST_(1) <<  9)  #define  STATUSB_IP2		10 -#define  STATUSF_IP2		(1   << 10) +#define  STATUSF_IP2		(_ULCAST_(1) << 10)  #define  STATUSB_IP3		11 -#define  STATUSF_IP3		(1   << 11) +#define  STATUSF_IP3		(_ULCAST_(1) << 11)  #define  STATUSB_IP4		12 -#define  STATUSF_IP4		(1   << 12) +#define  STATUSF_IP4		(_ULCAST_(1) << 12)  #define  STATUSB_IP5		13 -#define  STATUSF_IP5		(1   << 13) +#define  STATUSF_IP5		(_ULCAST_(1) << 13)  #define  STATUSB_IP6		14 -#define  STATUSF_IP6		(1   << 14) +#define  STATUSF_IP6		(_ULCAST_(1) << 14)  #define  STATUSB_IP7		15 -#define  STATUSF_IP7		(1   << 15) +#define  STATUSF_IP7		(_ULCAST_(1) << 15)  #define  STATUSB_IP8		0 -#define  STATUSF_IP8		(1   << 0) +#define  STATUSF_IP8		(_ULCAST_(1) <<  0)  #define  STATUSB_IP9		1 -#define  STATUSF_IP9		(1   << 1) +#define  STATUSF_IP9		(_ULCAST_(1) <<  1)  #define  STATUSB_IP10		2 -#define  STATUSF_IP10		(1   << 2) +#define  STATUSF_IP10		(_ULCAST_(1) <<  2)  #define  STATUSB_IP11		3 -#define  STATUSF_IP11		(1   << 3) +#define  STATUSF_IP11		(_ULCAST_(1) <<  3)  #define  STATUSB_IP12		4 -#define  STATUSF_IP12		(1   << 4) +#define  STATUSF_IP12		(_ULCAST_(1) <<  4)  #define  STATUSB_IP13		5 -#define  STATUSF_IP13		(1   << 5) +#define  STATUSF_IP13		(_ULCAST_(1) <<  5)  #define  STATUSB_IP14		6 -#define  STATUSF_IP14		(1   << 6) +#define  STATUSF_IP14		(_ULCAST_(1) <<  6)  #define  STATUSB_IP15		7 -#define  STATUSF_IP15		(1   << 7) +#define  STATUSF_IP15		(_ULCAST_(1) <<  7)  #define ST0_CH			0x00040000  #define ST0_SR			0x00100000 +#define ST0_TS			0x00200000  #define ST0_BEV			0x00400000  #define ST0_RE			0x02000000  #define ST0_FR			0x04000000 @@ -444,35 +368,36 @@ __BUILD_SET_CP0(config,CP0_CONFIG)   * Refer to your MIPS R4xx0 manual, chapter 5 for explanation.   */  #define  CAUSEB_EXCCODE		2 -#define  CAUSEF_EXCCODE		(31  <<  2) +#define  CAUSEF_EXCCODE		(_ULCAST_(31)  <<  2)  #define  CAUSEB_IP		8 -#define  CAUSEF_IP		(255 <<  8) +#define  CAUSEF_IP		(_ULCAST_(255) <<  8)  #define  CAUSEB_IP0		8 -#define  CAUSEF_IP0		(1   <<  8) +#define  CAUSEF_IP0		(_ULCAST_(1)   <<  8)  #define  CAUSEB_IP1		9 -#define  CAUSEF_IP1		(1   <<  9) +#define  CAUSEF_IP1		(_ULCAST_(1)   <<  9)  #define  CAUSEB_IP2		10 -#define  CAUSEF_IP2		(1   << 10) +#define  CAUSEF_IP2		(_ULCAST_(1)   << 10)  #define  CAUSEB_IP3		11 -#define  CAUSEF_IP3		(1   << 11) +#define  CAUSEF_IP3		(_ULCAST_(1)   << 11)  #define  CAUSEB_IP4		12 -#define  CAUSEF_IP4		(1   << 12) +#define  CAUSEF_IP4		(_ULCAST_(1)   << 12)  #define  CAUSEB_IP5		13 -#define  CAUSEF_IP5		(1   << 13) +#define  CAUSEF_IP5		(_ULCAST_(1)   << 13)  #define  CAUSEB_IP6		14 -#define  CAUSEF_IP6		(1   << 14) +#define  CAUSEF_IP6		(_ULCAST_(1)   << 14)  #define  CAUSEB_IP7		15 -#define  CAUSEF_IP7		(1   << 15) +#define  CAUSEF_IP7		(_ULCAST_(1)   << 15)  #define  CAUSEB_IV		23 -#define  CAUSEF_IV		(1   << 23) +#define  CAUSEF_IV		(_ULCAST_(1)   << 23)  #define  CAUSEB_CE		28 -#define  CAUSEF_CE		(3   << 28) +#define  CAUSEF_CE		(_ULCAST_(3)   << 28)  #define  CAUSEB_BD		31 -#define  CAUSEF_BD		(1   << 31) +#define  CAUSEF_BD		(_ULCAST_(1)   << 31)  /* - * Bits in the coprozessor 0 config register. + * Bits in the coprocessor 0 config register.   */ +/* Generic bits.  */  #define CONF_CM_CACHABLE_NO_WA		0  #define CONF_CM_CACHABLE_WA		1  #define CONF_CM_UNCACHED		2 @@ -482,66 +407,958 @@ __BUILD_SET_CP0(config,CP0_CONFIG)  #define CONF_CM_CACHABLE_CUW		6  #define CONF_CM_CACHABLE_ACCELERATED	7  #define CONF_CM_CMASK			7 -#define CONF_DB				(1 <<  4) -#define CONF_IB				(1 <<  5) -#define CONF_SC				(1 << 17) -#define CONF_AC                         (1 << 23) -#define CONF_HALT                       (1 << 25) +#define CONF_BE			(_ULCAST_(1) << 15) + +/* Bits common to various processors.  */ +#define CONF_CU			(_ULCAST_(1) <<  3) +#define CONF_DB			(_ULCAST_(1) <<  4) +#define CONF_IB			(_ULCAST_(1) <<  5) +#define CONF_DC			(_ULCAST_(7) <<  6) +#define CONF_IC			(_ULCAST_(7) <<  9) +#define CONF_EB			(_ULCAST_(1) << 13) +#define CONF_EM			(_ULCAST_(1) << 14) +#define CONF_SM			(_ULCAST_(1) << 16) +#define CONF_SC			(_ULCAST_(1) << 17) +#define CONF_EW			(_ULCAST_(3) << 18) +#define CONF_EP			(_ULCAST_(15)<< 24) +#define CONF_EC			(_ULCAST_(7) << 28) +#define CONF_CM			(_ULCAST_(1) << 31) + +/* Bits specific to the R4xx0.  */ +#define R4K_CONF_SW		(_ULCAST_(1) << 20) +#define R4K_CONF_SS		(_ULCAST_(1) << 21) +#define R4K_CONF_SB		(_ULCAST_(3) << 22) + +/* Bits specific to the R5000.  */ +#define R5K_CONF_SE		(_ULCAST_(1) << 12) +#define R5K_CONF_SS		(_ULCAST_(3) << 20) + +/* Bits specific to the RM7000.  */ +#define RM7K_CONF_SE		(_ULCAST_(1) <<  3) +#define RM7K_CONF_TE		(_ULCAST_(1) << 12) +#define RM7K_CONF_CLK		(_ULCAST_(1) << 16) +#define RM7K_CONF_TC		(_ULCAST_(1) << 17) +#define RM7K_CONF_SI		(_ULCAST_(3) << 20) +#define RM7K_CONF_SC		(_ULCAST_(1) << 31) + +/* Bits specific to the R10000.  */ +#define R10K_CONF_DN		(_ULCAST_(3) <<  3) +#define R10K_CONF_CT		(_ULCAST_(1) <<  5) +#define R10K_CONF_PE		(_ULCAST_(1) <<  6) +#define R10K_CONF_PM		(_ULCAST_(3) <<  7) +#define R10K_CONF_EC		(_ULCAST_(15)<<  9) +#define R10K_CONF_SB		(_ULCAST_(1) << 13) +#define R10K_CONF_SK		(_ULCAST_(1) << 14) +#define R10K_CONF_SS		(_ULCAST_(7) << 16) +#define R10K_CONF_SC		(_ULCAST_(7) << 19) +#define R10K_CONF_DC		(_ULCAST_(7) << 26) +#define R10K_CONF_IC		(_ULCAST_(7) << 29) + +/* Bits specific to the VR41xx.  */ +#define VR41_CONF_CS		(_ULCAST_(1) << 12) +#define VR41_CONF_P4K		(_ULCAST_(1) << 13) +#define VR41_CONF_BP		(_ULCAST_(1) << 16) +#define VR41_CONF_M16		(_ULCAST_(1) << 20) +#define VR41_CONF_AD		(_ULCAST_(1) << 23) + +/* Bits specific to the R30xx.  */ +#define R30XX_CONF_FDM		(_ULCAST_(1) << 19) +#define R30XX_CONF_REV		(_ULCAST_(1) << 22) +#define R30XX_CONF_AC		(_ULCAST_(1) << 23) +#define R30XX_CONF_RF		(_ULCAST_(1) << 24) +#define R30XX_CONF_HALT		(_ULCAST_(1) << 25) +#define R30XX_CONF_FPINT	(_ULCAST_(7) << 26) +#define R30XX_CONF_DBR		(_ULCAST_(1) << 29) +#define R30XX_CONF_SB		(_ULCAST_(1) << 30) +#define R30XX_CONF_LOCK		(_ULCAST_(1) << 31) + +/* Bits specific to the TX49.  */ +#define TX49_CONF_DC		(_ULCAST_(1) << 16) +#define TX49_CONF_IC		(_ULCAST_(1) << 17)  /* conflict with CONF_SC */ +#define TX49_CONF_HALT		(_ULCAST_(1) << 18) +#define TX49_CONF_CWFON		(_ULCAST_(1) << 27) + +/* Bits specific to the MIPS32/64 PRA.  */ +#define MIPS_CONF_MT		(_ULCAST_(7) <<  7) +#define MIPS_CONF_AR		(_ULCAST_(7) << 10) +#define MIPS_CONF_AT		(_ULCAST_(3) << 13) +#define MIPS_CONF_M		(_ULCAST_(1) << 31)  /* - * R10000 performance counter definitions. - * - * FIXME: The R10000 performance counter opens a nice way to implement CPU - *        time accounting with a precission of one cycle.  I don't have - *        R10000 silicon but just a manual, so ... + * Bits in the MIPS32/64 PRA coprocessor 0 config registers 1 and above. + */ +#define MIPS_CONF1_FP		(_ULCAST_(1) <<  0) +#define MIPS_CONF1_EP		(_ULCAST_(1) <<  1) +#define MIPS_CONF1_CA		(_ULCAST_(1) <<  2) +#define MIPS_CONF1_WR		(_ULCAST_(1) <<  3) +#define MIPS_CONF1_PC		(_ULCAST_(1) <<  4) +#define MIPS_CONF1_MD		(_ULCAST_(1) <<  5) +#define MIPS_CONF1_C2		(_ULCAST_(1) <<  6) +#define MIPS_CONF1_DA		(_ULCAST_(7) <<  7) +#define MIPS_CONF1_DL		(_ULCAST_(7) << 10) +#define MIPS_CONF1_DS		(_ULCAST_(7) << 13) +#define MIPS_CONF1_IA		(_ULCAST_(7) << 16) +#define MIPS_CONF1_IL		(_ULCAST_(7) << 19) +#define MIPS_CONF1_IS		(_ULCAST_(7) << 22) +#define MIPS_CONF1_TLBS		(_ULCAST_(63)<< 25) + +#define MIPS_CONF2_SA		(_ULCAST_(15)<<  0) +#define MIPS_CONF2_SL		(_ULCAST_(15)<<  4) +#define MIPS_CONF2_SS		(_ULCAST_(15)<<  8) +#define MIPS_CONF2_SU		(_ULCAST_(15)<< 12) +#define MIPS_CONF2_TA		(_ULCAST_(15)<< 16) +#define MIPS_CONF2_TL		(_ULCAST_(15)<< 20) +#define MIPS_CONF2_TS		(_ULCAST_(15)<< 24) +#define MIPS_CONF2_TU		(_ULCAST_(7) << 28) + +#define MIPS_CONF3_TL		(_ULCAST_(1) <<  0) +#define MIPS_CONF3_SM		(_ULCAST_(1) <<  1) +#define MIPS_CONF3_MT		(_ULCAST_(1) <<  2) +#define MIPS_CONF3_SP		(_ULCAST_(1) <<  4) +#define MIPS_CONF3_VINT		(_ULCAST_(1) <<  5) +#define MIPS_CONF3_VEIC		(_ULCAST_(1) <<  6) +#define MIPS_CONF3_LPA		(_ULCAST_(1) <<  7) +#define MIPS_CONF3_DSP		(_ULCAST_(1) << 10) +#define MIPS_CONF3_ULRI		(_ULCAST_(1) << 13) + +#define MIPS_CONF7_WII		(_ULCAST_(1) << 31) + +#define MIPS_CONF7_RPS		(_ULCAST_(1) << 2) + +/* + * Bits in the MIPS32/64 coprocessor 1 (FPU) revision register. + */ +#define MIPS_FPIR_S		(_ULCAST_(1) << 16) +#define MIPS_FPIR_D		(_ULCAST_(1) << 17) +#define MIPS_FPIR_PS		(_ULCAST_(1) << 18) +#define MIPS_FPIR_3D		(_ULCAST_(1) << 19) +#define MIPS_FPIR_W		(_ULCAST_(1) << 20) +#define MIPS_FPIR_L		(_ULCAST_(1) << 21) +#define MIPS_FPIR_F64		(_ULCAST_(1) << 22) + +#ifndef __ASSEMBLY__ + +/* + * Functions to access the R10000 performance counters.  These are basically + * mfc0 and mtc0 instructions from and to coprocessor register with a 5-bit + * performance counter number encoded into bits 1 ... 5 of the instruction. + * Only performance counters 0 to 1 actually exist, so for a non-R10000 aware + * disassembler these will look like an access to sel 0 or 1. + */ +#define read_r10k_perf_cntr(counter)				\ +({								\ +	unsigned int __res;					\ +	__asm__ __volatile__(					\ +	"mfpc\t%0, %1"						\ +	: "=r" (__res)						\ +	: "i" (counter));					\ +								\ +	__res;							\ +}) + +#define write_r10k_perf_cntr(counter,val)			\ +do {								\ +	__asm__ __volatile__(					\ +	"mtpc\t%0, %1"						\ +	:							\ +	: "r" (val), "i" (counter));				\ +} while (0) + +#define read_r10k_perf_event(counter)				\ +({								\ +	unsigned int __res;					\ +	__asm__ __volatile__(					\ +	"mfps\t%0, %1"						\ +	: "=r" (__res)						\ +	: "i" (counter));					\ +								\ +	__res;							\ +}) + +#define write_r10k_perf_cntl(counter,val)			\ +do {								\ +	__asm__ __volatile__(					\ +	"mtps\t%0, %1"						\ +	:							\ +	: "r" (val), "i" (counter));				\ +} while (0) + +/* + * Macros to access the system control coprocessor + */ + +#define __read_32bit_c0_register(source, sel)				\ +({ int __res;								\ +	if (sel == 0)							\ +		__asm__ __volatile__(					\ +			"mfc0\t%0, " #source "\n\t"			\ +			: "=r" (__res));				\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips32\n\t"				\ +			"mfc0\t%0, " #source ", " #sel "\n\t"		\ +			".set\tmips0\n\t"				\ +			: "=r" (__res));				\ +	__res;								\ +}) + +#define __read_64bit_c0_register(source, sel)				\ +({ unsigned long long __res;						\ +	if (sizeof(unsigned long) == 4)					\ +		__res = __read_64bit_c0_split(source, sel);		\ +	else if (sel == 0)						\ +		__asm__ __volatile__(					\ +			".set\tmips3\n\t"				\ +			"dmfc0\t%0, " #source "\n\t"			\ +			".set\tmips0"					\ +			: "=r" (__res));				\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmfc0\t%0, " #source ", " #sel "\n\t"		\ +			".set\tmips0"					\ +			: "=r" (__res));				\ +	__res;								\ +}) + +#define __write_32bit_c0_register(register, sel, value)			\ +do {									\ +	if (sel == 0)							\ +		__asm__ __volatile__(					\ +			"mtc0\t%z0, " #register "\n\t"			\ +			: : "Jr" ((unsigned int)(value)));		\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips32\n\t"				\ +			"mtc0\t%z0, " #register ", " #sel "\n\t"	\ +			".set\tmips0"					\ +			: : "Jr" ((unsigned int)(value)));		\ +} while (0) + +#define __write_64bit_c0_register(register, sel, value)			\ +do {									\ +	if (sizeof(unsigned long) == 4)					\ +		__write_64bit_c0_split(register, sel, value);		\ +	else if (sel == 0)						\ +		__asm__ __volatile__(					\ +			".set\tmips3\n\t"				\ +			"dmtc0\t%z0, " #register "\n\t"			\ +			".set\tmips0"					\ +			: : "Jr" (value));				\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmtc0\t%z0, " #register ", " #sel "\n\t"	\ +			".set\tmips0"					\ +			: : "Jr" (value));				\ +} while (0) + +#define __read_ulong_c0_register(reg, sel)				\ +	((sizeof(unsigned long) == 4) ?					\ +	(unsigned long) __read_32bit_c0_register(reg, sel) :		\ +	(unsigned long) __read_64bit_c0_register(reg, sel)) + +#define __write_ulong_c0_register(reg, sel, val)			\ +do {									\ +	if (sizeof(unsigned long) == 4)					\ +		__write_32bit_c0_register(reg, sel, val);		\ +	else								\ +		__write_64bit_c0_register(reg, sel, val);		\ +} while (0) + +/* + * On RM7000/RM9000 these are uses to access cop0 set 1 registers + */ +#define __read_32bit_c0_ctrl_register(source)				\ +({ int __res;								\ +	__asm__ __volatile__(						\ +		"cfc0\t%0, " #source "\n\t"				\ +		: "=r" (__res));					\ +	__res;								\ +}) + +#define __write_32bit_c0_ctrl_register(register, value)			\ +do {									\ +	__asm__ __volatile__(						\ +		"ctc0\t%z0, " #register "\n\t"				\ +		: : "Jr" ((unsigned int)(value)));			\ +} while (0) + +/* + * These versions are only needed for systems with more than 38 bits of + * physical address space running the 32-bit kernel.  That's none atm :-) + */ +#define __read_64bit_c0_split(source, sel)				\ +({									\ +	unsigned long long __val;					\ +	unsigned long __flags;						\ +									\ +	local_irq_save(__flags);					\ +	if (sel == 0)							\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmfc0\t%M0, " #source "\n\t"			\ +			"dsll\t%L0, %M0, 32\n\t"			\ +			"dsrl\t%M0, %M0, 32\n\t"			\ +			"dsrl\t%L0, %L0, 32\n\t"			\ +			".set\tmips0"					\ +			: "=r" (__val));				\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dmfc0\t%M0, " #source ", " #sel "\n\t"		\ +			"dsll\t%L0, %M0, 32\n\t"			\ +			"dsrl\t%M0, %M0, 32\n\t"			\ +			"dsrl\t%L0, %L0, 32\n\t"			\ +			".set\tmips0"					\ +			: "=r" (__val));				\ +	local_irq_restore(__flags);					\ +									\ +	__val;								\ +}) + +#define __write_64bit_c0_split(source, sel, val)			\ +do {									\ +	unsigned long __flags;						\ +									\ +	local_irq_save(__flags);					\ +	if (sel == 0)							\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dsll\t%L0, %L0, 32\n\t"			\ +			"dsrl\t%L0, %L0, 32\n\t"			\ +			"dsll\t%M0, %M0, 32\n\t"			\ +			"or\t%L0, %L0, %M0\n\t"				\ +			"dmtc0\t%L0, " #source "\n\t"			\ +			".set\tmips0"					\ +			: : "r" (val));					\ +	else								\ +		__asm__ __volatile__(					\ +			".set\tmips64\n\t"				\ +			"dsll\t%L0, %L0, 32\n\t"			\ +			"dsrl\t%L0, %L0, 32\n\t"			\ +			"dsll\t%M0, %M0, 32\n\t"			\ +			"or\t%L0, %L0, %M0\n\t"				\ +			"dmtc0\t%L0, " #source ", " #sel "\n\t"		\ +			".set\tmips0"					\ +			: : "r" (val));					\ +	local_irq_restore(__flags);					\ +} while (0) + +#define read_c0_index()		__read_32bit_c0_register($0, 0) +#define write_c0_index(val)	__write_32bit_c0_register($0, 0, val) + +#define read_c0_entrylo0()	__read_ulong_c0_register($2, 0) +#define write_c0_entrylo0(val)	__write_ulong_c0_register($2, 0, val) + +#define read_c0_entrylo1()	__read_ulong_c0_register($3, 0) +#define write_c0_entrylo1(val)	__write_ulong_c0_register($3, 0, val) + +#define read_c0_conf()		__read_32bit_c0_register($3, 0) +#define write_c0_conf(val)	__write_32bit_c0_register($3, 0, val) + +#define read_c0_context()	__read_ulong_c0_register($4, 0) +#define write_c0_context(val)	__write_ulong_c0_register($4, 0, val) + +#define read_c0_userlocal()	__read_ulong_c0_register($4, 2) +#define write_c0_userlocal(val)	__write_ulong_c0_register($4, 2, val) + +#define read_c0_pagemask()	__read_32bit_c0_register($5, 0) +#define write_c0_pagemask(val)	__write_32bit_c0_register($5, 0, val) + +#define read_c0_wired()		__read_32bit_c0_register($6, 0) +#define write_c0_wired(val)	__write_32bit_c0_register($6, 0, val) + +#define read_c0_info()		__read_32bit_c0_register($7, 0) + +#define read_c0_cache()		__read_32bit_c0_register($7, 0)	/* TX39xx */ +#define write_c0_cache(val)	__write_32bit_c0_register($7, 0, val) + +#define read_c0_badvaddr()	__read_ulong_c0_register($8, 0) +#define write_c0_badvaddr(val)	__write_ulong_c0_register($8, 0, val) + +#define read_c0_count()		__read_32bit_c0_register($9, 0) +#define write_c0_count(val)	__write_32bit_c0_register($9, 0, val) + +#define read_c0_count2()	__read_32bit_c0_register($9, 6) /* pnx8550 */ +#define write_c0_count2(val)	__write_32bit_c0_register($9, 6, val) + +#define read_c0_count3()	__read_32bit_c0_register($9, 7) /* pnx8550 */ +#define write_c0_count3(val)	__write_32bit_c0_register($9, 7, val) + +#define read_c0_entryhi()	__read_ulong_c0_register($10, 0) +#define write_c0_entryhi(val)	__write_ulong_c0_register($10, 0, val) + +#define read_c0_compare()	__read_32bit_c0_register($11, 0) +#define write_c0_compare(val)	__write_32bit_c0_register($11, 0, val) + +#define read_c0_compare2()	__read_32bit_c0_register($11, 6) /* pnx8550 */ +#define write_c0_compare2(val)	__write_32bit_c0_register($11, 6, val) + +#define read_c0_compare3()	__read_32bit_c0_register($11, 7) /* pnx8550 */ +#define write_c0_compare3(val)	__write_32bit_c0_register($11, 7, val) + +#define read_c0_status()	__read_32bit_c0_register($12, 0) +#ifdef CONFIG_MIPS_MT_SMTC +#define write_c0_status(val)						\ +do {									\ +	__write_32bit_c0_register($12, 0, val);				\ +	__ehb();							\ +} while (0) +#else +/* + * Legacy non-SMTC code, which may be hazardous + * but which might not support EHB + */ +#define write_c0_status(val)	__write_32bit_c0_register($12, 0, val) +#endif /* CONFIG_MIPS_MT_SMTC */ + +#define read_c0_cause()		__read_32bit_c0_register($13, 0) +#define write_c0_cause(val)	__write_32bit_c0_register($13, 0, val) + +#define read_c0_epc()		__read_ulong_c0_register($14, 0) +#define write_c0_epc(val)	__write_ulong_c0_register($14, 0, val) + +#define read_c0_prid()		__read_32bit_c0_register($15, 0) + +#define read_c0_config()	__read_32bit_c0_register($16, 0) +#define read_c0_config1()	__read_32bit_c0_register($16, 1) +#define read_c0_config2()	__read_32bit_c0_register($16, 2) +#define read_c0_config3()	__read_32bit_c0_register($16, 3) +#define read_c0_config4()	__read_32bit_c0_register($16, 4) +#define read_c0_config5()	__read_32bit_c0_register($16, 5) +#define read_c0_config6()	__read_32bit_c0_register($16, 6) +#define read_c0_config7()	__read_32bit_c0_register($16, 7) +#define write_c0_config(val)	__write_32bit_c0_register($16, 0, val) +#define write_c0_config1(val)	__write_32bit_c0_register($16, 1, val) +#define write_c0_config2(val)	__write_32bit_c0_register($16, 2, val) +#define write_c0_config3(val)	__write_32bit_c0_register($16, 3, val) +#define write_c0_config4(val)	__write_32bit_c0_register($16, 4, val) +#define write_c0_config5(val)	__write_32bit_c0_register($16, 5, val) +#define write_c0_config6(val)	__write_32bit_c0_register($16, 6, val) +#define write_c0_config7(val)	__write_32bit_c0_register($16, 7, val) + +/* + * The WatchLo register.  There may be upto 8 of them.   */ +#define read_c0_watchlo0()	__read_ulong_c0_register($18, 0) +#define read_c0_watchlo1()	__read_ulong_c0_register($18, 1) +#define read_c0_watchlo2()	__read_ulong_c0_register($18, 2) +#define read_c0_watchlo3()	__read_ulong_c0_register($18, 3) +#define read_c0_watchlo4()	__read_ulong_c0_register($18, 4) +#define read_c0_watchlo5()	__read_ulong_c0_register($18, 5) +#define read_c0_watchlo6()	__read_ulong_c0_register($18, 6) +#define read_c0_watchlo7()	__read_ulong_c0_register($18, 7) +#define write_c0_watchlo0(val)	__write_ulong_c0_register($18, 0, val) +#define write_c0_watchlo1(val)	__write_ulong_c0_register($18, 1, val) +#define write_c0_watchlo2(val)	__write_ulong_c0_register($18, 2, val) +#define write_c0_watchlo3(val)	__write_ulong_c0_register($18, 3, val) +#define write_c0_watchlo4(val)	__write_ulong_c0_register($18, 4, val) +#define write_c0_watchlo5(val)	__write_ulong_c0_register($18, 5, val) +#define write_c0_watchlo6(val)	__write_ulong_c0_register($18, 6, val) +#define write_c0_watchlo7(val)	__write_ulong_c0_register($18, 7, val) + +/* + * The WatchHi register.  There may be upto 8 of them. + */ +#define read_c0_watchhi0()	__read_32bit_c0_register($19, 0) +#define read_c0_watchhi1()	__read_32bit_c0_register($19, 1) +#define read_c0_watchhi2()	__read_32bit_c0_register($19, 2) +#define read_c0_watchhi3()	__read_32bit_c0_register($19, 3) +#define read_c0_watchhi4()	__read_32bit_c0_register($19, 4) +#define read_c0_watchhi5()	__read_32bit_c0_register($19, 5) +#define read_c0_watchhi6()	__read_32bit_c0_register($19, 6) +#define read_c0_watchhi7()	__read_32bit_c0_register($19, 7) + +#define write_c0_watchhi0(val)	__write_32bit_c0_register($19, 0, val) +#define write_c0_watchhi1(val)	__write_32bit_c0_register($19, 1, val) +#define write_c0_watchhi2(val)	__write_32bit_c0_register($19, 2, val) +#define write_c0_watchhi3(val)	__write_32bit_c0_register($19, 3, val) +#define write_c0_watchhi4(val)	__write_32bit_c0_register($19, 4, val) +#define write_c0_watchhi5(val)	__write_32bit_c0_register($19, 5, val) +#define write_c0_watchhi6(val)	__write_32bit_c0_register($19, 6, val) +#define write_c0_watchhi7(val)	__write_32bit_c0_register($19, 7, val) + +#define read_c0_xcontext()	__read_ulong_c0_register($20, 0) +#define write_c0_xcontext(val)	__write_ulong_c0_register($20, 0, val) + +#define read_c0_intcontrol()	__read_32bit_c0_ctrl_register($20) +#define write_c0_intcontrol(val) __write_32bit_c0_ctrl_register($20, val) + +#define read_c0_framemask()	__read_32bit_c0_register($21, 0) +#define write_c0_framemask(val)	__write_32bit_c0_register($21, 0, val) + +/* RM9000 PerfControl performance counter control register */ +#define read_c0_perfcontrol()	__read_32bit_c0_register($22, 0) +#define write_c0_perfcontrol(val) __write_32bit_c0_register($22, 0, val) + +#define read_c0_diag()		__read_32bit_c0_register($22, 0) +#define write_c0_diag(val)	__write_32bit_c0_register($22, 0, val) + +#define read_c0_diag1()		__read_32bit_c0_register($22, 1) +#define write_c0_diag1(val)	__write_32bit_c0_register($22, 1, val) + +#define read_c0_diag2()		__read_32bit_c0_register($22, 2) +#define write_c0_diag2(val)	__write_32bit_c0_register($22, 2, val) + +#define read_c0_diag3()		__read_32bit_c0_register($22, 3) +#define write_c0_diag3(val)	__write_32bit_c0_register($22, 3, val) + +#define read_c0_diag4()		__read_32bit_c0_register($22, 4) +#define write_c0_diag4(val)	__write_32bit_c0_register($22, 4, val) + +#define read_c0_diag5()		__read_32bit_c0_register($22, 5) +#define write_c0_diag5(val)	__write_32bit_c0_register($22, 5, val) + +#define read_c0_debug()		__read_32bit_c0_register($23, 0) +#define write_c0_debug(val)	__write_32bit_c0_register($23, 0, val) + +#define read_c0_depc()		__read_ulong_c0_register($24, 0) +#define write_c0_depc(val)	__write_ulong_c0_register($24, 0, val) + +/* + * MIPS32 / MIPS64 performance counters + */ +#define read_c0_perfctrl0()	__read_32bit_c0_register($25, 0) +#define write_c0_perfctrl0(val)	__write_32bit_c0_register($25, 0, val) +#define read_c0_perfcntr0()	__read_32bit_c0_register($25, 1) +#define write_c0_perfcntr0(val)	__write_32bit_c0_register($25, 1, val) +#define read_c0_perfctrl1()	__read_32bit_c0_register($25, 2) +#define write_c0_perfctrl1(val)	__write_32bit_c0_register($25, 2, val) +#define read_c0_perfcntr1()	__read_32bit_c0_register($25, 3) +#define write_c0_perfcntr1(val)	__write_32bit_c0_register($25, 3, val) +#define read_c0_perfctrl2()	__read_32bit_c0_register($25, 4) +#define write_c0_perfctrl2(val)	__write_32bit_c0_register($25, 4, val) +#define read_c0_perfcntr2()	__read_32bit_c0_register($25, 5) +#define write_c0_perfcntr2(val)	__write_32bit_c0_register($25, 5, val) +#define read_c0_perfctrl3()	__read_32bit_c0_register($25, 6) +#define write_c0_perfctrl3(val)	__write_32bit_c0_register($25, 6, val) +#define read_c0_perfcntr3()	__read_32bit_c0_register($25, 7) +#define write_c0_perfcntr3(val)	__write_32bit_c0_register($25, 7, val) + +/* RM9000 PerfCount performance counter register */ +#define read_c0_perfcount()	__read_64bit_c0_register($25, 0) +#define write_c0_perfcount(val)	__write_64bit_c0_register($25, 0, val) + +#define read_c0_ecc()		__read_32bit_c0_register($26, 0) +#define write_c0_ecc(val)	__write_32bit_c0_register($26, 0, val) + +#define read_c0_derraddr0()	__read_ulong_c0_register($26, 1) +#define write_c0_derraddr0(val)	__write_ulong_c0_register($26, 1, val) + +#define read_c0_cacheerr()	__read_32bit_c0_register($27, 0) + +#define read_c0_derraddr1()	__read_ulong_c0_register($27, 1) +#define write_c0_derraddr1(val)	__write_ulong_c0_register($27, 1, val) + +#define read_c0_taglo()		__read_32bit_c0_register($28, 0) +#define write_c0_taglo(val)	__write_32bit_c0_register($28, 0, val) + +#define read_c0_dtaglo()	__read_32bit_c0_register($28, 2) +#define write_c0_dtaglo(val)	__write_32bit_c0_register($28, 2, val) + +#define read_c0_taghi()		__read_32bit_c0_register($29, 0) +#define write_c0_taghi(val)	__write_32bit_c0_register($29, 0, val) + +#define read_c0_errorepc()	__read_ulong_c0_register($30, 0) +#define write_c0_errorepc(val)	__write_ulong_c0_register($30, 0, val) + +/* MIPSR2 */ +#define read_c0_hwrena()	__read_32bit_c0_register($7, 0) +#define write_c0_hwrena(val)	__write_32bit_c0_register($7, 0, val) + +#define read_c0_intctl()	__read_32bit_c0_register($12, 1) +#define write_c0_intctl(val)	__write_32bit_c0_register($12, 1, val) + +#define read_c0_srsctl()	__read_32bit_c0_register($12, 2) +#define write_c0_srsctl(val)	__write_32bit_c0_register($12, 2, val) + +#define read_c0_srsmap()	__read_32bit_c0_register($12, 3) +#define write_c0_srsmap(val)	__write_32bit_c0_register($12, 3, val) + +#define read_c0_ebase()		__read_32bit_c0_register($15, 1) +#define write_c0_ebase(val)	__write_32bit_c0_register($15, 1, val)  /* - * Events counted by counter #0 + * Macros to access the floating point coprocessor control registers   */ -#define CE0_CYCLES			0 -#define CE0_INSN_ISSUED			1 -#define CE0_LPSC_ISSUED			2 -#define CE0_S_ISSUED			3 -#define CE0_SC_ISSUED			4 -#define CE0_SC_FAILED			5 -#define CE0_BRANCH_DECODED		6 -#define CE0_QW_WB_SECONDARY		7 -#define CE0_CORRECTED_ECC_ERRORS	8 -#define CE0_ICACHE_MISSES		9 -#define CE0_SCACHE_I_MISSES		10 -#define CE0_SCACHE_I_WAY_MISSPREDICTED	11 -#define CE0_EXT_INTERVENTIONS_REQ	12 -#define CE0_EXT_INVALIDATE_REQ		13 -#define CE0_VIRTUAL_COHERENCY_COND	14 -#define CE0_INSN_GRADUATED		15 +#define read_32bit_cp1_register(source)				\ +({ int __res;							\ +	__asm__ __volatile__(					\ +	".set\tpush\n\t"					\ +	".set\treorder\n\t"					\ +	"cfc1\t%0,"STR(source)"\n\t"				\ +	".set\tpop"						\ +	: "=r" (__res));					\ +	__res;}) + +#define rddsp(mask)							\ +({									\ +	unsigned int __res;						\ +									\ +	__asm__ __volatile__(						\ +	"	.set	push				\n"		\ +	"	.set	noat				\n"		\ +	"	# rddsp $1, %x1				\n"		\ +	"	.word	0x7c000cb8 | (%x1 << 16)	\n"		\ +	"	move	%0, $1				\n"		\ +	"	.set	pop				\n"		\ +	: "=r" (__res)							\ +	: "i" (mask));							\ +	__res;								\ +}) + +#define wrdsp(val, mask)						\ +do {									\ +	__asm__ __volatile__(						\ +	"	.set	push					\n"	\ +	"	.set	noat					\n"	\ +	"	move	$1, %0					\n"	\ +	"	# wrdsp $1, %x1					\n"	\ +	"	.word	0x7c2004f8 | (%x1 << 11)		\n"	\ +	"	.set	pop					\n"	\ +	:								\ +	: "r" (val), "i" (mask));					\ +} while (0) + +#define mfhi0()								\ +({									\ +	unsigned long __treg;						\ +									\ +	__asm__ __volatile__(						\ +	"	.set	push			\n"			\ +	"	.set	noat			\n"			\ +	"	# mfhi	%0, $ac0		\n"			\ +	"	.word	0x00000810		\n"			\ +	"	move	%0, $1			\n"			\ +	"	.set	pop			\n"			\ +	: "=r" (__treg));						\ +	__treg;								\ +}) + +#define mfhi1()								\ +({									\ +	unsigned long __treg;						\ +									\ +	__asm__ __volatile__(						\ +	"	.set	push			\n"			\ +	"	.set	noat			\n"			\ +	"	# mfhi	%0, $ac1		\n"			\ +	"	.word	0x00200810		\n"			\ +	"	move	%0, $1			\n"			\ +	"	.set	pop			\n"			\ +	: "=r" (__treg));						\ +	__treg;								\ +}) + +#define mfhi2()								\ +({									\ +	unsigned long __treg;						\ +									\ +	__asm__ __volatile__(						\ +	"	.set	push			\n"			\ +	"	.set	noat			\n"			\ +	"	# mfhi	%0, $ac2		\n"			\ +	"	.word	0x00400810		\n"			\ +	"	move	%0, $1			\n"			\ +	"	.set	pop			\n"			\ +	: "=r" (__treg));						\ +	__treg;								\ +}) + +#define mfhi3()								\ +({									\ +	unsigned long __treg;						\ +									\ +	__asm__ __volatile__(						\ +	"	.set	push			\n"			\ +	"	.set	noat			\n"			\ +	"	# mfhi	%0, $ac3		\n"			\ +	"	.word	0x00600810		\n"			\ +	"	move	%0, $1			\n"			\ +	"	.set	pop			\n"			\ +	: "=r" (__treg));						\ +	__treg;								\ +}) + +#define mflo0()								\ +({									\ +	unsigned long __treg;						\ +									\ +	__asm__ __volatile__(						\ +	"	.set	push			\n"			\ +	"	.set	noat			\n"			\ +	"	# mflo	%0, $ac0		\n"			\ +	"	.word	0x00000812		\n"			\ +	"	move	%0, $1			\n"			\ +	"	.set	pop			\n"			\ +	: "=r" (__treg));						\ +	__treg;								\ +}) + +#define mflo1()								\ +({									\ +	unsigned long __treg;						\ +									\ +	__asm__ __volatile__(						\ +	"	.set	push			\n"			\ +	"	.set	noat			\n"			\ +	"	# mflo	%0, $ac1		\n"			\ +	"	.word	0x00200812		\n"			\ +	"	move	%0, $1			\n"			\ +	"	.set	pop			\n"			\ +	: "=r" (__treg));						\ +	__treg;								\ +}) + +#define mflo2()								\ +({									\ +	unsigned long __treg;						\ +									\ +	__asm__ __volatile__(						\ +	"	.set	push			\n"			\ +	"	.set	noat			\n"			\ +	"	# mflo	%0, $ac2		\n"			\ +	"	.word	0x00400812		\n"			\ +	"	move	%0, $1			\n"			\ +	"	.set	pop			\n"			\ +	: "=r" (__treg));						\ +	__treg;								\ +}) + +#define mflo3()								\ +({									\ +	unsigned long __treg;						\ +									\ +	__asm__ __volatile__(						\ +	"	.set	push			\n"			\ +	"	.set	noat			\n"			\ +	"	# mflo	%0, $ac3		\n"			\ +	"	.word	0x00600812		\n"			\ +	"	move	%0, $1			\n"			\ +	"	.set	pop			\n"			\ +	: "=r" (__treg));						\ +	__treg;								\ +}) + +#define mthi0(x)							\ +do {									\ +	__asm__ __volatile__(						\ +	"	.set	push					\n"	\ +	"	.set	noat					\n"	\ +	"	move	$1, %0					\n"	\ +	"	# mthi	$1, $ac0				\n"	\ +	"	.word	0x00200011				\n"	\ +	"	.set	pop					\n"	\ +	:								\ +	: "r" (x));							\ +} while (0) + +#define mthi1(x)							\ +do {									\ +	__asm__ __volatile__(						\ +	"	.set	push					\n"	\ +	"	.set	noat					\n"	\ +	"	move	$1, %0					\n"	\ +	"	# mthi	$1, $ac1				\n"	\ +	"	.word	0x00200811				\n"	\ +	"	.set	pop					\n"	\ +	:								\ +	: "r" (x));							\ +} while (0) + +#define mthi2(x)							\ +do {									\ +	__asm__ __volatile__(						\ +	"	.set	push					\n"	\ +	"	.set	noat					\n"	\ +	"	move	$1, %0					\n"	\ +	"	# mthi	$1, $ac2				\n"	\ +	"	.word	0x00201011				\n"	\ +	"	.set	pop					\n"	\ +	:								\ +	: "r" (x));							\ +} while (0) + +#define mthi3(x)							\ +do {									\ +	__asm__ __volatile__(						\ +	"	.set	push					\n"	\ +	"	.set	noat					\n"	\ +	"	move	$1, %0					\n"	\ +	"	# mthi	$1, $ac3				\n"	\ +	"	.word	0x00201811				\n"	\ +	"	.set	pop					\n"	\ +	:								\ +	: "r" (x));							\ +} while (0) + +#define mtlo0(x)							\ +do {									\ +	__asm__ __volatile__(						\ +	"	.set	push					\n"	\ +	"	.set	noat					\n"	\ +	"	move	$1, %0					\n"	\ +	"	# mtlo	$1, $ac0				\n"	\ +	"	.word	0x00200013				\n"	\ +	"	.set	pop					\n"	\ +	:								\ +	: "r" (x));							\ +} while (0) + +#define mtlo1(x)							\ +do {									\ +	__asm__ __volatile__(						\ +	"	.set	push					\n"	\ +	"	.set	noat					\n"	\ +	"	move	$1, %0					\n"	\ +	"	# mtlo	$1, $ac1				\n"	\ +	"	.word	0x00200813				\n"	\ +	"	.set	pop					\n"	\ +	:								\ +	: "r" (x));							\ +} while (0) + +#define mtlo2(x)							\ +do {									\ +	__asm__ __volatile__(						\ +	"	.set	push					\n"	\ +	"	.set	noat					\n"	\ +	"	move	$1, %0					\n"	\ +	"	# mtlo	$1, $ac2				\n"	\ +	"	.word	0x00201013				\n"	\ +	"	.set	pop					\n"	\ +	:								\ +	: "r" (x));							\ +} while (0) + +#define mtlo3(x)							\ +do {									\ +	__asm__ __volatile__(						\ +	"	.set	push					\n"	\ +	"	.set	noat					\n"	\ +	"	move	$1, %0					\n"	\ +	"	# mtlo	$1, $ac3				\n"	\ +	"	.word	0x00201813				\n"	\ +	"	.set	pop					\n"	\ +	:								\ +	: "r" (x));							\ +} while (0)  /* - * Events counted by counter #1 + * TLB operations. + * + * It is responsibility of the caller to take care of any TLB hazards.   */ -#define CE1_CYCLES			0 -#define CE1_INSN_GRADUATED		1 -#define CE1_LPSC_GRADUATED		2 -#define CE1_S_GRADUATED			3 -#define CE1_SC_GRADUATED		4 -#define CE1_FP_INSN_GRADUATED		5 -#define CE1_QW_WB_PRIMARY		6 -#define CE1_TLB_REFILL			7 -#define CE1_BRANCH_MISSPREDICTED	8 -#define CE1_DCACHE_MISS			9 -#define CE1_SCACHE_D_MISSES		10 -#define CE1_SCACHE_D_WAY_MISSPREDICTED	11 -#define CE1_EXT_INTERVENTION_HITS	12 -#define CE1_EXT_INVALIDATE_REQ		13 -#define CE1_SP_HINT_TO_CEXCL_SC_BLOCKS	14 -#define CE1_SP_HINT_TO_SHARED_SC_BLOCKS	15 +static inline void tlb_probe(void) +{ +	__asm__ __volatile__( +		".set noreorder\n\t" +		"tlbp\n\t" +		".set reorder"); +} + +static inline void tlb_read(void) +{ +#if MIPS34K_MISSED_ITLB_WAR +	int res = 0; + +	__asm__ __volatile__( +	"	.set	push					\n" +	"	.set	noreorder				\n" +	"	.set	noat					\n" +	"	.set	mips32r2				\n" +	"	.word	0x41610001		# dvpe $1	\n" +	"	move	%0, $1					\n" +	"	ehb						\n" +	"	.set	pop					\n" +	: "=r" (res)); + +	instruction_hazard(); +#endif + +	__asm__ __volatile__( +		".set noreorder\n\t" +		"tlbr\n\t" +		".set reorder"); + +#if MIPS34K_MISSED_ITLB_WAR +	if ((res & _ULCAST_(1))) +		__asm__ __volatile__( +		"	.set	push				\n" +		"	.set	noreorder			\n" +		"	.set	noat				\n" +		"	.set	mips32r2			\n" +		"	.word	0x41600021	# evpe		\n" +		"	ehb					\n" +		"	.set	pop				\n"); +#endif +} + +static inline void tlb_write_indexed(void) +{ +	__asm__ __volatile__( +		".set noreorder\n\t" +		"tlbwi\n\t" +		".set reorder"); +} + +static inline void tlb_write_random(void) +{ +	__asm__ __volatile__( +		".set noreorder\n\t" +		"tlbwr\n\t" +		".set reorder"); +}  /* - * These flags define in which priviledge mode the counters count events + * Manipulate bits in a c0 register.   */ -#define CEB_USER	8	/* Count events in user mode, EXL = ERL = 0 */ -#define CEB_SUPERVISOR	4	/* Count events in supvervisor mode EXL = ERL = 0 */ -#define CEB_KERNEL	2	/* Count events in kernel mode EXL = ERL = 0 */ -#define CEB_EXL		1	/* Count events with EXL = 1, ERL = 0 */ +#define __BUILD_SET_C0(name)					\ +static inline unsigned int					\ +set_c0_##name(unsigned int set)					\ +{								\ +	unsigned int res;					\ +								\ +	res = read_c0_##name();					\ +	res |= set;						\ +	write_c0_##name(res);					\ +								\ +	return res;						\ +}								\ +								\ +static inline unsigned int					\ +clear_c0_##name(unsigned int clear)				\ +{								\ +	unsigned int res;					\ +								\ +	res = read_c0_##name();					\ +	res &= ~clear;						\ +	write_c0_##name(res);					\ +								\ +	return res;						\ +}								\ +								\ +static inline unsigned int					\ +change_c0_##name(unsigned int change, unsigned int new)		\ +{								\ +	unsigned int res;					\ +								\ +	res = read_c0_##name();					\ +	res &= ~change;						\ +	res |= (new & change);					\ +	write_c0_##name(res);					\ +								\ +	return res;						\ +} + +__BUILD_SET_C0(status) +__BUILD_SET_C0(cause) +__BUILD_SET_C0(config) +__BUILD_SET_C0(intcontrol) +__BUILD_SET_C0(intctl) +__BUILD_SET_C0(srsmap) + +#endif /* !__ASSEMBLY__ */  #endif /* _ASM_MIPSREGS_H */ diff --git a/include/asm-ppc/bitops.h b/include/asm-ppc/bitops.h index 3264915d8..4e9c60834 100644 --- a/include/asm-ppc/bitops.h +++ b/include/asm-ppc/bitops.h @@ -287,7 +287,7 @@ extern __inline__ int ext2_test_bit(int nr, __const__ void * addr)  #define ext2_find_first_zero_bit(addr, size) \  	ext2_find_next_zero_bit((addr), (size), 0) -extern __inline__ unsigned long ext2_find_next_zero_bit(void *addr, +static __inline__ unsigned long ext2_find_next_zero_bit(void *addr,  	unsigned long size, unsigned long offset)  {  	unsigned int *p = ((unsigned int *) addr) + (offset >> 5); diff --git a/include/asm-ppc/mmu.h b/include/asm-ppc/mmu.h index 4f78ca7a9..050a7b647 100644 --- a/include/asm-ppc/mmu.h +++ b/include/asm-ppc/mmu.h @@ -140,11 +140,16 @@ extern void _tlbia(void);		/* invalidate all TLB entries */  typedef enum {  	IBAT0 = 0, IBAT1, IBAT2, IBAT3, -	DBAT0, DBAT1, DBAT2, DBAT3 +	DBAT0, DBAT1, DBAT2, DBAT3, +#ifdef CONFIG_HIGH_BATS +	IBAT4, IBAT5, IBAT6, IBAT7, +	DBAT4, DBAT5, DBAT6, DBAT7 +#endif  } ppc_bat_t;  extern int read_bat(ppc_bat_t bat, unsigned long *upper, unsigned long *lower);  extern int write_bat(ppc_bat_t bat, unsigned long upper, unsigned long lower); +extern void print_bats(void);  #endif /* __ASSEMBLY__ */ diff --git a/include/atmel_lcdc.h b/include/atmel_lcdc.h new file mode 100644 index 000000000..73dd8f769 --- /dev/null +++ b/include/atmel_lcdc.h @@ -0,0 +1,177 @@ +/* + *  Header file for AT91/AT32 LCD Controller + * + *  Data structure and register user interface + * + *  Copyright (C) 2007 Atmel Corporation + * + * 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 __ATMEL_LCDC_H__ +#define __ATMEL_LCDC_H__ + +#define ATMEL_LCDC_DMABADDR1	0x00 +#define ATMEL_LCDC_DMABADDR2	0x04 +#define ATMEL_LCDC_DMAFRMPT1	0x08 +#define ATMEL_LCDC_DMAFRMPT2	0x0c +#define ATMEL_LCDC_DMAFRMADD1	0x10 +#define ATMEL_LCDC_DMAFRMADD2	0x14 + +#define ATMEL_LCDC_DMAFRMCFG	0x18 +#define	ATMEL_LCDC_FRSIZE	(0x7fffff <<  0) +#define	ATMEL_LCDC_BLENGTH_OFFSET	24 +#define	ATMEL_LCDC_BLENGTH	(0x7f     << ATMEL_LCDC_BLENGTH_OFFSET) + +#define ATMEL_LCDC_DMACON	0x1c +#define	ATMEL_LCDC_DMAEN	(0x1 << 0) +#define	ATMEL_LCDC_DMARST	(0x1 << 1) +#define	ATMEL_LCDC_DMABUSY	(0x1 << 2) +#define		ATMEL_LCDC_DMAUPDT	(0x1 << 3) +#define		ATMEL_LCDC_DMA2DEN	(0x1 << 4) + +#define ATMEL_LCDC_DMA2DCFG	0x20 +#define		ATMEL_LCDC_ADDRINC_OFFSET	0 +#define		ATMEL_LCDC_ADDRINC		(0xffff) +#define		ATMEL_LCDC_PIXELOFF_OFFSET	24 +#define		ATMEL_LCDC_PIXELOFF		(0x1f << 24) + +#define ATMEL_LCDC_LCDCON1	0x0800 +#define	ATMEL_LCDC_BYPASS	(1     <<  0) +#define	ATMEL_LCDC_CLKVAL_OFFSET	12 +#define	ATMEL_LCDC_CLKVAL	(0x1ff << ATMEL_LCDC_CLKVAL_OFFSET) +#define	ATMEL_LCDC_LINCNT	(0x7ff << 21) + +#define ATMEL_LCDC_LCDCON2	0x0804 +#define	ATMEL_LCDC_DISTYPE	(3 << 0) +#define		ATMEL_LCDC_DISTYPE_STNMONO	(0 << 0) +#define		ATMEL_LCDC_DISTYPE_STNCOLOR	(1 << 0) +#define		ATMEL_LCDC_DISTYPE_TFT		(2 << 0) +#define	ATMEL_LCDC_SCANMOD	(1 << 2) +#define		ATMEL_LCDC_SCANMOD_SINGLE	(0 << 2) +#define		ATMEL_LCDC_SCANMOD_DUAL		(1 << 2) +#define	ATMEL_LCDC_IFWIDTH	(3 << 3) +#define		ATMEL_LCDC_IFWIDTH_4		(0 << 3) +#define		ATMEL_LCDC_IFWIDTH_8		(1 << 3) +#define		ATMEL_LCDC_IFWIDTH_16		(2 << 3) +#define	ATMEL_LCDC_PIXELSIZE	(7 << 5) +#define		ATMEL_LCDC_PIXELSIZE_1		(0 << 5) +#define		ATMEL_LCDC_PIXELSIZE_2		(1 << 5) +#define		ATMEL_LCDC_PIXELSIZE_4		(2 << 5) +#define		ATMEL_LCDC_PIXELSIZE_8		(3 << 5) +#define		ATMEL_LCDC_PIXELSIZE_16		(4 << 5) +#define		ATMEL_LCDC_PIXELSIZE_24		(5 << 5) +#define		ATMEL_LCDC_PIXELSIZE_32		(6 << 5) +#define	ATMEL_LCDC_INVVD	(1 << 8) +#define		ATMEL_LCDC_INVVD_NORMAL		(0 << 8) +#define		ATMEL_LCDC_INVVD_INVERTED	(1 << 8) +#define	ATMEL_LCDC_INVFRAME	(1 << 9 ) +#define		ATMEL_LCDC_INVFRAME_NORMAL	(0 << 9) +#define		ATMEL_LCDC_INVFRAME_INVERTED	(1 << 9) +#define	ATMEL_LCDC_INVLINE	(1 << 10) +#define		ATMEL_LCDC_INVLINE_NORMAL	(0 << 10) +#define		ATMEL_LCDC_INVLINE_INVERTED	(1 << 10) +#define	ATMEL_LCDC_INVCLK	(1 << 11) +#define		ATMEL_LCDC_INVCLK_NORMAL	(0 << 11) +#define		ATMEL_LCDC_INVCLK_INVERTED	(1 << 11) +#define	ATMEL_LCDC_INVDVAL	(1 << 12) +#define		ATMEL_LCDC_INVDVAL_NORMAL	(0 << 12) +#define		ATMEL_LCDC_INVDVAL_INVERTED	(1 << 12) +#define	ATMEL_LCDC_CLKMOD	(1 << 15) +#define		ATMEL_LCDC_CLKMOD_ACTIVEDISPLAY	(0 << 15) +#define		ATMEL_LCDC_CLKMOD_ALWAYSACTIVE	(1 << 15) +#define	ATMEL_LCDC_MEMOR	(1 << 31) +#define		ATMEL_LCDC_MEMOR_BIG		(0 << 31) +#define		ATMEL_LCDC_MEMOR_LITTLE		(1 << 31) + +#define ATMEL_LCDC_TIM1		0x0808 +#define	ATMEL_LCDC_VFP		(0xffU <<  0) +#define	ATMEL_LCDC_VBP_OFFSET		8 +#define	ATMEL_LCDC_VBP		(0xffU <<  ATMEL_LCDC_VBP_OFFSET) +#define	ATMEL_LCDC_VPW_OFFSET		16 +#define	ATMEL_LCDC_VPW		(0x3fU << ATMEL_LCDC_VPW_OFFSET) +#define	ATMEL_LCDC_VHDLY_OFFSET		24 +#define	ATMEL_LCDC_VHDLY	(0xfU  << ATMEL_LCDC_VHDLY_OFFSET) + +#define ATMEL_LCDC_TIM2		0x080c +#define	ATMEL_LCDC_HBP		(0xffU  <<  0) +#define	ATMEL_LCDC_HPW_OFFSET		8 +#define	ATMEL_LCDC_HPW		(0x3fU  <<  ATMEL_LCDC_HPW_OFFSET) +#define	ATMEL_LCDC_HFP_OFFSET		21 +#define	ATMEL_LCDC_HFP		(0x7ffU << ATMEL_LCDC_HFP_OFFSET) + +#define ATMEL_LCDC_LCDFRMCFG	0x0810 +#define	ATMEL_LCDC_LINEVAL	(0x7ff <<  0) +#define	ATMEL_LCDC_HOZVAL_OFFSET	21 +#define	ATMEL_LCDC_HOZVAL	(0x7ff << ATMEL_LCDC_HOZVAL_OFFSET) + +#define ATMEL_LCDC_FIFO		0x0814 +#define	ATMEL_LCDC_FIFOTH	(0xffff) + +#define ATMEL_LCDC_MVAL		0x0818 + +#define ATMEL_LCDC_DP1_2	0x081c +#define ATMEL_LCDC_DP4_7	0x0820 +#define ATMEL_LCDC_DP3_5	0x0824 +#define ATMEL_LCDC_DP2_3	0x0828 +#define ATMEL_LCDC_DP5_7	0x082c +#define ATMEL_LCDC_DP3_4	0x0830 +#define ATMEL_LCDC_DP4_5	0x0834 +#define ATMEL_LCDC_DP6_7	0x0838 +#define	ATMEL_LCDC_DP1_2_VAL	(0xff) +#define	ATMEL_LCDC_DP4_7_VAL	(0xfffffff) +#define	ATMEL_LCDC_DP3_5_VAL	(0xfffff) +#define	ATMEL_LCDC_DP2_3_VAL	(0xfff) +#define	ATMEL_LCDC_DP5_7_VAL	(0xfffffff) +#define	ATMEL_LCDC_DP3_4_VAL	(0xffff) +#define	ATMEL_LCDC_DP4_5_VAL	(0xfffff) +#define	ATMEL_LCDC_DP6_7_VAL	(0xfffffff) + +#define ATMEL_LCDC_PWRCON	0x083c +#define	ATMEL_LCDC_PWR		(1    <<  0) +#define	ATMEL_LCDC_GUARDT_OFFSET	1 +#define	ATMEL_LCDC_GUARDT	(0x7f <<  ATMEL_LCDC_GUARDT_OFFSET) +#define	ATMEL_LCDC_BUSY		(1    << 31) + +#define ATMEL_LCDC_CONTRAST_CTR	0x0840 +#define	ATMEL_LCDC_PS		(3 << 0) +#define		ATMEL_LCDC_PS_DIV1		(0 << 0) +#define		ATMEL_LCDC_PS_DIV2		(1 << 0) +#define		ATMEL_LCDC_PS_DIV4		(2 << 0) +#define		ATMEL_LCDC_PS_DIV8		(3 << 0) +#define	ATMEL_LCDC_POL		(1 << 2) +#define		ATMEL_LCDC_POL_NEGATIVE		(0 << 2) +#define		ATMEL_LCDC_POL_POSITIVE		(1 << 2) +#define	ATMEL_LCDC_ENA		(1 << 3) +#define		ATMEL_LCDC_ENA_PWMDISABLE	(0 << 3) +#define		ATMEL_LCDC_ENA_PWMENABLE	(1 << 3) + +#define ATMEL_LCDC_CONTRAST_VAL	0x0844 +#define	ATMEL_LCDC_CVAL	(0xff) + +#define ATMEL_LCDC_IER		0x0848 +#define ATMEL_LCDC_IDR		0x084c +#define ATMEL_LCDC_IMR		0x0850 +#define ATMEL_LCDC_ISR		0x0854 +#define ATMEL_LCDC_ICR		0x0858 +#define	ATMEL_LCDC_LNI		(1 << 0) +#define	ATMEL_LCDC_LSTLNI	(1 << 1) +#define	ATMEL_LCDC_EOFI		(1 << 2) +#define	ATMEL_LCDC_UFLWI	(1 << 4) +#define	ATMEL_LCDC_OWRI		(1 << 5) +#define	ATMEL_LCDC_MERI		(1 << 6) + +#define ATMEL_LCDC_LUT(n)	(0x0c00 + ((n)*4)) + +#endif /* __ATMEL_LCDC_H__ */ diff --git a/include/common.h b/include/common.h index d0f57040e..26e1b469a 100644 --- a/include/common.h +++ b/include/common.h @@ -176,6 +176,17 @@ typedef void (interrupt_handler_t)(void *);  		(__x > __y) ? __x : __y; }) +/** + * container_of - cast a member of a structure out to the containing structure + * @ptr:	the pointer to the member. + * @type:	the type of the container struct this is embedded in. + * @member:	the name of the member within the struct. + * + */ +#define container_of(ptr, type, member) ({			\ +	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\ +	(type *)( (char *)__mptr - offsetof(type,member) );}) +  /*   * Function Prototypes   */ diff --git a/include/configs/Alaska8220.h b/include/configs/Alaska8220.h index 3f2f6140f..38b962f82 100644 --- a/include/configs/Alaska8220.h +++ b/include/configs/Alaska8220.h @@ -31,6 +31,8 @@  #define CONFIG_MPC8220		1  #define CONFIG_ALASKA8220	1	/* ... on Alaska board	*/ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* Input clock running at 30Mhz, read Hid1 for the CPU multiplier to     determine the CPU speed. */  #define CFG_MPC8220_CLKIN	30000000/* ... running at 30MHz */ diff --git a/include/configs/BC3450.h b/include/configs/BC3450.h index 706c13efa..b7574bf14 100644 --- a/include/configs/BC3450.h +++ b/include/configs/BC3450.h @@ -61,6 +61,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH */  #define BOOTFLAG_WARM		0x02	/* Software reboot		    */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported		    */ +  /*   * Serial console configuration   */ diff --git a/include/configs/CPCI750.h b/include/configs/CPCI750.h index 48e29a208..89edbde1d 100644 --- a/include/configs/CPCI750.h +++ b/include/configs/CPCI750.h @@ -61,6 +61,8 @@  #undef	CONFIG_ECC			/* enable ECC support */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* which initialization functions to call for this board */  #define CONFIG_MISC_INIT_R  #define CONFIG_BOARD_PRE_INIT diff --git a/include/configs/IceCube.h b/include/configs/IceCube.h index f85cff7ab..3a347eac5 100644 --- a/include/configs/IceCube.h +++ b/include/configs/IceCube.h @@ -37,6 +37,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/MPC8313ERDB.h b/include/configs/MPC8313ERDB.h index 610151f58..d547681c3 100644 --- a/include/configs/MPC8313ERDB.h +++ b/include/configs/MPC8313ERDB.h @@ -469,6 +469,8 @@  #define CFG_HID2 HID2_HBE +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* DDR @ 0x00000000 */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10)  #define CFG_IBAT0U	(CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) diff --git a/include/configs/MPC8315ERDB.h b/include/configs/MPC8315ERDB.h index e0a887c7e..7a5d0aa1d 100644 --- a/include/configs/MPC8315ERDB.h +++ b/include/configs/MPC8315ERDB.h @@ -453,6 +453,7 @@  /*   * MMU Setup   */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */  /* DDR: cache cacheable */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) diff --git a/include/configs/MPC8323ERDB.h b/include/configs/MPC8323ERDB.h index 32f57ac7d..977c041dc 100644 --- a/include/configs/MPC8323ERDB.h +++ b/include/configs/MPC8323ERDB.h @@ -468,6 +468,7 @@  /*   * MMU Setup   */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */  /* DDR: cache cacheable */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) diff --git a/include/configs/MPC832XEMDS.h b/include/configs/MPC832XEMDS.h index 1276a124c..9ca2a2be0 100644 --- a/include/configs/MPC832XEMDS.h +++ b/include/configs/MPC832XEMDS.h @@ -483,6 +483,8 @@   * MMU Setup   */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* DDR: cache cacheable */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)  #define CFG_IBAT0U	(CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) diff --git a/include/configs/MPC8349EMDS.h b/include/configs/MPC8349EMDS.h index 119e7ac7c..bd7754000 100644 --- a/include/configs/MPC8349EMDS.h +++ b/include/configs/MPC8349EMDS.h @@ -626,6 +626,7 @@  #define CFG_HID2 HID2_HBE +#define CONFIG_HIGH_BATS	1	/* High BATs supported */  /* DDR @ 0x00000000 */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) diff --git a/include/configs/MPC8349ITX.h b/include/configs/MPC8349ITX.h index c72de03c0..38410a176 100644 --- a/include/configs/MPC8349ITX.h +++ b/include/configs/MPC8349ITX.h @@ -555,6 +555,7 @@ boards, we say we have two, but don't display a message if we find only one. */  #define CFG_HID0_FINAL	CFG_HID0_INIT  #define CFG_HID2	HID2_HBE +#define CONFIG_HIGH_BATS	1	/* High BATs supported */  /* DDR  */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) diff --git a/include/configs/MPC8360EMDS.h b/include/configs/MPC8360EMDS.h index 983575eb0..fcfbe6f82 100644 --- a/include/configs/MPC8360EMDS.h +++ b/include/configs/MPC8360EMDS.h @@ -515,6 +515,8 @@   * MMU Setup   */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* DDR: cache cacheable */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)  #define CFG_IBAT0U	(CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) diff --git a/include/configs/MPC8360ERDK.h b/include/configs/MPC8360ERDK.h index 7b7d6f50c..adedcb95a 100644 --- a/include/configs/MPC8360ERDK.h +++ b/include/configs/MPC8360ERDK.h @@ -419,6 +419,8 @@   * MMU Setup   */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* DDR: cache cacheable */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)  #define CFG_IBAT0U	(CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) diff --git a/include/configs/MPC837XEMDS.h b/include/configs/MPC837XEMDS.h index e92493ae4..4e159a0b4 100644 --- a/include/configs/MPC837XEMDS.h +++ b/include/configs/MPC837XEMDS.h @@ -502,6 +502,7 @@  /*   * MMU Setup   */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */  /* DDR: cache cacheable */  #define CFG_SDRAM_LOWER		CFG_SDRAM_BASE diff --git a/include/configs/MPC837XERDB.h b/include/configs/MPC837XERDB.h index f7e6fd2c5..29c2490e6 100644 --- a/include/configs/MPC837XERDB.h +++ b/include/configs/MPC837XERDB.h @@ -524,6 +524,8 @@   * MMU Setup   */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* DDR: cache cacheable */  #define CFG_SDRAM_LOWER		CFG_SDRAM_BASE  #define CFG_SDRAM_UPPER		(CFG_SDRAM_BASE + 0x10000000) diff --git a/include/configs/MPC8610HPCD.h b/include/configs/MPC8610HPCD.h index 15ff0eacf..a051b6d39 100644 --- a/include/configs/MPC8610HPCD.h +++ b/include/configs/MPC8610HPCD.h @@ -55,6 +55,7 @@  #define CONFIG_NUM_DDR_CONTROLLERS	1  #define CONFIG_INTERRUPTS		/* enable pci, srio, ddr interrupts */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported & enabled */  #define CONFIG_ALTIVEC		1  /* diff --git a/include/configs/MPC8641HPCN.h b/include/configs/MPC8641HPCN.h index 9acc3da54..49ee7ffd3 100644 --- a/include/configs/MPC8641HPCN.h +++ b/include/configs/MPC8641HPCN.h @@ -67,6 +67,7 @@  #define BANK_INTERLEAVING		0x22000000  #define SUPER_BANK_INTERLEAVING		0x23000000 +#define CONFIG_HIGH_BATS	1	/* High BATs supported and enabled */  #define CONFIG_ALTIVEC		1 diff --git a/include/configs/PM520.h b/include/configs/PM520.h index 6eb644492..259178f85 100644 --- a/include/configs/PM520.h +++ b/include/configs/PM520.h @@ -40,6 +40,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/TB5200.h b/include/configs/TB5200.h index 6cb3022b9..d21783b83 100644 --- a/include/configs/TB5200.h +++ b/include/configs/TB5200.h @@ -42,6 +42,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/TOP5200.h b/include/configs/TOP5200.h index 71fa36baa..4c447356a 100644 --- a/include/configs/TOP5200.h +++ b/include/configs/TOP5200.h @@ -50,6 +50,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/TQM5200.h b/include/configs/TQM5200.h index bff2edf76..bfb478a86 100644 --- a/include/configs/TQM5200.h +++ b/include/configs/TQM5200.h @@ -47,6 +47,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH	*/  #define BOOTFLAG_WARM		0x02	/* Software reboot			*/ +#define CONFIG_HIGH_BATS	1	/* High BATs supported			*/ +  /*   * Serial console configuration   */ diff --git a/include/configs/TQM834x.h b/include/configs/TQM834x.h index a86939e09..89fc46541 100644 --- a/include/configs/TQM834x.h +++ b/include/configs/TQM834x.h @@ -423,6 +423,8 @@ extern int tqm834x_num_flash_banks;  #define CFG_HID0_FINAL	CFG_HID0_INIT  #define CFG_HID2	HID2_HBE +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* DDR 0 - 512M */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)  #define CFG_IBAT0U	(CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) diff --git a/include/configs/Total5200.h b/include/configs/Total5200.h index 31f10dd87..598fe7bf2 100644 --- a/include/configs/Total5200.h +++ b/include/configs/Total5200.h @@ -48,6 +48,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/Yukon8220.h b/include/configs/Yukon8220.h index 00c4ff093..1b4195a08 100644 --- a/include/configs/Yukon8220.h +++ b/include/configs/Yukon8220.h @@ -31,6 +31,8 @@  #define CONFIG_MPC8220		1  #define CONFIG_YUKON8220	1	/* ... on Yukon board	*/ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* Input clock running at 30Mhz, read Hid1 for the CPU multiplier to     determine the CPU speed. */  #define CFG_MPC8220_CLKIN	30000000/* ... running at 30MHz */ diff --git a/include/configs/ads5121.h b/include/configs/ads5121.h index c975a249c..4226529eb 100644 --- a/include/configs/ads5121.h +++ b/include/configs/ads5121.h @@ -372,6 +372,8 @@  #define CFG_HID0_FINAL	HID0_ENABLE_MACHINE_CHECK  #define CFG_HID2	HID2_HBE +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Internal Definitions   * diff --git a/include/configs/aev.h b/include/configs/aev.h index e3f810c5c..c5e475921 100644 --- a/include/configs/aev.h +++ b/include/configs/aev.h @@ -41,6 +41,8 @@  #define CONFIG_AEVFIFO		1  #define CFG_MPC5XXX_CLKIN	33000000 /* ... running at 33.000000MHz */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ diff --git a/include/configs/at91cap9adk.h b/include/configs/at91cap9adk.h index c891fa80e..342ce2a64 100644 --- a/include/configs/at91cap9adk.h +++ b/include/configs/at91cap9adk.h @@ -28,6 +28,7 @@  #define __CONFIG_H  /* ARM asynchronous clock */ +#define AT91_CPU_NAME		"AT91CAP9"  #define AT91_MAIN_CLOCK		200000000	/* from 12 MHz crystal */  #define AT91_MASTER_CLOCK	100000000	/* peripheral = main / 2 */  #define CFG_HZ			1000000		/* 1us resolution */ @@ -55,11 +56,19 @@  #undef CONFIG_USART2  #define CONFIG_USART3		1	/* USART 3 is DBGU */ -#define CONFIG_BOOTDELAY	3 -#define CONFIG_BOOTARGS		"console=ttyS0,115200 " \ -				"root=/dev/mtdblock1 rw rootfstype=jffs2" +/* LCD */ +#define CONFIG_LCD			1 +#define LCD_BPP				LCD_COLOR8 +#define CONFIG_LCD_LOGO			1 +#undef LCD_TEST_PATTERN +#define CONFIG_LCD_INFO			1 +#define CONFIG_LCD_INFO_BELOW_LOGO	1 +#define CFG_WHITE_ON_BLACK		1 +#define CONFIG_ATMEL_LCD		1 +#define CONFIG_ATMEL_LCD_BGR555		1 +#define CFG_CONSOLE_IS_IN_ENV		1 -/* #define CONFIG_ENV_OVERWRITE	1 */ +#define CONFIG_BOOTDELAY	3  /*   * BOOTP options @@ -94,9 +103,9 @@  #define CFG_SPI_WRITE_TOUT		(5*CFG_HZ)  #define CFG_MAX_DATAFLASH_BANKS		1  #define CFG_DATAFLASH_LOGIC_ADDR_CS0	0xC0000000	/* CS0 */ -#define AT91_SPI_CLK			20000000 -#define DATAFLASH_TCSS			(0xFA << 16) -#define DATAFLASH_TCHS			(0x8 << 24) +#define AT91_SPI_CLK			15000000 +#define DATAFLASH_TCSS			(0x1a << 16) +#define DATAFLASH_TCHS			(0x1 << 24)  /* NOR flash */  #define CFG_FLASH_CFI			1 @@ -110,6 +119,7 @@  #define NAND_MAX_CHIPS			1  #define CFG_MAX_NAND_DEVICE		1  #define CFG_NAND_BASE			0x40000000 +#define CFG_NAND_DBW_8			1  /* Ethernet */  #define CONFIG_MACB			1 @@ -143,7 +153,12 @@  #define CFG_ENV_OFFSET		0x4200  #define CFG_ENV_ADDR		(CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET)  #define CFG_ENV_SIZE		0x4200 -#define CONFIG_BOOTCOMMAND	"cp.b 0xC003DE00 0x72000000 0x200040; bootm" +#define CONFIG_BOOTCOMMAND	"cp.b 0xC0042000 0x72000000 0x210000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 "			\ +				"root=/dev/mtdblock1 "			\ +				"mtdparts=physmap-flash.0:-(nor);"	\ +				"at91_nand:-(root) "			\ +				"rw rootfstype=jffs2"  #else @@ -154,6 +169,12 @@  #define CFG_ENV_ADDR		(PHYS_FLASH_1 + CFG_ENV_OFFSET)  #define CFG_ENV_SIZE		0x4000  #define CONFIG_BOOTCOMMAND	"cp.b 0x10040000 0x72000000 0x200000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 "			\ +				"root=/dev/mtdblock4 "			\ +				"mtdparts=physmap-flash.0:16k(bootstrap)ro,"\ +				"16k(env),224k(uboot)ro,-(linux);"	\ +				"at91_nand:-(root) "			\ +				"rw rootfstype=jffs2"  #endif diff --git a/include/configs/at91sam9260ek.h b/include/configs/at91sam9260ek.h index 41c418f9a..675224e0b 100644 --- a/include/configs/at91sam9260ek.h +++ b/include/configs/at91sam9260ek.h @@ -56,10 +56,6 @@  #define CONFIG_USART3		1	/* USART 3 is DBGU */  #define CONFIG_BOOTDELAY	3 -#define CONFIG_BOOTARGS		"console=ttyS0,115200 " \ -				"root=/dev/mtdblock0 rw rootfstype=jffs2" - -/* #define CONFIG_ENV_OVERWRITE	1 */  /*   * BOOTP options @@ -96,7 +92,7 @@  #define CFG_MAX_DATAFLASH_BANKS		2  #define CFG_DATAFLASH_LOGIC_ADDR_CS0	0xC0000000	/* CS0 */  #define CFG_DATAFLASH_LOGIC_ADDR_CS1	0xD0000000	/* CS1 */ -#define AT91_SPI_CLK			33000000 +#define AT91_SPI_CLK			15000000  #define DATAFLASH_TCSS			(0x1a << 16)  #define DATAFLASH_TCHS			(0x1 << 24) @@ -104,6 +100,7 @@  #define NAND_MAX_CHIPS			1  #define CFG_MAX_NAND_DEVICE		1  #define CFG_NAND_BASE			0x40000000 +#define CFG_NAND_DBW_8			1  /* NOR flash - no real flash on this board */  #define CFG_NO_FLASH			1 @@ -142,7 +139,11 @@  #define CFG_ENV_OFFSET		0x4200  #define CFG_ENV_ADDR		(CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET)  #define CFG_ENV_SIZE		0x4200 -#define CONFIG_BOOTCOMMAND	"cp.b 0xC003DE00 0x22000000 0x200040; bootm" +#define CONFIG_BOOTCOMMAND	"cp.b 0xC0042000 0x22000000 0x210000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 "			\ +				"root=/dev/mtdblock0 "			\ +				"mtdparts=at91_nand:-(root) "		\ +				"rw rootfstype=jffs2"  #elif CFG_USE_DATAFLASH_CS1 @@ -152,7 +153,11 @@  #define CFG_ENV_OFFSET		0x4200  #define CFG_ENV_ADDR		(CFG_DATAFLASH_LOGIC_ADDR_CS1 + CFG_ENV_OFFSET)  #define CFG_ENV_SIZE		0x4200 -#define CONFIG_BOOTCOMMAND	"cp.b 0xD003DE00 0x22000000 0x200040; bootm" +#define CONFIG_BOOTCOMMAND	"cp.b 0xD0042000 0x22000000 0x210000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 "			\ +				"root=/dev/mtdblock0 "			\ +				"mtdparts=at91_nand:-(root) "		\ +				"rw rootfstype=jffs2"  #else /* CFG_USE_NANDFLASH */ @@ -162,6 +167,12 @@  #define CFG_ENV_OFFSET_REDUND	0x80000  #define CFG_ENV_SIZE		0x20000		/* 1 sector = 128 kB */  #define CONFIG_BOOTCOMMAND	"nand read 0x22000000 0xA0000 0x200000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 "			\ +				"root=/dev/mtdblock5 "			\ +				"mtdparts=at91_nand:128k(bootstrap)ro,"	\ +				"256k(uboot)ro,128k(env1)ro,"		\ +				"128k(env2)ro,2M(linux),-(root) "	\ +				"rw rootfstype=jffs2"  #endif diff --git a/include/configs/at91sam9261ek.h b/include/configs/at91sam9261ek.h new file mode 100644 index 000000000..e53a23f33 --- /dev/null +++ b/include/configs/at91sam9261ek.h @@ -0,0 +1,202 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.com> + * + * Configuation settings for the AT91SAM9261EK board. + * + * 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 + +/* ARM asynchronous clock */ +#define AT91_CPU_NAME		"AT91SAM9261" +#define AT91_MAIN_CLOCK		198656000	/* from 18.432 MHz crystal */ +#define AT91_MASTER_CLOCK	99328000	/* peripheral = main / 2 */ +#define CFG_HZ			1000000		/* 1us resolution */ + +#define AT91_SLOW_CLOCK		32768	/* slow clock */ + +#define CONFIG_ARM926EJS	1	/* This is an ARM926EJS Core	*/ +#define CONFIG_AT91SAM9261	1	/* It's an Atmel AT91SAM9261 SoC*/ +#define CONFIG_AT91SAM9261EK	1	/* on an AT91SAM9261EK Board	*/ +#undef CONFIG_USE_IRQ			/* we don't need IRQ/FIQ stuff	*/ + +#define CONFIG_CMDLINE_TAG	1	/* enable passing of ATAGs	*/ +#define CONFIG_SETUP_MEMORY_TAGS 1 +#define CONFIG_INITRD_TAG	1 + +#define CONFIG_SKIP_LOWLEVEL_INIT +#define CONFIG_SKIP_RELOCATE_UBOOT + +/* + * Hardware drivers + */ +#define CONFIG_ATMEL_USART	1 +#undef CONFIG_USART0 +#undef CONFIG_USART1 +#undef CONFIG_USART2 +#define CONFIG_USART3		1	/* USART 3 is DBGU */ + +/* LCD */ +#define CONFIG_LCD			1 +#define LCD_BPP				LCD_COLOR8 +#define CONFIG_LCD_LOGO			1 +#undef LCD_TEST_PATTERN +#define CONFIG_LCD_INFO			1 +#define CONFIG_LCD_INFO_BELOW_LOGO	1 +#define CFG_WHITE_ON_BLACK		1 +#define CONFIG_ATMEL_LCD		1 +#define CONFIG_ATMEL_LCD_BGR555		1 +#define CFG_CONSOLE_IS_IN_ENV		1 + +#define CONFIG_BOOTDELAY	3 + +/* + * BOOTP options + */ +#define CONFIG_BOOTP_BOOTFILESIZE	1 +#define CONFIG_BOOTP_BOOTPATH		1 +#define CONFIG_BOOTP_GATEWAY		1 +#define CONFIG_BOOTP_HOSTNAME		1 + +/* + * Command line configuration. + */ +#include <config_cmd_default.h> +#undef CONFIG_CMD_BDI +#undef CONFIG_CMD_IMI +#undef CONFIG_CMD_AUTOSCRIPT +#undef CONFIG_CMD_FPGA +#undef CONFIG_CMD_LOADS +#undef CONFIG_CMD_IMLS + +#define CONFIG_CMD_PING		1 +#define CONFIG_CMD_DHCP		1 +#define CONFIG_CMD_NAND		1 +#define CONFIG_CMD_USB		1 + +/* SDRAM */ +#define CONFIG_NR_DRAM_BANKS		1 +#define PHYS_SDRAM			0x20000000 +#define PHYS_SDRAM_SIZE			0x04000000	/* 64 megs */ + +/* DataFlash */ +#define CONFIG_HAS_DATAFLASH		1 +#define CFG_SPI_WRITE_TOUT		(5*CFG_HZ) +#define CFG_MAX_DATAFLASH_BANKS		2 +#define CFG_DATAFLASH_LOGIC_ADDR_CS0	0xC0000000	/* CS0 */ +#define CFG_DATAFLASH_LOGIC_ADDR_CS3	0xD0000000	/* CS3 */ +#define AT91_SPI_CLK			15000000 +#define DATAFLASH_TCSS			(0x1a << 16) +#define DATAFLASH_TCHS			(0x1 << 24) + +/* NAND flash */ +#define NAND_MAX_CHIPS			1 +#define CFG_MAX_NAND_DEVICE		1 +#define CFG_NAND_BASE			0x40000000 +#define CFG_NAND_DBW_8			1 + +/* NOR flash - no real flash on this board */ +#define CFG_NO_FLASH			1 + +/* Ethernet */ +#define CONFIG_DRIVER_DM9000		1 +#define CONFIG_DM9000_BASE		0x30000000 +#define DM9000_IO			CONFIG_DM9000_BASE +#define DM9000_DATA			(CONFIG_DM9000_BASE + 4) +#define CONFIG_DM9000_USE_16BIT		1 +#define CONFIG_NET_RETRY_COUNT		20 +#define CONFIG_RESET_PHY_R		1 + +/* USB */ +#define CONFIG_USB_OHCI_NEW		1 +#define LITTLEENDIAN			1 +#define CONFIG_DOS_PARTITION		1 +#define CFG_USB_OHCI_CPU_INIT		1 +#define CFG_USB_OHCI_REGS_BASE		0x00500000	/* AT91SAM9261_UHP_BASE */ +#define CFG_USB_OHCI_SLOT_NAME		"at91sam9261" +#define CFG_USB_OHCI_MAX_ROOT_PORTS	2 +#define CONFIG_USB_STORAGE		1 + +#define CFG_LOAD_ADDR			0x22000000	/* load address */ + +#define CFG_MEMTEST_START		PHYS_SDRAM +#define CFG_MEMTEST_END			0x23e00000 + +#define CFG_USE_DATAFLASH_CS0		1 +#undef CFG_USE_NANDFLASH + +#ifdef CFG_USE_DATAFLASH_CS0 + +/* bootstrap + u-boot + env + linux in dataflash on CS0 */ +#define CFG_ENV_IS_IN_DATAFLASH	1 +#define CFG_MONITOR_BASE	(CFG_DATAFLASH_LOGIC_ADDR_CS0 + 0x8400) +#define CFG_ENV_OFFSET		0x4200 +#define CFG_ENV_ADDR		(CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET) +#define CFG_ENV_SIZE		0x4200 +#define CONFIG_BOOTCOMMAND	"cp.b 0xC0042000 0x22000000 0x210000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 "			\ +				"root=/dev/mtdblock0 "			\ +				"mtdparts=at91_nand:-(root) "		\ +				"rw rootfstype=jffs2" + +#else /* CFG_USE_NANDFLASH */ + +/* bootstrap + u-boot + env + linux in nandflash */ +#define CFG_ENV_IS_IN_NAND	1 +#define CFG_ENV_OFFSET		0x60000 +#define CFG_ENV_OFFSET_REDUND	0x80000 +#define CFG_ENV_SIZE		0x20000		/* 1 sector = 128 kB */ +#define CONFIG_BOOTCOMMAND	"nand read 0x22000000 0xA0000 0x200000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 "			\ +				"root=/dev/mtdblock5 "			\ +				"mtdparts=at91_nand:128k(bootstrap)ro,"	\ +				"256k(uboot)ro,128k(env1)ro,"		\ +				"128k(env2)ro,2M(linux),-(root) "	\ +				"rw rootfstype=jffs2" + +#endif + +#define CONFIG_BAUDRATE		115200 +#define CFG_BAUDRATE_TABLE	{115200 , 19200, 38400, 57600, 9600 } + +#define CFG_PROMPT		"U-Boot> " +#define CFG_CBSIZE		256 +#define CFG_MAXARGS		16 +#define CFG_PBSIZE		(CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) +#define CFG_LONGHELP		1 +#define CONFIG_CMDLINE_EDITING	1 + +#define ROUND(A, B)		(((A) + (B)) & ~((B) - 1)) +/* + * Size of malloc() pool + */ +#define CFG_MALLOC_LEN		ROUND(3 * CFG_ENV_SIZE + 128*1024, 0x1000) +#define CFG_GBL_DATA_SIZE	128	/* 128 bytes for initial data */ + +#define CONFIG_STACKSIZE	(32*1024)	/* regular stack */ + +#ifdef CONFIG_USE_IRQ +#error CONFIG_USE_IRQ not supported +#endif + +#endif diff --git a/include/configs/at91sam9263ek.h b/include/configs/at91sam9263ek.h new file mode 100644 index 000000000..a8194b564 --- /dev/null +++ b/include/configs/at91sam9263ek.h @@ -0,0 +1,206 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.com> + * + * Configuation settings for the AT91SAM9263EK board. + * + * 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 + +/* ARM asynchronous clock */ +#define AT91_CPU_NAME		"AT91SAM9263" +#define AT91_MAIN_CLOCK		199919000	/* from 16.367 MHz crystal */ +#define AT91_MASTER_CLOCK	99959500	/* peripheral = main / 2 */ +#define CFG_HZ			1000000		/* 1us resolution */ + +#define AT91_SLOW_CLOCK		32768	/* slow clock */ + +#define CONFIG_ARM926EJS	1	/* This is an ARM926EJS Core	*/ +#define CONFIG_AT91SAM9263	1	/* It's an Atmel AT91SAM9263 SoC*/ +#define CONFIG_AT91SAM9263EK	1	/* on an AT91SAM9263EK Board	*/ +#undef CONFIG_USE_IRQ			/* we don't need IRQ/FIQ stuff	*/ + +#define CONFIG_CMDLINE_TAG	1	/* enable passing of ATAGs	*/ +#define CONFIG_SETUP_MEMORY_TAGS 1 +#define CONFIG_INITRD_TAG	1 + +#define CONFIG_SKIP_LOWLEVEL_INIT +#define CONFIG_SKIP_RELOCATE_UBOOT + +/* + * Hardware drivers + */ +#define CONFIG_ATMEL_USART	1 +#undef CONFIG_USART0 +#undef CONFIG_USART1 +#undef CONFIG_USART2 +#define CONFIG_USART3		1	/* USART 3 is DBGU */ + +/* LCD */ +#define CONFIG_LCD			1 +#define LCD_BPP				LCD_COLOR8 +#define CONFIG_LCD_LOGO			1 +#undef LCD_TEST_PATTERN +#define CONFIG_LCD_INFO			1 +#define CONFIG_LCD_INFO_BELOW_LOGO	1 +#define CFG_WHITE_ON_BLACK		1 +#define CONFIG_ATMEL_LCD		1 +#define CONFIG_ATMEL_LCD_BGR555		1 +#define CFG_CONSOLE_IS_IN_ENV		1 + +#define CONFIG_BOOTDELAY	3 + +/* + * BOOTP options + */ +#define CONFIG_BOOTP_BOOTFILESIZE	1 +#define CONFIG_BOOTP_BOOTPATH		1 +#define CONFIG_BOOTP_GATEWAY		1 +#define CONFIG_BOOTP_HOSTNAME		1 + +/* + * Command line configuration. + */ +#include <config_cmd_default.h> +#undef CONFIG_CMD_BDI +#undef CONFIG_CMD_IMI +#undef CONFIG_CMD_AUTOSCRIPT +#undef CONFIG_CMD_FPGA +#undef CONFIG_CMD_LOADS +#undef CONFIG_CMD_IMLS + +#define CONFIG_CMD_PING		1 +#define CONFIG_CMD_DHCP		1 +#define CONFIG_CMD_NAND		1 +#define CONFIG_CMD_USB		1 + +/* SDRAM */ +#define CONFIG_NR_DRAM_BANKS		1 +#define PHYS_SDRAM			0x20000000 +#define PHYS_SDRAM_SIZE			0x04000000	/* 64 megs */ + +/* DataFlash */ +#define CONFIG_HAS_DATAFLASH		1 +#define CFG_SPI_WRITE_TOUT		(5*CFG_HZ) +#define CFG_MAX_DATAFLASH_BANKS		1 +#define CFG_DATAFLASH_LOGIC_ADDR_CS0	0xC0000000	/* CS0 */ +#define AT91_SPI_CLK			15000000 +#define DATAFLASH_TCSS			(0x1a << 16) +#define DATAFLASH_TCHS			(0x1 << 24) + +/* NOR flash, if populated */ +#if 1 +#define CFG_NO_FLASH			1 +#else +#define CFG_FLASH_CFI			1 +#define CFG_FLASH_CFI_DRIVER		1 +#define PHYS_FLASH_1			0x10000000 +#define CFG_FLASH_BASE			PHYS_FLASH_1 +#define CFG_MAX_FLASH_SECT		256 +#define CFG_MAX_FLASH_BANKS		1 +#endif + +/* NAND flash */ +#define NAND_MAX_CHIPS			1 +#define CFG_MAX_NAND_DEVICE		1 +#define CFG_NAND_BASE			0x40000000 +#define CFG_NAND_DBW_8			1 + +/* Ethernet */ +#define CONFIG_MACB			1 +#define CONFIG_RMII			1 +#define CONFIG_NET_MULTI		1 +#define CONFIG_NET_RETRY_COUNT		20 +#define CONFIG_RESET_PHY_R		1 + +/* USB */ +#define CONFIG_USB_OHCI_NEW		1 +#define LITTLEENDIAN			1 +#define CONFIG_DOS_PARTITION		1 +#define CFG_USB_OHCI_CPU_INIT		1 +#define CFG_USB_OHCI_REGS_BASE		0x00a00000	/* AT91SAM9263_UHP_BASE */ +#define CFG_USB_OHCI_SLOT_NAME		"at91sam9263" +#define CFG_USB_OHCI_MAX_ROOT_PORTS	2 +#define CONFIG_USB_STORAGE		1 + +#define CFG_LOAD_ADDR			0x22000000	/* load address */ + +#define CFG_MEMTEST_START		PHYS_SDRAM +#define CFG_MEMTEST_END			0x23e00000 + +#define CFG_USE_DATAFLASH		1 +#undef CFG_USE_NANDFLASH + +#ifdef CFG_USE_DATAFLASH + +/* bootstrap + u-boot + env + linux in dataflash on CS0 */ +#define CFG_ENV_IS_IN_DATAFLASH	1 +#define CFG_MONITOR_BASE	(CFG_DATAFLASH_LOGIC_ADDR_CS0 + 0x8400) +#define CFG_ENV_OFFSET		0x4200 +#define CFG_ENV_ADDR		(CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET) +#define CFG_ENV_SIZE		0x4200 +#define CONFIG_BOOTCOMMAND	"cp.b 0xC0042000 0x22000000 0x210000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 " \ +				"root=/dev/mtdblock0 " \ +				"mtdparts=at91_nand:-(root) "\ +				"rw rootfstype=jffs2" + +#else /* CFG_USE_NANDFLASH */ + +/* bootstrap + u-boot + env + linux in nandflash */ +#define CFG_ENV_IS_IN_NAND	1 +#define CFG_ENV_OFFSET		0x60000 +#define CFG_ENV_OFFSET_REDUND	0x80000 +#define CFG_ENV_SIZE		0x20000		/* 1 sector = 128 kB */ +#define CONFIG_BOOTCOMMAND	"nand read 0x22000000 0xA0000 0x200000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 " \ +				"root=/dev/mtdblock5 " \ +				"mtdparts=at91_nand:128k(bootstrap)ro,256k(uboot)ro,128k(env1)ro,128k(env2)ro,2M(linux),-(root) " \ +				"rw rootfstype=jffs2" + +#endif + +#define CONFIG_BAUDRATE		115200 +#define CFG_BAUDRATE_TABLE	{115200 , 19200, 38400, 57600, 9600 } + +#define CFG_PROMPT		"U-Boot> " +#define CFG_CBSIZE		256 +#define CFG_MAXARGS		16 +#define CFG_PBSIZE		(CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) +#define CFG_LONGHELP		1 +#define CONFIG_CMDLINE_EDITING	1 + +#define ROUND(A, B)		(((A) + (B)) & ~((B) - 1)) +/* + * Size of malloc() pool + */ +#define CFG_MALLOC_LEN		ROUND(3 * CFG_ENV_SIZE + 128*1024, 0x1000) +#define CFG_GBL_DATA_SIZE	128	/* 128 bytes for initial data */ + +#define CONFIG_STACKSIZE	(32*1024)	/* regular stack */ + +#ifdef CONFIG_USE_IRQ +#error CONFIG_USE_IRQ not supported +#endif + +#endif diff --git a/include/configs/at91sam9rlek.h b/include/configs/at91sam9rlek.h new file mode 100644 index 000000000..2ad8d05eb --- /dev/null +++ b/include/configs/at91sam9rlek.h @@ -0,0 +1,175 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop <stelian.pop@leadtechdesign.com> + * Lead Tech Design <www.leadtechdesign.com> + * + * Configuation settings for the AT91SAM9RLEK board. + * + * 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 + +/* ARM asynchronous clock */ +#define AT91_CPU_NAME		"AT91SAM9RL" +#define AT91_MAIN_CLOCK		200000000	/* from 12.000 MHz crystal */ +#define AT91_MASTER_CLOCK	100000000	/* peripheral = main / 2 */ +#define CFG_HZ			1000000		/* 1us resolution */ + +#define AT91_SLOW_CLOCK		32768	/* slow clock */ + +#define CONFIG_ARM926EJS	1	/* This is an ARM926EJS Core	*/ +#define CONFIG_AT91SAM9RL	1	/* It's an Atmel AT91SAM9RL SoC*/ +#define CONFIG_AT91SAM9RLEK	1	/* on an AT91SAM9RLEK Board	*/ +#undef CONFIG_USE_IRQ			/* we don't need IRQ/FIQ stuff	*/ + +#define CONFIG_CMDLINE_TAG	1	/* enable passing of ATAGs	*/ +#define CONFIG_SETUP_MEMORY_TAGS 1 +#define CONFIG_INITRD_TAG	1 + +#define CONFIG_SKIP_LOWLEVEL_INIT +#define CONFIG_SKIP_RELOCATE_UBOOT + +/* + * Hardware drivers + */ +#define CONFIG_ATMEL_USART	1 +#undef CONFIG_USART0 +#undef CONFIG_USART1 +#undef CONFIG_USART2 +#define CONFIG_USART3		1	/* USART 3 is DBGU */ + +/* LCD */ +#define CONFIG_LCD			1 +#define LCD_BPP				LCD_COLOR8 +#define CONFIG_LCD_LOGO			1 +#undef LCD_TEST_PATTERN +#define CONFIG_LCD_INFO			1 +#define CONFIG_LCD_INFO_BELOW_LOGO	1 +#define CFG_WHITE_ON_BLACK		1 +#define CONFIG_ATMEL_LCD		1 +#define CONFIG_ATMEL_LCD_RGB565		1 +#define CFG_CONSOLE_IS_IN_ENV		1 + +#define CONFIG_BOOTDELAY	3 + +/* + * Command line configuration. + */ +#include <config_cmd_default.h> +#undef CONFIG_CMD_BDI +#undef CONFIG_CMD_IMI +#undef CONFIG_CMD_AUTOSCRIPT +#undef CONFIG_CMD_FPGA +#undef CONFIG_CMD_LOADS +#undef CONFIG_CMD_IMLS +#undef CONFIG_CMD_NET +#undef CONFIG_CMD_USB + +#define CONFIG_CMD_NAND		1 + +/* SDRAM */ +#define CONFIG_NR_DRAM_BANKS		1 +#define PHYS_SDRAM			0x20000000 +#define PHYS_SDRAM_SIZE			0x04000000	/* 64 megs */ + +/* DataFlash */ +#define CONFIG_HAS_DATAFLASH		1 +#define CFG_SPI_WRITE_TOUT		(5*CFG_HZ) +#define CFG_MAX_DATAFLASH_BANKS		1 +#define CFG_DATAFLASH_LOGIC_ADDR_CS0	0xC0000000	/* CS0 */ +#define AT91_SPI_CLK			15000000 +#define DATAFLASH_TCSS			(0x1a << 16) +#define DATAFLASH_TCHS			(0x1 << 24) + +/* NOR flash - not present */ +#define CFG_NO_FLASH			1 + +/* NAND flash */ +#define NAND_MAX_CHIPS			1 +#define CFG_MAX_NAND_DEVICE		1 +#define CFG_NAND_BASE			0x40000000 +#define CFG_NAND_DBW_8			1 + +/* Ethernet - not present */ + +/* USB - not supported */ + +#define CFG_LOAD_ADDR			0x22000000	/* load address */ + +#define CFG_MEMTEST_START		PHYS_SDRAM +#define CFG_MEMTEST_END			0x23e00000 + +#define CFG_USE_DATAFLASH		1 +#undef CFG_USE_NANDFLASH + +#ifdef CFG_USE_DATAFLASH + +/* bootstrap + u-boot + env + linux in dataflash on CS0 */ +#define CFG_ENV_IS_IN_DATAFLASH	1 +#define CFG_MONITOR_BASE	(CFG_DATAFLASH_LOGIC_ADDR_CS0 + 0x8400) +#define CFG_ENV_OFFSET		0x4200 +#define CFG_ENV_ADDR		(CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET) +#define CFG_ENV_SIZE		0x4200 +#define CONFIG_BOOTCOMMAND	"cp.b 0xC0042000 0x22000000 0x210000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 " \ +				"root=/dev/mtdblock0 " \ +				"mtdparts=at91_nand:-(root) "\ +				"rw rootfstype=jffs2" + +#else /* CFG_USE_NANDFLASH */ + +/* bootstrap + u-boot + env + linux in nandflash */ +#define CFG_ENV_IS_IN_NAND	1 +#define CFG_ENV_OFFSET		0x60000 +#define CFG_ENV_OFFSET_REDUND	0x80000 +#define CFG_ENV_SIZE		0x20000		/* 1 sector = 128 kB */ +#define CONFIG_BOOTCOMMAND	"nand read 0x22000000 0xA0000 0x200000; bootm" +#define CONFIG_BOOTARGS		"console=ttyS0,115200 " \ +				"root=/dev/mtdblock5 " \ +				"mtdparts=at91_nand:128k(bootstrap)ro,256k(uboot)ro,128k(env1)ro,128k(env2)ro,2M(linux),-(root) " \ +				"rw rootfstype=jffs2" + +#endif + +#define CONFIG_BAUDRATE		115200 +#define CFG_BAUDRATE_TABLE	{115200 , 19200, 38400, 57600, 9600 } + +#define CFG_PROMPT		"U-Boot> " +#define CFG_CBSIZE		256 +#define CFG_MAXARGS		16 +#define CFG_PBSIZE		(CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) +#define CFG_LONGHELP		1 +#define CONFIG_CMDLINE_EDITING	1 + +#define ROUND(A, B)		(((A) + (B)) & ~((B) - 1)) +/* + * Size of malloc() pool + */ +#define CFG_MALLOC_LEN		ROUND(3 * CFG_ENV_SIZE + 128*1024, 0x1000) +#define CFG_GBL_DATA_SIZE	128	/* 128 bytes for initial data */ + +#define CONFIG_STACKSIZE	(32*1024)	/* regular stack */ + +#ifdef CONFIG_USE_IRQ +#error CONFIG_USE_IRQ not supported +#endif + +#endif diff --git a/include/configs/atngw100.h b/include/configs/atngw100.h index 5aad043d8..3fc997563 100644 --- a/include/configs/atngw100.h +++ b/include/configs/atngw100.h @@ -24,6 +24,8 @@  #ifndef __CONFIG_H  #define __CONFIG_H +#include <asm/arch/memory-map.h> +  #define CONFIG_AVR32			1  #define CONFIG_AT32AP			1  #define CONFIG_AT32AP7000		1 @@ -112,8 +114,11 @@  #define CONFIG_CMD_FAT  #define CONFIG_CMD_JFFS2  #define CONFIG_CMD_MMC + +#undef CONFIG_CMD_AUTOSCRIPT  #undef CONFIG_CMD_FPGA  #undef CONFIG_CMD_SETGETDCR +#undef CONFIG_CMD_XIMG  #define CONFIG_ATMEL_USART		1  #define CONFIG_MACB			1 @@ -137,11 +142,9 @@  #define CFG_MONITOR_BASE		CFG_FLASH_BASE -#define CFG_INTRAM_BASE			0x24000000 -#define CFG_INTRAM_SIZE			0x8000 - -#define CFG_SDRAM_BASE			0x10000000 -#define CFG_SDRAM_16BIT			1 +#define CFG_INTRAM_BASE			INTERNAL_SRAM_BASE +#define CFG_INTRAM_SIZE			INTERNAL_SRAM_SIZE +#define CFG_SDRAM_BASE			EBI_SDRAM_BASE  #define CFG_ENV_IS_IN_FLASH		1  #define CFG_ENV_SIZE			65536 @@ -150,27 +153,20 @@  #define CFG_INIT_SP_ADDR		(CFG_INTRAM_BASE + CFG_INTRAM_SIZE)  #define CFG_MALLOC_LEN			(256*1024) -#define CFG_MALLOC_END							\ -	({								\ -		DECLARE_GLOBAL_DATA_PTR;				\ -		CFG_SDRAM_BASE + gd->sdram_size;			\ -	}) -#define CFG_MALLOC_START		(CFG_MALLOC_END - CFG_MALLOC_LEN) -  #define CFG_DMA_ALLOC_LEN		(16384)  /* Allow 4MB for the kernel run-time image */ -#define CFG_LOAD_ADDR			(CFG_SDRAM_BASE + 0x00400000) +#define CFG_LOAD_ADDR			(EBI_SDRAM_BASE + 0x00400000)  #define CFG_BOOTPARAMS_LEN		(16 * 1024)  /* Other configuration settings that shouldn't have to change all that often */ -#define CFG_PROMPT			"Uboot> " +#define CFG_PROMPT			"U-Boot> "  #define CFG_CBSIZE			256  #define CFG_MAXARGS			16  #define CFG_PBSIZE			(CFG_CBSIZE + sizeof(CFG_PROMPT) + 16)  #define CFG_LONGHELP			1 -#define CFG_MEMTEST_START		CFG_SDRAM_BASE +#define CFG_MEMTEST_START		EBI_SDRAM_BASE  #define CFG_MEMTEST_END			(CFG_MEMTEST_START + 0x1f00000)  #define CFG_BAUDRATE_TABLE { 115200, 38400, 19200, 9600, 2400 } diff --git a/include/configs/atstk1002.h b/include/configs/atstk1002.h index 95aeab6d4..ba18eb63c 100644 --- a/include/configs/atstk1002.h +++ b/include/configs/atstk1002.h @@ -24,6 +24,8 @@  #ifndef __CONFIG_H  #define __CONFIG_H +#include <asm/arch/memory-map.h> +  #define CONFIG_AVR32			1  #define CONFIG_AT32AP			1  #define CONFIG_AT32AP7000		1 @@ -139,9 +141,9 @@  #define CONFIG_CMD_FAT  #define CONFIG_CMD_JFFS2  #define CONFIG_CMD_MMC -#define CONFIG_CMD_REGINFO  #undef CONFIG_CMD_AUTOSCRIPT +#undef CONFIG_CMD_FPGA  #undef CONFIG_CMD_SETGETDCR  #undef CONFIG_CMD_XIMG @@ -170,10 +172,9 @@  #define CFG_MONITOR_BASE		CFG_FLASH_BASE -#define CFG_INTRAM_BASE			0x24000000 -#define CFG_INTRAM_SIZE			0x8000 - -#define CFG_SDRAM_BASE			0x10000000 +#define CFG_INTRAM_BASE			INTERNAL_SRAM_BASE +#define CFG_INTRAM_SIZE			INTERNAL_SRAM_SIZE +#define CFG_SDRAM_BASE			EBI_SDRAM_BASE  #define CFG_ENV_IS_IN_FLASH		1  #define CFG_ENV_SIZE			65536 @@ -185,17 +186,17 @@  #define CFG_DMA_ALLOC_LEN		(16384)  /* Allow 4MB for the kernel run-time image */ -#define CFG_LOAD_ADDR			(CFG_SDRAM_BASE + 0x00400000) +#define CFG_LOAD_ADDR			(EBI_SDRAM_BASE + 0x00400000)  #define CFG_BOOTPARAMS_LEN		(16 * 1024)  /* Other configuration settings that shouldn't have to change all that often */ -#define CFG_PROMPT			"Uboot> " +#define CFG_PROMPT			"U-Boot> "  #define CFG_CBSIZE			256 -#define CFG_MAXARGS			8 +#define CFG_MAXARGS			16  #define CFG_PBSIZE			(CFG_CBSIZE + sizeof(CFG_PROMPT) + 16)  #define CFG_LONGHELP			1 -#define CFG_MEMTEST_START		CFG_SDRAM_BASE +#define CFG_MEMTEST_START		EBI_SDRAM_BASE  #define CFG_MEMTEST_END			(CFG_MEMTEST_START + 0x700000)  #define CFG_BAUDRATE_TABLE { 115200, 38400, 19200, 9600, 2400 } diff --git a/include/configs/atstk1003.h b/include/configs/atstk1003.h index 194788b18..a528ddfb0 100644 --- a/include/configs/atstk1003.h +++ b/include/configs/atstk1003.h @@ -24,6 +24,8 @@  #ifndef __CONFIG_H  #define __CONFIG_H +#include <asm/arch/memory-map.h> +  #define CONFIG_AVR32			1  #define CONFIG_AT32AP			1  #define CONFIG_AT32AP7001		1 @@ -153,10 +155,9 @@  #define CFG_MONITOR_BASE		CFG_FLASH_BASE -#define CFG_INTRAM_BASE			0x24000000 -#define CFG_INTRAM_SIZE			0x8000 - -#define CFG_SDRAM_BASE			0x10000000 +#define CFG_INTRAM_BASE			INTERNAL_SRAM_BASE +#define CFG_INTRAM_SIZE			INTERNAL_SRAM_SIZE +#define CFG_SDRAM_BASE			EBI_SDRAM_BASE  #define CFG_ENV_IS_IN_FLASH		1  #define CFG_ENV_SIZE			65536 @@ -167,17 +168,17 @@  #define CFG_MALLOC_LEN			(256*1024)  /* Allow 4MB for the kernel run-time image */ -#define CFG_LOAD_ADDR			(CFG_SDRAM_BASE + 0x00400000) +#define CFG_LOAD_ADDR			(EBI_SDRAM_BASE + 0x00400000)  #define CFG_BOOTPARAMS_LEN		(16 * 1024)  /* Other configuration settings that shouldn't have to change all that often */ -#define CFG_PROMPT			"Uboot> " +#define CFG_PROMPT			"U-Boot> "  #define CFG_CBSIZE			256  #define CFG_MAXARGS			16  #define CFG_PBSIZE			(CFG_CBSIZE + sizeof(CFG_PROMPT) + 16)  #define CFG_LONGHELP			1 -#define CFG_MEMTEST_START		CFG_SDRAM_BASE +#define CFG_MEMTEST_START		EBI_SDRAM_BASE  #define CFG_MEMTEST_END			(CFG_MEMTEST_START + 0x700000)  #define CFG_BAUDRATE_TABLE { 115200, 38400, 19200, 9600, 2400 } diff --git a/include/configs/atstk1004.h b/include/configs/atstk1004.h index b81fc2127..fc9585e84 100644 --- a/include/configs/atstk1004.h +++ b/include/configs/atstk1004.h @@ -24,6 +24,8 @@  #ifndef __CONFIG_H  #define __CONFIG_H +#include <asm/arch/memory-map.h> +  #define CONFIG_AVR32			1  #define CONFIG_AT32AP			1  #define CONFIG_AT32AP7002		1 @@ -153,11 +155,9 @@  #define CFG_MONITOR_BASE		CFG_FLASH_BASE -#define CFG_INTRAM_BASE			0x24000000 -#define CFG_INTRAM_SIZE			0x8000 - -#define CFG_SDRAM_BASE			0x10000000 -#define CFG_SDRAM_16BIT			1 +#define CFG_INTRAM_BASE			INTERNAL_SRAM_BASE +#define CFG_INTRAM_SIZE			INTERNAL_SRAM_SIZE +#define CFG_SDRAM_BASE			EBI_SDRAM_BASE  #define CFG_ENV_IS_IN_FLASH		1  #define CFG_ENV_SIZE			65536 @@ -168,17 +168,17 @@  #define CFG_MALLOC_LEN			(256*1024)  /* Allow 2MB for the kernel run-time image */ -#define CFG_LOAD_ADDR			(CFG_SDRAM_BASE + 0x00200000) +#define CFG_LOAD_ADDR			(EBI_SDRAM_BASE + 0x00200000)  #define CFG_BOOTPARAMS_LEN		(16 * 1024)  /* Other configuration settings that shouldn't have to change all that often */ -#define CFG_PROMPT			"Uboot> " +#define CFG_PROMPT			"U-Boot> "  #define CFG_CBSIZE			256  #define CFG_MAXARGS			16  #define CFG_PBSIZE			(CFG_CBSIZE + sizeof(CFG_PROMPT) + 16)  #define CFG_LONGHELP			1 -#define CFG_MEMTEST_START		CFG_SDRAM_BASE +#define CFG_MEMTEST_START		EBI_SDRAM_BASE  #define CFG_MEMTEST_END			(CFG_MEMTEST_START + 0x700000)  #define CFG_BAUDRATE_TABLE { 115200, 38400, 19200, 9600, 2400 } diff --git a/include/configs/atstk1006.h b/include/configs/atstk1006.h new file mode 100644 index 000000000..9fd49a53a --- /dev/null +++ b/include/configs/atstk1006.h @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2005-2006 Atmel Corporation + * + * Configuration settings for the ATSTK1002 CPU daughterboard + * + * 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 + +#include <asm/arch/memory-map.h> + +#define CONFIG_AVR32			1 +#define CONFIG_AT32AP			1 +#define CONFIG_AT32AP7000		1 +#define CONFIG_ATSTK1006		1 +#define CONFIG_ATSTK1000		1 + +#define CONFIG_ATSTK1000_EXT_FLASH	1 + +/* + * Timer clock frequency. We're using the CPU-internal COUNT register + * for this, so this is equivalent to the CPU core clock frequency + */ +#define CFG_HZ				1000 + +/* + * Set up the PLL to run at 140 MHz, the CPU to run at the PLL + * frequency, the HSB and PBB at 1/2, and the PBA to run at 1/4 the + * PLL frequency. + * (CFG_OSC0_HZ * CFG_PLL0_MUL) / CFG_PLL0_DIV = PLL MHz + */ +#define CONFIG_PLL			1 +#define CFG_POWER_MANAGER		1 +#define CFG_OSC0_HZ			20000000 +#define CFG_PLL0_DIV			1 +#define CFG_PLL0_MUL			7 +#define CFG_PLL0_SUPPRESS_CYCLES	16 +/* + * Set the CPU running at: + * PLL / (2^CFG_CLKDIV_CPU) = CPU MHz + */ +#define CFG_CLKDIV_CPU			0 +/* + * Set the HSB running at: + * PLL / (2^CFG_CLKDIV_HSB) = HSB MHz + */ +#define CFG_CLKDIV_HSB			1 +/* + * Set the PBA running at: + * PLL / (2^CFG_CLKDIV_PBA) = PBA MHz + */ +#define CFG_CLKDIV_PBA			2 +/* + * Set the PBB running at: + * PLL / (2^CFG_CLKDIV_PBB) = PBB MHz + */ +#define CFG_CLKDIV_PBB			1 + +/* + * The PLLOPT register controls the PLL like this: + *   icp = PLLOPT<2> + *   ivco = PLLOPT<1:0> + * + * We want icp=1 (default) and ivco=0 (80-160 MHz) or ivco=2 (150-240MHz). + */ +#define CFG_PLL0_OPT			0x04 + +#undef CONFIG_USART0 +#define CONFIG_USART1			1 +#undef CONFIG_USART2 +#undef CONFIG_USART3 + +/* User serviceable stuff */ +#define CONFIG_DOS_PARTITION		1 + +#define CONFIG_CMDLINE_TAG		1 +#define CONFIG_SETUP_MEMORY_TAGS	1 +#define CONFIG_INITRD_TAG		1 + +#define CONFIG_STACKSIZE		(2048) + +#define CONFIG_BAUDRATE			115200 +#define CONFIG_BOOTARGS							\ +	"console=ttyS0 root=mtd3 fbmem=2400k" + +#define CONFIG_BOOTCOMMAND						\ +	"fsload; bootm $(fileaddr)" + +/* + * Only interrupt autoboot if <space> is pressed. Otherwise, garbage + * data on the serial line may interrupt the boot sequence. + */ +#define CONFIG_BOOTDELAY		1 +#define CONFIG_AUTOBOOT			1 +#define CONFIG_AUTOBOOT_KEYED		1 +#define CONFIG_AUTOBOOT_PROMPT				\ +	"Press SPACE to abort autoboot in %d seconds\n" +#define CONFIG_AUTOBOOT_DELAY_STR	"d" +#define CONFIG_AUTOBOOT_STOP_STR	" " + +/* + * After booting the board for the first time, new ethernet addresses + * should be generated and assigned to the environment variables + * "ethaddr" and "eth1addr". This is normally done during production. + */ +#define CONFIG_OVERWRITE_ETHADDR_ONCE	1 +#define CONFIG_NET_MULTI		1 + +/* + * BOOTP options + */ +#define CONFIG_BOOTP_SUBNETMASK +#define CONFIG_BOOTP_GATEWAY + + +/* + * Command line configuration. + */ +#include <config_cmd_default.h> + +#define CONFIG_CMD_ASKENV +#define CONFIG_CMD_DHCP +#define CONFIG_CMD_EXT2 +#define CONFIG_CMD_FAT +#define CONFIG_CMD_JFFS2 +#define CONFIG_CMD_MMC + +#undef CONFIG_CMD_AUTOSCRIPT +#undef CONFIG_CMD_FPGA +#undef CONFIG_CMD_SETGETDCR +#undef CONFIG_CMD_XIMG + +#define CONFIG_ATMEL_USART		1 +#define CONFIG_MACB			1 +#define CONFIG_PIO2			1 +#define CFG_NR_PIOS			5 +#define CFG_HSDRAMC			1 +#define CONFIG_MMC			1 + +#define CFG_DCACHE_LINESZ		32 +#define CFG_ICACHE_LINESZ		32 + +#define CONFIG_NR_DRAM_BANKS		1 + +/* External flash on STK1000 */ +#if 0 +#define CFG_FLASH_CFI			1 +#define CFG_FLASH_CFI_DRIVER		1 +#endif + +#define CFG_FLASH_BASE			0x00000000 +#define CFG_FLASH_SIZE			0x800000 +#define CFG_MAX_FLASH_BANKS		1 +#define CFG_MAX_FLASH_SECT		135 + +#define CFG_MONITOR_BASE		CFG_FLASH_BASE + +#define CFG_INTRAM_BASE			INTERNAL_SRAM_BASE +#define CFG_INTRAM_SIZE			INTERNAL_SRAM_SIZE +#define CFG_SDRAM_BASE			EBI_SDRAM_BASE + +#define CFG_ENV_IS_IN_FLASH		1 +#define CFG_ENV_SIZE			65536 +#define CFG_ENV_ADDR			(CFG_FLASH_BASE + CFG_FLASH_SIZE - CFG_ENV_SIZE) + +#define CFG_INIT_SP_ADDR		(CFG_INTRAM_BASE + CFG_INTRAM_SIZE) + +#define CFG_MALLOC_LEN			(256*1024) +#define CFG_DMA_ALLOC_LEN		(16384) + +/* Allow 4MB for the kernel run-time image */ +#define CFG_LOAD_ADDR			(EBI_SDRAM_BASE + 0x00400000) +#define CFG_BOOTPARAMS_LEN		(16 * 1024) + +/* Other configuration settings that shouldn't have to change all that often */ +#define CFG_PROMPT			"U-Boot> " +#define CFG_CBSIZE			256 +#define CFG_MAXARGS			16 +#define CFG_PBSIZE			(CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) +#define CFG_LONGHELP			1 + +#define CFG_MEMTEST_START		EBI_SDRAM_BASE +#define CFG_MEMTEST_END			(CFG_MEMTEST_START + 0x3f00000) +#define CFG_BAUDRATE_TABLE { 115200, 38400, 19200, 9600, 2400 } + +#endif /* __CONFIG_H */ diff --git a/include/configs/canmb.h b/include/configs/canmb.h index 0f7bb619c..f097e2c2f 100644 --- a/include/configs/canmb.h +++ b/include/configs/canmb.h @@ -40,6 +40,8 @@  #define CONFIG_BOARD_EARLY_INIT_R +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/cm5200.h b/include/configs/cm5200.h index d55434802..ef50c7cab 100644 --- a/include/configs/cm5200.h +++ b/include/configs/cm5200.h @@ -31,6 +31,8 @@  #define CONFIG_MPC5200		1	/* (more precisely an MPC5200 CPU) */  #define CONFIG_CM5200		1	/* ... on CM5200 platform */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Supported commands   */ diff --git a/include/configs/cpci5200.h b/include/configs/cpci5200.h index 1b30e51a3..fffd1fe1f 100644 --- a/include/configs/cpci5200.h +++ b/include/configs/cpci5200.h @@ -50,6 +50,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported 	  */ +  /*   * Serial console configuration   */ diff --git a/include/configs/hmi1001.h b/include/configs/hmi1001.h index e5a889774..ad7cf7686 100644 --- a/include/configs/hmi1001.h +++ b/include/configs/hmi1001.h @@ -40,6 +40,8 @@  #define CONFIG_BOARD_EARLY_INIT_R +#define CONFIG_HIGH_BATS	1	/* High BATs supported			*/ +  /*   * Serial console configuration   */ diff --git a/include/configs/imx31_litekit.h b/include/configs/imx31_litekit.h index 4281d73c9..ec4ed1eeb 100644 --- a/include/configs/imx31_litekit.h +++ b/include/configs/imx31_litekit.h @@ -65,7 +65,8 @@  #define CONFIG_HARD_SPI		1  #define CONFIG_MXC_SPI		1 -#define CONFIG_MXC_SPI_IFACE	1 +#define CONFIG_DEFAULT_SPI_BUS	1 +#define CONFIG_DEFAULT_SPI_MODE	(SPI_MODE_2 | SPI_CS_HIGH)  #define CONFIG_RTC_MC13783	1 diff --git a/include/configs/inka4x0.h b/include/configs/inka4x0.h index c89f041ee..6ec92c38c 100644 --- a/include/configs/inka4x0.h +++ b/include/configs/inka4x0.h @@ -40,6 +40,8 @@  #define CONFIG_MISC_INIT_F	1	/* Use misc_init_f()			*/ +#define CONFIG_HIGH_BATS	1	/* High BATs supported			*/ +  /*   * Serial console configuration   */ diff --git a/include/configs/jupiter.h b/include/configs/jupiter.h index 980e9fe9c..c9859270c 100644 --- a/include/configs/jupiter.h +++ b/include/configs/jupiter.h @@ -41,6 +41,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/mcc200.h b/include/configs/mcc200.h index a9c86f9e3..e4c3f7239 100644 --- a/include/configs/mcc200.h +++ b/include/configs/mcc200.h @@ -40,6 +40,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH	*/  #define BOOTFLAG_WARM		0x02	/* Software reboot			*/ +#define CONFIG_HIGH_BATS	1	/* High BATs supported			*/ +  /*   * Serial console configuration   * diff --git a/include/configs/mecp5200.h b/include/configs/mecp5200.h index 5218d9ca9..8dfb9aa8a 100644 --- a/include/configs/mecp5200.h +++ b/include/configs/mecp5200.h @@ -50,6 +50,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/motionpro.h b/include/configs/motionpro.h index 150359816..b6843af3d 100644 --- a/include/configs/motionpro.h +++ b/include/configs/motionpro.h @@ -35,6 +35,7 @@  #define CONFIG_MPC5200		1	/* More exactly a MPC5200 */  #define CONFIG_MOTIONPRO	1	/* ... on Promess Motion-PRO board */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */  /*   * BOOTP options diff --git a/include/configs/mpc7448hpc2.h b/include/configs/mpc7448hpc2.h index f614e679f..a218f7576 100644 --- a/include/configs/mpc7448hpc2.h +++ b/include/configs/mpc7448hpc2.h @@ -39,7 +39,7 @@  #define CONFIG_MPC7448HPC2  #define CONFIG_74xx -#define CONFIG_750FX		/* this option to enable init of extended BATs */ +#define CONFIG_HIGH_BATS	/* High BATs supported */  #define CONFIG_ALTIVEC		/* undef to disable */  #define CFG_BOARD_NAME		"MPC7448 HPC II" diff --git a/include/configs/munices.h b/include/configs/munices.h index 38b27bb3a..e0046ec2d 100644 --- a/include/configs/munices.h +++ b/include/configs/munices.h @@ -35,6 +35,7 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */  #define CFG_CACHELINE_SIZE	32	/* For MPC5xxx CPUs */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */  /*   * Command line configuration. diff --git a/include/configs/mx31ads.h b/include/configs/mx31ads.h index 2ea48a6da..37ba872a4 100644 --- a/include/configs/mx31ads.h +++ b/include/configs/mx31ads.h @@ -62,7 +62,8 @@  #define CONFIG_HARD_SPI		1  #define CONFIG_MXC_SPI		1 -#define CONFIG_MXC_SPI_IFACE	1	/* Default SPI interface number */ +#define CONFIG_DEFAULT_SPI_BUS	1 +#define CONFIG_DEFAULT_SPI_MODE	(SPI_MODE_2 | SPI_CS_HIGH)  #define CONFIG_RTC_MC13783	1 diff --git a/include/configs/o2dnt.h b/include/configs/o2dnt.h index 8dde1ef39..88bdb03e6 100644 --- a/include/configs/o2dnt.h +++ b/include/configs/o2dnt.h @@ -37,6 +37,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/p3mx.h b/include/configs/p3mx.h index 0dac5161b..0913b14a4 100644 --- a/include/configs/p3mx.h +++ b/include/configs/p3mx.h @@ -42,6 +42,7 @@  #if defined (CONFIG_P3M750)  #define CONFIG_750FX			/* 750GL/GX/FX			*/ +#define CONFIG_HIGH_BATS		/* High BATs supported		*/  #define CFG_BOARD_NAME		"P3M750"  #define CFG_BUS_HZ		100000000  #define CFG_BUS_CLK		CFG_BUS_HZ diff --git a/include/configs/pf5200.h b/include/configs/pf5200.h index 2ce39c913..c065d3328 100644 --- a/include/configs/pf5200.h +++ b/include/configs/pf5200.h @@ -49,6 +49,7 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */  /*   * Serial console configuration   */ diff --git a/include/configs/quad100hd.h b/include/configs/quad100hd.h new file mode 100644 index 000000000..622a5d4cc --- /dev/null +++ b/include/configs/quad100hd.h @@ -0,0 +1,298 @@ +/* + * (C) Copyright 2008 + * Gary Jennejohn, DENX Software Engineering GmbH, garyj@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 + */ + +/************************************************************************ + * quad100hd.h - configuration for Quad100hd board + ***********************************************************************/ +#ifndef __CONFIG_H +#define __CONFIG_H + +/*----------------------------------------------------------------------- + * High Level Configuration Options + *----------------------------------------------------------------------*/ +#define CONFIG_QUAD100HD	1		/* Board is Quad100hd	*/ +#define CONFIG_4xx		1		/* ... PPC4xx family	*/ +#define CONFIG_405EP		1		/* Specifc 405EP support*/ + +#define CONFIG_SYS_CLK_FREQ     33333333 /* external frequency to pll   */ + +#define CONFIG_BOARD_EARLY_INIT_F 1		/* Call board_early_init_f */ + +#define PLLMR0_DEFAULT		PLLMR0_266_133_66 /* no PCI */ +#define PLLMR1_DEFAULT		PLLMR1_266_133_66 /* no PCI */ + +/* the environment is in the EEPROM by default */ +#define CFG_ENV_IS_IN_EEPROM +#undef CFG_ENV_IS_IN_FLASH + +#define CONFIG_NET_MULTI	1 +#define CONFIG_HAS_ETH1		1 +#define CONFIG_MII		1	/* MII PHY management		*/ +#define CONFIG_PHY_ADDR		0x01	/* PHY address			*/ +#define CFG_RX_ETH_BUFFER	16	/* Number of ethernet rx buffers & descriptors */ +#define CONFIG_PHY_RESET	1 +#define CONFIG_PHY_RESET_DELAY	300	/* PHY RESET recovery delay	*/ + +/* + * Command line configuration. + */ +#include <config_cmd_default.h> + +#undef CONFIG_CMD_ASKENV +#undef CONFIG_CMD_CACHE +#define CONFIG_CMD_DHCP +#undef CONFIG_CMD_DIAG +#define CONFIG_CMD_EEPROM +#undef CONFIG_CMD_ELF +#define CONFIG_CMD_I2C +#undef CONFIG_CMD_IRQ +#define CONFIG_CMD_JFFS2 +#undef CONFIG_CMD_LOG +#undef CONFIG_CMD_MII +#define CONFIG_CMD_NAND +#undef CONFIG_CMD_PING +#define CONFIG_CMD_REGINFO + +#undef CONFIG_WATCHDOG			/* watchdog disabled		*/ + +/*----------------------------------------------------------------------- + * SDRAM + *----------------------------------------------------------------------*/ +/* + * SDRAM configuration (please see cpu/ppc/sdram.[ch]) + */ +#define CONFIG_SDRAM_BANK0  1 +#define CFG_SDRAM_SIZE      0x02000000      /* 32 MB */ + +/* FIX! SDRAM timings used in datasheet */ +#define CFG_SDRAM_CL            3       /* CAS latency */ +#define CFG_SDRAM_tRP           20      /* PRECHARGE command period */ +#define CFG_SDRAM_tRC           66      /* ACTIVE-to-ACTIVE command period */ +#define CFG_SDRAM_tRCD          20      /* ACTIVE-to-READ delay */ +#define CFG_SDRAM_tRFC          66      /* Auto refresh period */ + +/* + * JFFS2 + */ +#define CFG_JFFS2_FIRST_BANK    0 +#ifdef  CFG_KERNEL_IN_JFFS2 +#define CFG_JFFS2_FIRST_SECTOR  0   /* JFFS starts at block 0 */ +#else /* kernel not in JFFS */ +#define CFG_JFFS2_FIRST_SECTOR  8   /* block 0-7 is kernel (1MB = 8 sectors) */ +#endif +#define CFG_JFFS2_NUM_BANKS     1 + +/*----------------------------------------------------------------------- + * Serial Port + *----------------------------------------------------------------------*/ +#undef	CFG_EXT_SERIAL_CLOCK			/* external serial clock */ +#define CFG_BASE_BAUD		691200 +#define CONFIG_BAUDRATE		115200 +#define CONFIG_SERIAL_MULTI + +/* The following table includes the supported baudrates */ +#define CFG_BAUDRATE_TABLE	\ +	{300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400} + +/*----------------------------------------------------------------------- + * Miscellaneous configurable options + *----------------------------------------------------------------------*/ +#define CFG_LONGHELP			/* undef to save memory		*/ +#define CFG_PROMPT	        "=> "	/* Monitor Command Prompt	*/ +#if defined(CONFIG_CMD_KGDB) +#define CFG_CBSIZE	        1024	/* Console I/O Buffer Size	*/ +#else +#define CFG_CBSIZE	        256	/* Console I/O Buffer Size	*/ +#endif +#define CFG_PBSIZE              (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ +#define CFG_MAXARGS	        16	/* max number of command args	*/ +#define CFG_BARGSIZE	        CFG_CBSIZE /* Boot Argument Buffer Size	*/ + +#define CFG_MEMTEST_START	0x0400000 /* memtest works on		*/ +#define CFG_MEMTEST_END		0x0C00000 /* 4 ... 12 MB in DRAM	*/ + +#define CFG_LOAD_ADDR		0x100000  /* default load address	*/ +#define CFG_EXTBDINFO		1	/* To use extended board_info (bd_t) */ + +#define CFG_HZ		        1000	/* decrementer freq: 1 ms ticks	*/ + +#define CONFIG_LOADS_ECHO	1	/* echo on for serial download	*/ +#define CFG_LOADS_BAUD_CHANGE	1	/* allow baudrate change	*/ + +#define CONFIG_CMDLINE_EDITING	1	/* add command line history	*/ +#define CONFIG_LOOPW            1       /* enable loopw command         */ +#define CONFIG_MX_CYCLIC        1       /* enable mdc/mwc commands      */ +#define CONFIG_ZERO_BOOTDELAY_CHECK	/* check for keypress on bootdelay==0 */ +#define CONFIG_VERSION_VARIABLE 1	/* include version env variable */ + +/*----------------------------------------------------------------------- + * I2C + *----------------------------------------------------------------------*/ +#define CONFIG_HARD_I2C		1		/* I2C with hardware support	*/ +#undef	CONFIG_SOFT_I2C				/* I2C bit-banged		*/ +#define CFG_I2C_SPEED		400000		/* I2C speed and slave address	*/ +#define CFG_I2C_SLAVE		0x7F + +#define CFG_I2C_EEPROM_ADDR	0x50		/* base address */ +#define CFG_I2C_EEPROM_ADDR_LEN	2		/* bytes of address */ + +#define CFG_EEPROM_PAGE_WRITE_BITS	5	/* 8 byte write page size */ +#define CFG_EEPROM_PAGE_WRITE_DELAY_MS	10	/* and takes up to 10 msec */ +#define CFG_EEPROM_SIZE			0x2000 + +/*----------------------------------------------------------------------- + * Start addresses for the final memory configuration + * (Set up by the startup code) + * Please note that CFG_SDRAM_BASE _must_ start at 0 + */ +#define CFG_SDRAM_BASE		0x00000000 +#define CFG_FLASH_BASE		0xFFC00000 +#define CFG_MONITOR_LEN		(256 * 1024)	/* Reserve 256 kB for Monitor	*/ +#define CFG_MALLOC_LEN		(128 * 1024)	/* Reserve 128 kB for malloc()	*/ +#define CFG_MONITOR_BASE	(TEXT_BASE) + +/* + * For booting Linux, the board info and command line data + * have to be in the first 8 MB of memory, since this is + * the maximum mapped by the Linux kernel during initialization. + */ +#define CFG_BOOTMAPSZ		(8 << 20)	/* Initial Memory map for Linux */ + +/*----------------------------------------------------------------------- + * FLASH organization + */ +#define CFG_FLASH_CFI			/* The flash is CFI compatible	*/ +#define	CFG_FLASH_CFI_DRIVER + +#define CFG_FLASH_BANKS_LIST	{ CFG_FLASH_BASE } + +#define CFG_MAX_FLASH_BANKS	1	/* max number of memory banks	*/ +#define CFG_MAX_FLASH_SECT	128	/* max number of sectors on one chip */ + +#define CFG_FLASH_ERASE_TOUT	120000	/* Timeout for Flash Erase (in ms) */ +#define CFG_FLASH_WRITE_TOUT	500	/* Timeout for Flash Write (in ms) */ + +#define CFG_FLASH_USE_BUFFER_WRITE 1	/* use buffered writes (20x faster) */ +#define CFG_FLASH_INCREMENT      0       /* there is only one bank         */ + +#define CFG_FLASH_EMPTY_INFO		/* print 'E' for empty sector on flinfo */ +#define CFG_FLASH_QUIET_TEST	1	/* don't warn upon unknown flash */ + +#ifdef CFG_ENV_IS_IN_FLASH +#define CFG_ENV_SECT_SIZE	0x10000	/* size of one complete sector	*/ +/* the environment is located before u-boot */ +#define CFG_ENV_ADDR		(TEXT_BASE - CFG_ENV_SECT_SIZE) + +/* Address and size of Redundant Environment Sector	*/ +#define CFG_ENV_ADDR_REDUND	(CFG_ENV_ADDR - CFG_ENV_SECT_SIZE) +#define CFG_ENV_SIZE_REDUND	(CFG_ENV_SECT_SIZE) +#endif + +#ifdef CFG_ENV_IS_IN_EEPROM +#define CFG_ENV_SIZE		0x400		/* Size of Environment vars */ +#define CFG_ENV_OFFSET		0x00000000 +#define CFG_ENABLE_CRC_16	1       /* Intrinsyc formatting used crc16 */ +#endif + +/* partly from PPCBoot */ +/* NAND */ +#define CONFIG_NAND +#ifdef CONFIG_NAND +#define CFG_NAND_BASE   0x60000000 +#define CFG_NAND_CS	10   /* our CS is GPIO10 */ +#define CFG_NAND_RDY	23   /* our RDY is GPIO23 */ +#define CFG_NAND_CE	24   /* our CE is GPIO24  */ +#define CFG_NAND_CLE	31   /* our CLE is GPIO31 */ +#define CFG_NAND_ALE	30   /* our ALE is GPIO30 */ +#define NAND_MAX_CHIPS	1 +#define CFG_MAX_NAND_DEVICE	1 +#endif + +/*----------------------------------------------------------------------- + * Definitions for initial stack pointer and data area (in data cache) + */ +/* use on chip memory (OCM) for temperary stack until sdram is tested */ +/* see ./cpu/ppc4xx/start.S */ +#define CFG_TEMP_STACK_OCM	1 + +/* On Chip Memory location */ +#define CFG_OCM_DATA_ADDR	0xF8000000 +#define CFG_OCM_DATA_SIZE	0x1000 +#define CFG_INIT_RAM_ADDR	CFG_OCM_DATA_ADDR /* inside of OCM		*/ +#define CFG_INIT_RAM_END	CFG_OCM_DATA_SIZE /* End of used area in RAM	*/ + +#define CFG_GBL_DATA_SIZE	128  /* size in bytes reserved for initial data */ +#define CFG_GBL_DATA_OFFSET	(CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) +#define CFG_INIT_SP_OFFSET      CFG_GBL_DATA_OFFSET + +/*----------------------------------------------------------------------- + * External Bus Controller (EBC) Setup + * Taken from PPCBoot board/icecube/icecube.h + */ + +/* see ./cpu/ppc4xx/cpu_init.c ./cpu/ppc4xx/ndfc.c */ +#define CFG_EBC_PB0AP		0x04002480 +/* AMD NOR flash - this corresponds to FLASH_BASE so may be correct */ +#define CFG_EBC_PB0CR		0xFFC5A000 +#define CFG_EBC_PB1AP           0x04005480 +#define CFG_EBC_PB1CR           0x60018000 +#define CFG_EBC_PB2AP           0x00000000 +#define CFG_EBC_PB2CR           0x00000000 +#define CFG_EBC_PB3AP           0x00000000 +#define CFG_EBC_PB3CR           0x00000000 +#define CFG_EBC_PB4AP           0x00000000 +#define CFG_EBC_PB4CR           0x00000000 + +/*----------------------------------------------------------------------- + * Definitions for GPIO setup (PPC405EP specific) + * + * Taken in part from PPCBoot board/icecube/icecube.h + */ +/* see ./cpu/ppc4xx/cpu_init.c ./cpu/ppc4xx/start.S */ +#define CFG_GPIO0_OSRH		0x55555550 +#define CFG_GPIO0_OSRL		0x00000110 +#define CFG_GPIO0_ISR1H		0x00000000 +#define CFG_GPIO0_ISR1L		0x15555445 +#define CFG_GPIO0_TSRH		0x00000000 +#define CFG_GPIO0_TSRL		0x00000000 +#define CFG_GPIO0_TCR		0xFFFF8097 +#define CFG_GPIO0_ODR		0x00000000 + +#if defined(CONFIG_CMD_KGDB) +#define CONFIG_KGDB_BAUDRATE	230400		/* speed to run kgdb serial port */ +#define CONFIG_KGDB_SER_INDEX	2		/* which serial port to use */ +#endif + +/* ENVIRONMENT VARS */ + +#define CONFIG_IPADDR		192.168.1.67 +#define CONFIG_SERVERIP		192.168.1.50 +#define CONFIG_GATEWAYIP	192.168.1.1 +#define CONFIG_NETMASK		255.255.255.0 +#define CONFIG_LOADADDR		300000 +#define CONFIG_BOOTDELAY	5	/* autoboot after 5 seconds */ + +/* pass open firmware flat tree */ +#define CONFIG_OF_LIBFDT	1 + +#endif	/* __CONFIG_H */ diff --git a/include/configs/sbc8349.h b/include/configs/sbc8349.h index 0ebc674a6..74815567f 100644 --- a/include/configs/sbc8349.h +++ b/include/configs/sbc8349.h @@ -570,6 +570,8 @@  #define CFG_HID2 HID2_HBE +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* DDR @ 0x00000000 */  #define CFG_IBAT0L	(CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)  #define CFG_IBAT0U	(CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) diff --git a/include/configs/smmaco4.h b/include/configs/smmaco4.h index 4578cae7d..3e47eb88a 100644 --- a/include/configs/smmaco4.h +++ b/include/configs/smmaco4.h @@ -42,6 +42,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/sorcery.h b/include/configs/sorcery.h index c62b9775c..18f553373 100644 --- a/include/configs/sorcery.h +++ b/include/configs/sorcery.h @@ -31,6 +31,8 @@  #define CONFIG_MPC8220		1  #define CONFIG_SORCERY		1	/* Sorcery board */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /* Input clock running at 60Mhz, read Hid1 for the CPU multiplier to     determine the CPU speed. */  #define CFG_MPC8220_CLKIN	60000000 /* ... running at 60MHz */ diff --git a/include/configs/spieval.h b/include/configs/spieval.h index 49213dc67..69d2d67ab 100644 --- a/include/configs/spieval.h +++ b/include/configs/spieval.h @@ -44,6 +44,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot	     */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/configs/uc101.h b/include/configs/uc101.h index dc1d7e1b3..042750e2f 100644 --- a/include/configs/uc101.h +++ b/include/configs/uc101.h @@ -40,6 +40,8 @@  #define CONFIG_BOARD_EARLY_INIT_R +#define CONFIG_HIGH_BATS	1	/* High BATs supported 			*/ +  /*   * Serial console configuration   */ diff --git a/include/configs/v38b.h b/include/configs/v38b.h index e24d6f77a..c20352255 100644 --- a/include/configs/v38b.h +++ b/include/configs/v38b.h @@ -46,6 +46,8 @@  #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH  */  #define BOOTFLAG_WARM		0x02	/* Software reboot */ +#define CONFIG_HIGH_BATS	1	/* High BATs supported */ +  /*   * Serial console configuration   */ diff --git a/include/lcd.h b/include/lcd.h index 8a4273cce..44ac8ef8c 100644 --- a/include/lcd.h +++ b/include/lcd.h @@ -155,7 +155,35 @@ typedef struct vidinfo {  	u_char	vl_bpix;	/* Bits per pixel, 0 = 1 */  } vidinfo_t; -#endif /* CONFIG_MPC823, CONFIG_PXA250 or CONFIG_MCC200 */ + +#elif defined(CONFIG_ATMEL_LCD) + +typedef struct vidinfo { +	u_long vl_col;		/* Number of columns (i.e. 640) */ +	u_long vl_row;		/* Number of rows (i.e. 480) */ +	u_long vl_clk;	/* pixel clock in ps    */ + +	/* LCD configuration register */ +	u_long vl_sync;		/* Horizontal / vertical sync */ +	u_long vl_bpix;		/* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16 */ +	u_long vl_tft;		/* 0 = passive, 1 = TFT */ + +	/* Horizontal control register. */ +	u_long vl_hsync_len;	/* Length of horizontal sync */ +	u_long vl_left_margin;	/* Time from sync to picture */ +	u_long vl_right_margin;	/* Time from picture to sync */ + +	/* Vertical control register. */ +	u_long vl_vsync_len;	/* Length of vertical sync */ +	u_long vl_upper_margin;	/* Time from sync to picture */ +	u_long vl_lower_margin;	/* Time from picture to sync */ + +	u_long	mmio;		/* Memory mapped registers */ +} vidinfo_t; + +extern vidinfo_t panel_info; + +#endif /* CONFIG_MPC823, CONFIG_PXA250 or CONFIG_MCC200 or CONFIG_ATMEL_LCD */  /* Video functions */ diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 4cc4a7d1b..e2a25a60d 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -385,6 +385,10 @@ struct nand_manufacturers {  extern struct nand_flash_dev nand_flash_ids[];  extern struct nand_manufacturers nand_manuf_ids[]; +#ifndef NAND_MAX_CHIPS +#define NAND_MAX_CHIPS 8 +#endif +  /**   * struct nand_bbt_descr - bad block table descriptor   * @options:	options for this descriptor diff --git a/include/logbuff.h b/include/logbuff.h index d06d20884..ae7908ca3 100644 --- a/include/logbuff.h +++ b/include/logbuff.h @@ -58,6 +58,7 @@ int drv_logbuff_init (void);  void logbuff_init_ptrs (void);  void logbuff_log(char *msg);  void logbuff_reset (void); +unsigned long logbuffer_base (void);  #endif /* CONFIG_LOGBUFFER */ diff --git a/include/onenand_uboot.h b/include/onenand_uboot.h index bd1831ea6..4449f987b 100644 --- a/include/onenand_uboot.h +++ b/include/onenand_uboot.h @@ -14,6 +14,8 @@  #ifndef __UBOOT_ONENAND_H  #define __UBOOT_ONENAND_H +#include <linux/types.h> +  struct kvec {  	void *iov_base;  	size_t iov_len; @@ -22,6 +24,9 @@ struct kvec {  typedef int spinlock_t;  typedef int wait_queue_head_t; +struct mtd_info; +struct erase_info; +  /* Functions */  extern void onenand_init(void);  extern int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, diff --git a/include/spi.h b/include/spi.h index 3a55a68c4..7744c2e36 100644 --- a/include/spi.h +++ b/include/spi.h @@ -31,22 +31,87 @@  #define	SPI_MODE_1	(0|SPI_CPHA)  #define	SPI_MODE_2	(SPI_CPOL|0)  #define	SPI_MODE_3	(SPI_CPOL|SPI_CPHA) -#define	SPI_CS_HIGH	0x04			/* chipselect active high? */ +#define	SPI_CS_HIGH	0x04			/* CS active high */  #define	SPI_LSB_FIRST	0x08			/* per-word bits-on-wire */  #define	SPI_3WIRE	0x10			/* SI/SO signals shared */  #define	SPI_LOOP	0x20			/* loopback mode */ -/* - * The function call pointer type used to drive the chip select. - */ -typedef void (*spi_chipsel_type)(int cs); +/* SPI transfer flags */ +#define SPI_XFER_BEGIN	0x01			/* Assert CS before transfer */ +#define SPI_XFER_END	0x02			/* Deassert CS after transfer */ +/*----------------------------------------------------------------------- + * Representation of a SPI slave, i.e. what we're communicating with. + * + * Drivers are expected to extend this with controller-specific data. + * + *   bus:	ID of the bus that the slave is attached to. + *   cs:	ID of the chip select connected to the slave. + */ +struct spi_slave { +	unsigned int	bus; +	unsigned int	cs; +};  /*-----------------------------------------------------------------------   * Initialization, must be called once on start up. + * + * TODO: I don't think we really need this.   */  void spi_init(void); +/*----------------------------------------------------------------------- + * Set up communications parameters for a SPI slave. + * + * This must be called once for each slave. Note that this function + * usually doesn't touch any actual hardware, it only initializes the + * contents of spi_slave so that the hardware can be easily + * initialized later. + * + *   bus:     Bus ID of the slave chip. + *   cs:      Chip select ID of the slave chip on the specified bus. + *   max_hz:  Maximum SCK rate in Hz. + *   mode:    Clock polarity, clock phase and other parameters. + * + * Returns: A spi_slave reference that can be used in subsequent SPI + * calls, or NULL if one or more of the parameters are not supported. + */ +struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs, +		unsigned int max_hz, unsigned int mode); + +/*----------------------------------------------------------------------- + * Free any memory associated with a SPI slave. + * + *   slave:	The SPI slave + */ +void spi_free_slave(struct spi_slave *slave); + +/*----------------------------------------------------------------------- + * Claim the bus and prepare it for communication with a given slave. + * + * This must be called before doing any transfers with a SPI slave. It + * will enable and initialize any SPI hardware as necessary, and make + * sure that the SCK line is in the correct idle state. It is not + * allowed to claim the same bus for several slaves without releasing + * the bus in between. + * + *   slave:	The SPI slave + * + * Returns: 0 if the bus was claimed successfully, or a negative value + * if it wasn't. + */ +int spi_claim_bus(struct spi_slave *slave); + +/*----------------------------------------------------------------------- + * Release the SPI bus + * + * This must be called once for every call to spi_claim_bus() after + * all transfers have finished. It may disable any SPI hardware as + * appropriate. + * + *   slave:	The SPI slave + */ +void spi_release_bus(struct spi_slave *slave);  /*-----------------------------------------------------------------------   * SPI transfer @@ -60,28 +125,67 @@ void spi_init(void);   * input data overwrites the output data (since both are buffered by   * temporary variables, this is OK).   * - * If the chipsel() function is not NULL, it is called with a parameter - * of '1' (chip select active) at the start of the transfer and again with - * a parameter of '0' at the end of the transfer. - * - * If the chipsel() function _is_ NULL, it the responsibility of the - * caller to make the appropriate chip select active before calling - * spi_xfer() and making it inactive after spi_xfer() returns. - *   * spi_xfer() interface: - *   chipsel: Routine to call to set/clear the chip select: - *              if chipsel is NULL, it is not used. - *              if(cs),  make the chip select active (typically '0'). - *              if(!cs), make the chip select inactive (typically '1'). - *   dout:    Pointer to a string of bits to send out.  The bits are - *              held in a byte array and are sent MSB first. - *   din:     Pointer to a string of bits that will be filled in. - *   bitlen:  How many bits to write and read. + *   slave:	The SPI slave which will be sending/receiving the data. + *   bitlen:	How many bits to write and read. + *   dout:	Pointer to a string of bits to send out.  The bits are + *		held in a byte array and are sent MSB first. + *   din:	Pointer to a string of bits that will be filled in. + *   flags:	A bitwise combination of SPI_XFER_* flags.   *   *   Returns: 0 on success, not 0 on failure   */ -int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din); +int  spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout, +		void *din, unsigned long flags); + +/*----------------------------------------------------------------------- + * Determine if a SPI chipselect is valid. + * This function is provided by the board if the low-level SPI driver + * needs it to determine if a given chipselect is actually valid. + * + * Returns: 1 if bus:cs identifies a valid chip on this board, 0 + * otherwise. + */ +int  spi_cs_is_valid(unsigned int bus, unsigned int cs); + +/*----------------------------------------------------------------------- + * Activate a SPI chipselect. + * This function is provided by the board code when using a driver + * that can't control its chipselects automatically (e.g. + * common/soft_spi.c). When called, it should activate the chip select + * to the device identified by "slave". + */ +void spi_cs_activate(struct spi_slave *slave); + +/*----------------------------------------------------------------------- + * Deactivate a SPI chipselect. + * This function is provided by the board code when using a driver + * that can't control its chipselects automatically (e.g. + * common/soft_spi.c). When called, it should deactivate the chip + * select to the device identified by "slave". + */ +void spi_cs_deactivate(struct spi_slave *slave); + +/*----------------------------------------------------------------------- + * Write 8 bits, then read 8 bits. + *   slave:	The SPI slave we're communicating with + *   byte:	Byte to be written + * + * Returns: The value that was read, or a negative value on error. + * + * TODO: This function probably shouldn't be inlined. + */ +static inline int spi_w8r8(struct spi_slave *slave, unsigned char byte) +{ +	unsigned char dout[2]; +	unsigned char din[2]; +	int ret; + +	dout[0] = byte; +	dout[1] = 0; -int spi_select(unsigned int bus, unsigned int dev, unsigned long mode); +	ret = spi_xfer(slave, 16, dout, din, SPI_XFER_BEGIN | SPI_XFER_END); +	return ret < 0 ? ret : din[1]; +}  #endif	/* _SPI_H_ */ diff --git a/include/spi_flash.h b/include/spi_flash.h new file mode 100644 index 000000000..de4f174ad --- /dev/null +++ b/include/spi_flash.h @@ -0,0 +1,70 @@ +/* + * Interface to SPI flash + * + * Copyright (C) 2008 Atmel Corporation + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * 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 _SPI_FLASH_H_ +#define _SPI_FLASH_H_ + +#include <spi.h> + +struct spi_flash_region { +	unsigned int	count; +	unsigned int	size; +}; + +struct spi_flash { +	struct spi_slave *spi; + +	const char	*name; + +	u32		size; + +	int		(*read)(struct spi_flash *flash, u32 offset, +				size_t len, void *buf); +	int		(*write)(struct spi_flash *flash, u32 offset, +				size_t len, const void *buf); +	int		(*erase)(struct spi_flash *flash, u32 offset, +				size_t len); +}; + +struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs, +		unsigned int max_hz, unsigned int spi_mode); +void spi_flash_free(struct spi_flash *flash); + +static inline int spi_flash_read(struct spi_flash *flash, u32 offset, +		size_t len, void *buf) +{ +	return flash->read(flash, offset, len, buf); +} + +static inline int spi_flash_write(struct spi_flash *flash, u32 offset, +		size_t len, const void *buf) +{ +	return flash->write(flash, offset, len, buf); +} + +static inline int spi_flash_erase(struct spi_flash *flash, u32 offset, +		size_t len) +{ +	return flash->erase(flash, offset, len); +} + +#endif /* _SPI_FLASH_H_ */ diff --git a/lib_arm/board.c b/lib_arm/board.c index 67506b35e..80b149b53 100644 --- a/lib_arm/board.c +++ b/lib_arm/board.c @@ -45,6 +45,8 @@  #include <version.h>  #include <net.h>  #include <serial.h> +#include <nand.h> +#include <onenand_uboot.h>  #ifdef CONFIG_DRIVER_SMC91111  #include "../drivers/net/smc91111.h" @@ -55,14 +57,6 @@  DECLARE_GLOBAL_DATA_PTR; -#if defined(CONFIG_CMD_NAND) -void nand_init (void); -#endif - -#if defined(CONFIG_CMD_ONENAND) -void onenand_init(void); -#endif -  ulong monitor_flash_len;  #ifdef CONFIG_HAS_DATAFLASH @@ -121,6 +115,20 @@ void *sbrk (ptrdiff_t increment)  	return ((void *) old);  } +char *strmhz(char *buf, long hz) +{ +	long l, n; +	long m; + +	n = hz / 1000000L; +	l = sprintf (buf, "%ld", n); +	m = (hz % 1000000L) / 1000L; +	if (m != 0) +		sprintf (buf + l, ".%03ld", m); +	return (buf); +} + +  /************************************************************************   * Coloured LED functionality   ************************************************************************ @@ -279,7 +287,7 @@ void start_armboot (void)  {  	init_fnc_t **init_fnc_ptr;  	char *s; -#ifndef CFG_NO_FLASH +#if !defined(CFG_NO_FLASH) || defined (CONFIG_VFD) || defined(CONFIG_LCD)  	ulong size;  #endif  #if defined(CONFIG_VFD) || defined(CONFIG_LCD) @@ -323,16 +331,19 @@ void start_armboot (void)  #endif /* CONFIG_VFD */  #ifdef CONFIG_LCD -#	ifndef PAGE_SIZE -#	  define PAGE_SIZE 4096 -#	endif -	/* -	 * reserve memory for LCD display (always full pages) -	 */ -	/* bss_end is defined in the board-specific linker script */ -	addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); -	size = lcd_setmem (addr); -	gd->fb_base = addr; +	/* board init may have inited fb_base */ +	if (!gd->fb_base) { +#		ifndef PAGE_SIZE +#		  define PAGE_SIZE 4096 +#		endif +		/* +		 * reserve memory for LCD display (always full pages) +		 */ +		/* bss_end is defined in the board-specific linker script */ +		addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); +		size = lcd_setmem (addr); +		gd->fb_base = addr; +	}  #endif /* CONFIG_LCD */  	/* armboot_start is defined in the board-specific linker script */ diff --git a/lib_avr32/memset.S b/lib_avr32/memset.S index dc3b09b42..79e3c675a 100644 --- a/lib_avr32/memset.S +++ b/lib_avr32/memset.S @@ -27,7 +27,7 @@  	 *  	 * Returns b in r12  	 */ -	.text +	.section .text.memset, "ax", @progbits  	.global	memset  	.type	memset, @function diff --git a/lib_mips/board.c b/lib_mips/board.c index 1645f2c7e..532550b60 100644 --- a/lib_mips/board.c +++ b/lib_mips/board.c @@ -28,6 +28,8 @@  #include <version.h>  #include <net.h>  #include <environment.h> +#include <nand.h> +#include <spi.h>  DECLARE_GLOBAL_DATA_PTR; @@ -416,6 +418,17 @@ void board_init_r (gd_t *id, ulong dest_addr)  	}  #endif +#ifdef CONFIG_CMD_NAND +	puts ("NAND:  "); +	nand_init ();		/* go init the NAND */ +#endif + +#ifdef CONFIG_CMD_SPI +	puts ("SPI:   "); +	spi_init ();		/* go init the SPI */ +	puts ("ready\n"); +#endif +  #if defined(CONFIG_MISC_INIT_R)  	/* miscellaneous platform dependent initialisations */  	misc_init_r (); diff --git a/lib_ppc/bat_rw.c b/lib_ppc/bat_rw.c index 912efa72b..854633386 100644 --- a/lib_ppc/bat_rw.c +++ b/lib_ppc/bat_rw.c @@ -29,46 +29,72 @@  int write_bat (ppc_bat_t bat, unsigned long upper, unsigned long lower)  {  	switch (bat) { +	case DBAT0: +		mtspr (DBAT0L, lower); +		mtspr (DBAT0U, upper); +		break;  	case IBAT0:  		mtspr (IBAT0L, lower);  		mtspr (IBAT0U, upper);  		break; - +	case DBAT1: +		mtspr (DBAT1L, lower); +		mtspr (DBAT1U, upper); +		break;  	case IBAT1:  		mtspr (IBAT1L, lower);  		mtspr (IBAT1U, upper);  		break; - +	case DBAT2: +		mtspr (DBAT2L, lower); +		mtspr (DBAT2U, upper); +		break;  	case IBAT2:  		mtspr (IBAT2L, lower);  		mtspr (IBAT2U, upper);  		break; - +	case DBAT3: +		mtspr (DBAT3L, lower); +		mtspr (DBAT3U, upper); +		break;  	case IBAT3:  		mtspr (IBAT3L, lower);  		mtspr (IBAT3U, upper);  		break; - -	case DBAT0: -		mtspr (DBAT0L, lower); -		mtspr (DBAT0U, upper); +#ifdef CONFIG_HIGH_BATS +	case DBAT4: +		mtspr (DBAT4L, lower); +		mtspr (DBAT4U, upper);  		break; - -	case DBAT1: -		mtspr (DBAT1L, lower); -		mtspr (DBAT1U, upper); +	case IBAT4: +		mtspr (IBAT4L, lower); +		mtspr (IBAT4U, upper);  		break; - -	case DBAT2: -		mtspr (DBAT2L, lower); -		mtspr (DBAT2U, upper); +	case DBAT5: +		mtspr (DBAT5L, lower); +		mtspr (DBAT5U, upper);  		break; - -	case DBAT3: -		mtspr (DBAT3L, lower); -		mtspr (DBAT3U, upper); +	case IBAT5: +		mtspr (IBAT5L, lower); +		mtspr (IBAT5U, upper);  		break; - +	case DBAT6: +		mtspr (DBAT6L, lower); +		mtspr (DBAT6U, upper); +		break; +	case IBAT6: +		mtspr (IBAT6L, lower); +		mtspr (IBAT6U, upper); +		break; +	case DBAT7: +		mtspr (DBAT7L, lower); +		mtspr (DBAT7U, upper); +		break; +	case IBAT7: +		mtspr (IBAT7L, lower); +		mtspr (IBAT7U, upper); +		break; +#endif  	default:  		return (-1);  	} @@ -82,46 +108,72 @@ int read_bat (ppc_bat_t bat, unsigned long *upper, unsigned long *lower)  	unsigned long register l;  	switch (bat) { +	case DBAT0: +		l = mfspr (DBAT0L); +		u = mfspr (DBAT0U); +		break;  	case IBAT0:  		l = mfspr (IBAT0L);  		u = mfspr (IBAT0U);  		break; - +	case DBAT1: +		l = mfspr (DBAT1L); +		u = mfspr (DBAT1U); +		break;  	case IBAT1:  		l = mfspr (IBAT1L);  		u = mfspr (IBAT1U);  		break; - +	case DBAT2: +		l = mfspr (DBAT2L); +		u = mfspr (DBAT2U); +		break;  	case IBAT2:  		l = mfspr (IBAT2L);  		u = mfspr (IBAT2U);  		break; - +	case DBAT3: +		l = mfspr (DBAT3L); +		u = mfspr (DBAT3U); +		break;  	case IBAT3:  		l = mfspr (IBAT3L);  		u = mfspr (IBAT3U);  		break; - -	case DBAT0: -		l = mfspr (DBAT0L); -		u = mfspr (DBAT0U); +#ifdef CONFIG_HIGH_BATS +	case DBAT4: +		l = mfspr (DBAT4L); +		u = mfspr (DBAT4U);  		break; - -	case DBAT1: -		l = mfspr (DBAT1L); -		u = mfspr (DBAT1U); +	case IBAT4: +		l = mfspr (IBAT4L); +		u = mfspr (IBAT4U);  		break; - -	case DBAT2: -		l = mfspr (DBAT2L); -		u = mfspr (DBAT2U); +	case DBAT5: +		l = mfspr (DBAT5L); +		u = mfspr (DBAT5U);  		break; - -	case DBAT3: -		l = mfspr (DBAT3L); -		u = mfspr (DBAT3U); +	case IBAT5: +		l = mfspr (IBAT5L); +		u = mfspr (IBAT5U);  		break; - +	case DBAT6: +		l = mfspr (DBAT6L); +		u = mfspr (DBAT6U); +		break; +	case IBAT6: +		l = mfspr (IBAT6L); +		u = mfspr (IBAT6U); +		break; +	case DBAT7: +		l = mfspr (DBAT7L); +		u = mfspr (DBAT7U); +		break; +	case IBAT7: +		l = mfspr (IBAT7L); +		u = mfspr (IBAT7U); +		break; +#endif  	default:  		return (-1);  	} @@ -131,3 +183,44 @@ int read_bat (ppc_bat_t bat, unsigned long *upper, unsigned long *lower)  	return (0);  } + +void print_bats(void) +{ +	printf("BAT registers:\n"); + +	printf ("\tIBAT0L = 0x%08X ", mfspr (IBAT0L)); +	printf ("\tIBAT0U = 0x%08X\n", mfspr (IBAT0U)); +	printf ("\tDBAT0L = 0x%08X ", mfspr (DBAT0L)); +	printf ("\tDBAT0U = 0x%08X\n", mfspr (DBAT0U)); +	printf ("\tIBAT1L = 0x%08X ", mfspr (IBAT1L)); +	printf ("\tIBAT1U = 0x%08X\n", mfspr (IBAT1U)); +	printf ("\tDBAT1L = 0x%08X ", mfspr (DBAT1L)); +	printf ("\tDBAT1U = 0x%08X\n", mfspr (DBAT1U)); +	printf ("\tIBAT2L = 0x%08X ", mfspr (IBAT2L)); +	printf ("\tIBAT2U = 0x%08X\n", mfspr (IBAT2U)); +	printf ("\tDBAT2L = 0x%08X ", mfspr (DBAT2L)); +	printf ("\tDBAT2U = 0x%08X\n", mfspr (DBAT2U)); +	printf ("\tIBAT3L = 0x%08X ", mfspr (IBAT3L)); +	printf ("\tIBAT3U = 0x%08X\n", mfspr (IBAT3U)); +	printf ("\tDBAT3L = 0x%08X ", mfspr (DBAT3L)); +	printf ("\tDBAT3U = 0x%08X\n", mfspr (DBAT3U)); + +#ifdef CONFIG_HIGH_BATS +	printf ("\tIBAT4L = 0x%08X ", mfspr (IBAT4L)); +	printf ("\tIBAT4U = 0x%08X\n", mfspr (IBAT4U)); +	printf ("\tDBAT4L = 0x%08X ", mfspr (DBAT4L)); +	printf ("\tDBAT4U = 0x%08X\n", mfspr (DBAT4U)); +	printf ("\tIBAT5L = 0x%08X ", mfspr (IBAT5L)); +	printf ("\tIBAT5U = 0x%08X\n", mfspr (IBAT5U)); +	printf ("\tDBAT5L = 0x%08X ", mfspr (DBAT5L)); +	printf ("\tDBAT5U = 0x%08X\n", mfspr (DBAT5U)); +	printf ("\tIBAT6L = 0x%08X ", mfspr (IBAT6L)); +	printf ("\tIBAT6U = 0x%08X\n", mfspr (IBAT6U)); +	printf ("\tDBAT6L = 0x%08X ", mfspr (DBAT6L)); +	printf ("\tDBAT6U = 0x%08X\n", mfspr (DBAT6U)); +	printf ("\tIBAT7L = 0x%08X ", mfspr (IBAT7L)); +	printf ("\tIBAT7U = 0x%08X\n", mfspr (IBAT7U)); +	printf ("\tDBAT7L = 0x%08X ", mfspr (DBAT7L)); +	printf ("\tDBAT7U = 0x%08X\n", mfspr (DBAT7U)); +#endif +} diff --git a/lib_ppc/board.c b/lib_ppc/board.c index 4956403cc..a90883162 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -93,9 +93,7 @@ void doc_init (void);  #if defined(CONFIG_HARD_SPI)  #include <spi.h>  #endif -#if defined(CONFIG_CMD_NAND) -void nand_init (void); -#endif +#include <nand.h>  static char *failed = "*** failed ***\n"; @@ -398,6 +396,13 @@ ulong get_effective_memsize(void)   ************************************************************************   */ +#ifdef CONFIG_LOGBUFFER +unsigned long logbuffer_base(void) +{ +	return CFG_SDRAM_BASE + get_effective_memsize() - LOGBUFF_LEN; +} +#endif +  void board_init_f (ulong bootflag)  {  	bd_t *bd; diff --git a/lib_sh/board.c b/lib_sh/board.c index 883c381e6..807415c54 100644 --- a/lib_sh/board.c +++ b/lib_sh/board.c @@ -76,7 +76,7 @@ static int sh_flash_init(void)  }  #if defined(CONFIG_CMD_NAND) -void nand_init (void); +#include <nand.h>  static int sh_nand_init(void)  {  	printf("NAND: "); @@ -288,7 +288,8 @@ int eth_initialize(bd_t *bis)  #if defined(CONFIG_FSLDMAFEC)  	mcdmafec_initialize(bis);  #endif -#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) +#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ +    defined(CONFIG_AT91SAM9263)  	at91sam9_eth_initialize(bis);  #endif diff --git a/post/board/lwmon5/fpga.c b/post/board/lwmon5/fpga.c index b48390ba9..ef641d789 100644 --- a/post/board/lwmon5/fpga.c +++ b/post/board/lwmon5/fpga.c @@ -41,6 +41,15 @@ DECLARE_GLOBAL_DATA_PTR;  #if CONFIG_POST & CFG_POST_BSPEC3 +/* Testpattern for fpga memorytest */ +static uint pattern[] = { +	0x55555555, +	0xAAAAAAAA, +	0xAA5555AA, +	0x55AAAA55, +	0x0 +}; +  static int one_scratch_test(uint value)  {  	uint read_value; @@ -60,9 +69,42 @@ static int one_scratch_test(uint value)  	return ret;  } +/* FPGA Memory-pattern-test */ +static int fpga_mem_test(void * address) +{ +	int ret = 1; +	uint read_value; +	uint old_value; +	uint i = 0; +	/* save content */ +	old_value = in_be32(address); + +	while (pattern[i] != 0) { +		out_be32(address, pattern[i]); +		/* read other location (protect against data lines capacity) */ +		ret = in_be16((void *)FPGA_VERSION_REG); +		/* verify test pattern */ +		read_value = in_be32(address); + +		if (read_value != pattern[i]) { +			post_log("FPGA Memory test failed."); +			post_log(" write %08X, read %08X at address %08X\n", +				pattern[i], read_value, address); +			ret = 1; +			goto out; +		} +		i++; +	} + +	ret = 0; +out: +	out_be32(address, old_value); +	return ret; +}  /* Verify FPGA, get version & memory size */  int fpga_post_test(int flags)  { +	uint   address;  	uint   old_value;  	ushort version;  	uint   read_value; @@ -88,6 +130,14 @@ int fpga_post_test(int flags)  	read_value = get_ram_size((void *)CFG_FPGA_BASE_1, 0x4000);  	post_log("FPGA RAM size: %d bytes\n", read_value); +	for (address = 0; address < 0x1000; address++) { +		if (fpga_mem_test((void *)(FPGA_RAM_START + 4*address)) == 1) { +			ret = 1; +			goto out; +		} +	} + +out:  	return ret;  } diff --git a/tools/Makefile b/tools/Makefile index 5285055dc..8533a8e5c 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -44,6 +44,10 @@ LOGO_H	= $(OBJTREE)/include/bmp_logo.h  ifeq ($(LOGO_BMP),)  LOGO_BMP= logos/denx.bmp  endif +ifeq ($(VENDOR),atmel) +LOGO_BMP= logos/atmel.bmp +endif +  #------------------------------------------------------------------------- diff --git a/tools/logos/atmel.bmp b/tools/logos/atmel.bmpBinary files differ new file mode 100644 index 000000000..3c445c9bc --- /dev/null +++ b/tools/logos/atmel.bmp |