diff options
Diffstat (limited to 'arch/arm/cpu/arm926ejs')
30 files changed, 691 insertions, 455 deletions
| diff --git a/arch/arm/cpu/arm926ejs/at91/Makefile b/arch/arm/cpu/arm926ejs/at91/Makefile index f333753c7..346e58fae 100644 --- a/arch/arm/cpu/arm926ejs/at91/Makefile +++ b/arch/arm/cpu/arm926ejs/at91/Makefile @@ -35,6 +35,7 @@ COBJS-$(CONFIG_AT91SAM9263)	+= at91sam9263_devices.o  COBJS-$(CONFIG_AT91SAM9RL)	+= at91sam9rl_devices.o  COBJS-$(CONFIG_AT91SAM9M10G45)	+= at91sam9m10g45_devices.o  COBJS-$(CONFIG_AT91SAM9G45)	+= at91sam9m10g45_devices.o +COBJS-$(CONFIG_AT91SAM9X5)	+= at91sam9x5_devices.o  COBJS-$(CONFIG_AT91_EFLASH)	+= eflash.o  COBJS-$(CONFIG_AT91_LED)	+= led.o  COBJS-y += clock.o diff --git a/arch/arm/cpu/arm926ejs/at91/at91sam9260_devices.c b/arch/arm/cpu/arm926ejs/at91/at91sam9260_devices.c index 62f76fa8e..19ec615c7 100644 --- a/arch/arm/cpu/arm926ejs/at91/at91sam9260_devices.c +++ b/arch/arm/cpu/arm926ejs/at91/at91sam9260_devices.c @@ -158,6 +158,10 @@ void at91_spi1_hw_init(unsigned long cs_mask)  #ifdef CONFIG_MACB  void at91_macb_hw_init(void)  { +	/* Enable EMAC clock */ +	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC; +	writel(1 << ATMEL_ID_EMAC0, &pmc->pcer); +  	at91_set_a_periph(AT91_PIO_PORTA, 19, 0);	/* ETXCK_EREFCK */  	at91_set_a_periph(AT91_PIO_PORTA, 17, 0);	/* ERXDV */  	at91_set_a_periph(AT91_PIO_PORTA, 14, 0);	/* ERX0 */ diff --git a/arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c b/arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c new file mode 100644 index 000000000..6d77219d0 --- /dev/null +++ b/arch/arm/cpu/arm926ejs/at91/at91sam9x5_devices.c @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2012 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/arch/at91_common.h> +#include <asm/arch/at91_pmc.h> +#include <asm/arch/gpio.h> +#include <asm/io.h> + +unsigned int get_chip_id(void) +{ +	/* The 0x40 is the offset of cidr in DBGU */ +	return readl(ATMEL_BASE_DBGU + 0x40) & ~ARCH_ID_VERSION_MASK; +} + +unsigned int get_extension_chip_id(void) +{ +	/* The 0x44 is the offset of exid in DBGU */ +	return readl(ATMEL_BASE_DBGU + 0x44); +} + +unsigned int has_emac1() +{ +	return cpu_is_at91sam9x25(); +} + +unsigned int has_emac0() +{ +	return !(cpu_is_at91sam9g15()); +} + +unsigned int has_lcdc() +{ +	return cpu_is_at91sam9g15() || cpu_is_at91sam9g35() +		|| cpu_is_at91sam9x35(); +} + +char *get_cpu_name() +{ +	unsigned int extension_id = get_extension_chip_id(); + +	if (cpu_is_at91sam9x5()) { +		switch (extension_id) { +		case ARCH_EXID_AT91SAM9G15: +			return CONFIG_SYS_AT91_G15_CPU_NAME; +		case ARCH_EXID_AT91SAM9G25: +			return CONFIG_SYS_AT91_G25_CPU_NAME; +		case ARCH_EXID_AT91SAM9G35: +			return CONFIG_SYS_AT91_G35_CPU_NAME; +		case ARCH_EXID_AT91SAM9X25: +			return CONFIG_SYS_AT91_X25_CPU_NAME; +		case ARCH_EXID_AT91SAM9X35: +			return CONFIG_SYS_AT91_X35_CPU_NAME; +		default: +			return CONFIG_SYS_AT91_UNKNOWN_CPU; +		} +	} else { +		return CONFIG_SYS_AT91_UNKNOWN_CPU; +	} +} + +void at91_seriald_hw_init(void) +{ +	at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC; + +	at91_set_a_periph(AT91_PIO_PORTA, 9, 0);	/* DRXD */ +	at91_set_a_periph(AT91_PIO_PORTA, 10, 1);	/* DTXD */ + +	writel(1 << ATMEL_ID_SYS, &pmc->pcer); +} + +void at91_serial0_hw_init(void) +{ +	at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC; + +	at91_set_a_periph(AT91_PIO_PORTA, 0, 1);	/* TXD */ +	at91_set_a_periph(AT91_PIO_PORTA, 1, 0);	/* RXD */ + +	writel(1 << ATMEL_ID_USART0, &pmc->pcer); +} + +void at91_serial1_hw_init(void) +{ +	at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC; + +	at91_set_a_periph(AT91_PIO_PORTA, 5, 1);	/* TXD */ +	at91_set_a_periph(AT91_PIO_PORTA, 6, 0);	/* RXD */ + +	writel(1 << ATMEL_ID_USART1, &pmc->pcer); +} + +void at91_serial2_hw_init(void) +{ +	at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC; + +	at91_set_a_periph(AT91_PIO_PORTA, 7, 1);	/* TXD */ +	at91_set_a_periph(AT91_PIO_PORTA, 8, 0);	/* RXD */ + +	writel(1 << ATMEL_ID_USART2, &pmc->pcer); +} + +#ifdef CONFIG_ATMEL_SPI +void at91_spi0_hw_init(unsigned long cs_mask) +{ +	at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC; + +	at91_set_a_periph(AT91_PIO_PORTA, 11, 0);	/* SPI0_MISO */ +	at91_set_a_periph(AT91_PIO_PORTA, 12, 0);	/* SPI0_MOSI */ +	at91_set_a_periph(AT91_PIO_PORTA, 13, 0);	/* SPI0_SPCK */ + +	/* Enable clock */ +	writel(1 << ATMEL_ID_SPI0, &pmc->pcer); + +	if (cs_mask & (1 << 0)) +		at91_set_a_periph(AT91_PIO_PORTA, 14, 0); +	if (cs_mask & (1 << 1)) +		at91_set_b_periph(AT91_PIO_PORTA, 7, 0); +	if (cs_mask & (1 << 2)) +		at91_set_b_periph(AT91_PIO_PORTA, 1, 0); +	if (cs_mask & (1 << 3)) +		at91_set_b_periph(AT91_PIO_PORTB, 3, 0); +	if (cs_mask & (1 << 4)) +		at91_set_pio_output(AT91_PIO_PORTA, 14, 0); +	if (cs_mask & (1 << 5)) +		at91_set_pio_output(AT91_PIO_PORTA, 7, 0); +	if (cs_mask & (1 << 6)) +		at91_set_pio_output(AT91_PIO_PORTA, 1, 0); +	if (cs_mask & (1 << 7)) +		at91_set_pio_output(AT91_PIO_PORTB, 3, 0); +} + +void at91_spi1_hw_init(unsigned long cs_mask) +{ +	at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC; + +	at91_set_b_periph(AT91_PIO_PORTA, 21, 0);	/* SPI1_MISO */ +	at91_set_b_periph(AT91_PIO_PORTA, 22, 0);	/* SPI1_MOSI */ +	at91_set_b_periph(AT91_PIO_PORTA, 23, 0);	/* SPI1_SPCK */ + +	/* Enable clock */ +	writel(1 << ATMEL_ID_SPI1, &pmc->pcer); + +	if (cs_mask & (1 << 0)) +		at91_set_b_periph(AT91_PIO_PORTA, 8, 0); +	if (cs_mask & (1 << 1)) +		at91_set_b_periph(AT91_PIO_PORTA, 0, 0); +	if (cs_mask & (1 << 2)) +		at91_set_b_periph(AT91_PIO_PORTA, 31, 0); +	if (cs_mask & (1 << 3)) +		at91_set_b_periph(AT91_PIO_PORTA, 30, 0); +	if (cs_mask & (1 << 4)) +		at91_set_pio_output(AT91_PIO_PORTA, 8, 0); +	if (cs_mask & (1 << 5)) +		at91_set_pio_output(AT91_PIO_PORTA, 0, 0); +	if (cs_mask & (1 << 6)) +		at91_set_pio_output(AT91_PIO_PORTA, 31, 0); +	if (cs_mask & (1 << 7)) +		at91_set_pio_output(AT91_PIO_PORTA, 30, 0); +} +#endif + +#ifdef CONFIG_MACB +void at91_macb_hw_init(void) +{ +	at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC; + +	if (has_emac0()) { +		/* Enable EMAC0 clock */ +		writel(1 << ATMEL_ID_EMAC0, &pmc->pcer); +		/* EMAC0 pins setup */ +		at91_set_a_periph(AT91_PIO_PORTB, 4, 0);	/* ETXCK */ +		at91_set_a_periph(AT91_PIO_PORTB, 3, 0);	/* ERXDV */ +		at91_set_a_periph(AT91_PIO_PORTB, 0, 0);	/* ERX0 */ +		at91_set_a_periph(AT91_PIO_PORTB, 1, 0);	/* ERX1 */ +		at91_set_a_periph(AT91_PIO_PORTB, 2, 0);	/* ERXER */ +		at91_set_a_periph(AT91_PIO_PORTB, 7, 0);	/* ETXEN */ +		at91_set_a_periph(AT91_PIO_PORTB, 9, 0);	/* ETX0 */ +		at91_set_a_periph(AT91_PIO_PORTB, 10, 0);	/* ETX1 */ +		at91_set_a_periph(AT91_PIO_PORTB, 5, 0);	/* EMDIO */ +		at91_set_a_periph(AT91_PIO_PORTB, 6, 0);	/* EMDC */ +	} + +	if (has_emac1()) { +		/* Enable EMAC1 clock */ +		writel(1 << ATMEL_ID_EMAC1, &pmc->pcer); +		/* EMAC1 pins setup */ +		at91_set_b_periph(AT91_PIO_PORTC, 29, 0);	/* ETXCK */ +		at91_set_b_periph(AT91_PIO_PORTC, 28, 0);	/* ECRSDV */ +		at91_set_b_periph(AT91_PIO_PORTC, 20, 0);	/* ERXO */ +		at91_set_b_periph(AT91_PIO_PORTC, 21, 0);	/* ERX1 */ +		at91_set_b_periph(AT91_PIO_PORTC, 16, 0);	/* ERXER */ +		at91_set_b_periph(AT91_PIO_PORTC, 27, 0);	/* ETXEN */ +		at91_set_b_periph(AT91_PIO_PORTC, 18, 0);	/* ETX0 */ +		at91_set_b_periph(AT91_PIO_PORTC, 19, 0);	/* ETX1 */ +		at91_set_b_periph(AT91_PIO_PORTC, 31, 0);	/* EMDIO */ +		at91_set_b_periph(AT91_PIO_PORTC, 30, 0);	/* EMDC */ +	} + +#ifndef CONFIG_RMII +	/* Only emac0 support MII */ +	if (has_emac0()) { +		at91_set_b_periph(AT91_PIO_PORTB, 16, 0);	/* ECRS */ +		at91_set_b_periph(AT91_PIO_PORTB, 17, 0);	/* ECOL */ +		at91_set_b_periph(AT91_PIO_PORTB, 13, 0);	/* ERX2 */ +		at91_set_b_periph(AT91_PIO_PORTB, 14, 0);	/* ERX3 */ +		at91_set_b_periph(AT91_PIO_PORTB, 15, 0);	/* ERXCK */ +		at91_set_b_periph(AT91_PIO_PORTB, 11, 0);	/* ETX2 */ +		at91_set_b_periph(AT91_PIO_PORTB, 12, 0);	/* ETX3 */ +		at91_set_b_periph(AT91_PIO_PORTB, 8, 0);	/* ETXER */ +	} +#endif +} +#endif diff --git a/arch/arm/cpu/arm926ejs/at91/clock.c b/arch/arm/cpu/arm926ejs/at91/clock.c index a7085deac..dc5c6c4b0 100644 --- a/arch/arm/cpu/arm926ejs/at91/clock.c +++ b/arch/arm/cpu/arm926ejs/at91/clock.c @@ -154,7 +154,8 @@ int at91_clock_init(unsigned long main_clock)  	 * For now, assume this parentage won't change.  	 */  	mckr = readl(&pmc->mckr); -#if defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) +#if defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) \ +		|| defined(CONFIG_AT91SAM9X5)  	/* plla divisor by 2 */  	gd->plla_rate_hz /= (1 << ((mckr & 1 << 12) >> 12));  #endif @@ -168,7 +169,14 @@ int at91_clock_init(unsigned long main_clock)  		freq / ((mckr & AT91_PMC_MCKR_MDIV_MASK) >> 7) : freq;  	if (mckr & AT91_PMC_MCKR_MDIV_MASK)  		freq /= 2;			/* processor clock division */ -#elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) +#elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) \ +		|| defined(CONFIG_AT91SAM9X5) +	/* mdiv <==> divisor +	 *  0   <==>   1 +	 *  1   <==>   2 +	 *  2   <==>   4 +	 *  3   <==>   3 +	 */  	gd->mck_rate_hz = (mckr & AT91_PMC_MCKR_MDIV_MASK) ==  		(AT91_PMC_MCKR_MDIV_2 | AT91_PMC_MCKR_MDIV_4)  		? freq / 3 diff --git a/arch/arm/cpu/arm926ejs/at91/cpu.c b/arch/arm/cpu/arm926ejs/at91/cpu.c index c47fb31e9..5cf4fad0b 100644 --- a/arch/arm/cpu/arm926ejs/at91/cpu.c +++ b/arch/arm/cpu/arm926ejs/at91/cpu.c @@ -71,29 +71,3 @@ int print_cpuinfo(void)  	return 0;  }  #endif - -#ifdef CONFIG_BOOTCOUNT_LIMIT -/* - * We combine the BOOTCOUNT_MAGIC and bootcount in one 32-bit register. - * This is done so we need to use only one of the four GPBR registers. - */ -void bootcount_store (ulong a) -{ -	at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; - -	writel((BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff), -		&gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); -} - -ulong bootcount_load (void) -{ -	at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; - -	ulong val = readl(&gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); -	if ((val & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) -		return 0; -	else -		return val & 0x0000ffff; -} - -#endif /* CONFIG_BOOTCOUNT_LIMIT */ diff --git a/arch/arm/cpu/arm926ejs/davinci/Makefile b/arch/arm/cpu/arm926ejs/davinci/Makefile index da7efac08..c91928e71 100644 --- a/arch/arm/cpu/arm926ejs/davinci/Makefile +++ b/arch/arm/cpu/arm926ejs/davinci/Makefile @@ -27,7 +27,7 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(SOC).o -COBJS-y				+= cpu.o misc.o timer.o psc.o pinmux.o +COBJS-y				+= cpu.o misc.o timer.o psc.o pinmux.o reset.o  COBJS-$(CONFIG_DA850_LOWLEVEL)	+= da850_lowlevel.o  COBJS-$(CONFIG_SOC_DM355)	+= dm355.o  COBJS-$(CONFIG_SOC_DM365)	+= dm365.o @@ -42,8 +42,6 @@ COBJS-$(CONFIG_SOC_DM365)	+= dm365_lowlevel.o  COBJS-$(CONFIG_SOC_DA8XX)	+= da850_lowlevel.o  endif -SOBJS	= reset.o -  ifndef CONFIG_SKIP_LOWLEVEL_INIT  SOBJS	+= lowlevel_init.o  endif diff --git a/arch/arm/cpu/arm926ejs/davinci/cpu.c b/arch/arm/cpu/arm926ejs/davinci/cpu.c index 6cb857aef..b31add8de 100644 --- a/arch/arm/cpu/arm926ejs/davinci/cpu.c +++ b/arch/arm/cpu/arm926ejs/davinci/cpu.c @@ -117,6 +117,17 @@ int clk_get(enum davinci_clk_ids id)  out:  	return pll_out;  } + +int set_cpu_clk_info(void) +{ +	gd->bd->bi_arm_freq = clk_get(DAVINCI_ARM_CLKID) / 1000000; +	/* DDR PHY uses an x2 input clock */ +	gd->bd->bi_ddr_freq = cpu_is_da830() ? 0 : +				(clk_get(DAVINCI_DDR_CLKID) / 1000000); +	gd->bd->bi_dsp_freq = 0; +	return 0; +} +  #else /* CONFIG_SOC_DA8XX */  static unsigned pll_div(volatile void *pllbase, unsigned offset) @@ -187,16 +198,9 @@ unsigned int davinci_clk_get(unsigned int div)  	return pll_sysclk_mhz(DAVINCI_PLL_CNTRL0_BASE, div) * 1000000;  }  #endif -#endif /* !CONFIG_SOC_DA8XX */  int set_cpu_clk_info(void)  { -#ifdef CONFIG_SOC_DA8XX -	gd->bd->bi_arm_freq = clk_get(DAVINCI_ARM_CLKID) / 1000000; -	/* DDR PHY uses an x2 input clock */ -	gd->bd->bi_ddr_freq = clk_get(0x10001) / 1000000; -#else -  	unsigned int pllbase = DAVINCI_PLL_CNTRL0_BASE;  #if defined(CONFIG_SOC_DM365)  	pllbase = DAVINCI_PLL_CNTRL1_BASE; @@ -215,10 +219,12 @@ int set_cpu_clk_info(void)  	pllbase = DAVINCI_PLL_CNTRL0_BASE;  #endif  	gd->bd->bi_ddr_freq = pll_sysclk_mhz(pllbase, DDR_PLLDIV) / 2; -#endif +  	return 0;  } +#endif /* !CONFIG_SOC_DA8XX */ +  /*   * Initializes on-chip ethernet controllers.   * to override, implement board_eth_init() diff --git a/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c b/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c index df7d6a24b..ff2e2e33d 100644 --- a/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c +++ b/arch/arm/cpu/arm926ejs/davinci/da850_lowlevel.c @@ -190,13 +190,21 @@ int da850_ddr_setup(void)  		setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_LOCK);  		setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_POWERDWN); - -		setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_IOPWRDWN);  	} - +	setbits_le32(&davinci_syscfg1_regs->vtpio_ctl, VTP_IOPWRDWN);  	writel(CONFIG_SYS_DA850_DDR2_DDRPHYCR, &dv_ddr2_regs_ctrl->ddrphycr); -	clrbits_le32(&davinci_syscfg1_regs->ddr_slew, -		(1 << DDR_SLEW_CMOSEN_BIT)); + +	if (CONFIG_SYS_DA850_DDR2_SDBCR & (1 << DV_DDR_SDCR_DDR2EN_SHIFT)) { +		/* DDR2 */ +		clrbits_le32(&davinci_syscfg1_regs->ddr_slew, +			(1 << DDR_SLEW_DDR_PDENA_BIT) | +			(1 << DDR_SLEW_CMOSEN_BIT)); +	} else { +		/* MOBILE DDR */ +		setbits_le32(&davinci_syscfg1_regs->ddr_slew, +			(1 << DDR_SLEW_DDR_PDENA_BIT) | +			(1 << DDR_SLEW_CMOSEN_BIT)); +	}  	/*  	 * SDRAM Configuration Register (SDCR): @@ -216,7 +224,11 @@ int da850_ddr_setup(void)  	writel(tmp, &dv_ddr2_regs_ctrl->sdbcr);  	/* write memory configuration and timing */ -	writel(CONFIG_SYS_DA850_DDR2_SDBCR2, &dv_ddr2_regs_ctrl->sdbcr2); +	if (!(CONFIG_SYS_DA850_DDR2_SDBCR & (1 << DV_DDR_SDCR_DDR2EN_SHIFT))) { +		/* MOBILE DDR only*/ +		writel(CONFIG_SYS_DA850_DDR2_SDBCR2, +			&dv_ddr2_regs_ctrl->sdbcr2); +	}  	writel(CONFIG_SYS_DA850_DDR2_SDTIMR, &dv_ddr2_regs_ctrl->sdtimr);  	writel(CONFIG_SYS_DA850_DDR2_SDTIMR2, &dv_ddr2_regs_ctrl->sdtimr2); @@ -240,7 +252,7 @@ int da850_ddr_setup(void)  	/* disable self refresh */  	clrbits_le32(&dv_ddr2_regs_ctrl->sdrcr, -		DV_DDR_SDRCR_LPMODEN | DV_DDR_SDRCR_LPMODEN); +		DV_DDR_SDRCR_LPMODEN | DV_DDR_SDRCR_MCLKSTOPEN);  	writel(CONFIG_SYS_DA850_DDR2_PBBPR, &dv_ddr2_regs_ctrl->pbbpr);  	return 0; diff --git a/arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c b/arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c index fa07fb591..133265e5b 100644 --- a/arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c +++ b/arch/arm/cpu/arm926ejs/davinci/da850_pinmux.c @@ -35,6 +35,11 @@ const struct pinmux_config spi1_pins_scs0[] = {  };  /* UART pin muxer settings */ +const struct pinmux_config uart0_pins_txrx[] = { +	{ pinmux(3), 2, 4 }, /* UART0_RXD */ +	{ pinmux(3), 2, 5 }, /* UART0_TXD */ +}; +  const struct pinmux_config uart1_pins_txrx[] = {  	{ pinmux(4), 2, 6 }, /* UART1_RXD */  	{ pinmux(4), 2, 7 }, /* UART1_TXD */ @@ -169,3 +174,14 @@ const struct pinmux_config emifa_pins_nor[] = {  	{ pinmux(12), 1, 6 }, /* EMA_A[1] */  	{ pinmux(12), 1, 7 }, /* EMA_A[0] */  }; + +/* MMC0 pin muxer settings */ +const struct pinmux_config mmc0_pins[] = { +	{ pinmux(10), 2, 0 },	/* MMCSD0_CLK */ +	{ pinmux(10), 2, 1 },	/* MMCSD0_CMD */ +	{ pinmux(10), 2, 2 },	/* MMCSD0_DAT_0 */ +	{ pinmux(10), 2, 3 },	/* MMCSD0_DAT_1 */ +	{ pinmux(10), 2, 4 },	/* MMCSD0_DAT_2 */ +	{ pinmux(10), 2, 5 },	/* MMCSD0_DAT_3 */ +	/* DA850 supports only 4-bit mode, remaining pins are not configured */ +}; diff --git a/arch/arm/cpu/arm926ejs/davinci/psc.c b/arch/arm/cpu/arm926ejs/davinci/psc.c index 3e925181e..2ffb42abc 100644 --- a/arch/arm/cpu/arm926ejs/davinci/psc.c +++ b/arch/arm/cpu/arm926ejs/davinci/psc.c @@ -128,6 +128,11 @@ void lpsc_syncreset(unsigned int id)  	lpsc_transition(id, 0x01);  } +void lpsc_disable(unsigned int id) +{ +	lpsc_transition(id, 0x0); +} +  /* Not all DaVinci chips have a DSP power domain. */  #ifdef CONFIG_SOC_DM644X diff --git a/arch/arm/cpu/arm926ejs/davinci/reset.S b/arch/arm/cpu/arm926ejs/davinci/reset.S deleted file mode 100644 index ba0a7c3b4..000000000 --- a/arch/arm/cpu/arm926ejs/davinci/reset.S +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Processor reset using WDT for TI TMS320DM644x SoC. - * - * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> - * - * ----------------------------------------------------- - * - * 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 - */ - -.globl reset_cpu -reset_cpu: -	ldr	r0, WDT_TGCR -	mov	r1, $0x08 -	str	r1, [r0] -	ldr	r1, [r0] -	orr	r1, r1, $0x03 -	str	r1, [r0] -	mov	r1, $0 -	ldr	r0, WDT_TIM12 -	str	r1, [r0] -	ldr	r0, WDT_TIM34 -	str	r1, [r0] -	ldr	r0, WDT_PRD12 -	str	r1, [r0] -	ldr	r0, WDT_PRD34 -	str	r1, [r0] -	ldr	r0, WDT_TCR -	ldr	r1, [r0] -	orr	r1, r1, $0x40 -	str	r1, [r0] -	ldr	r0, WDT_WDTCR -	ldr	r1, [r0] -	orr	r1, r1, $0x4000 -	str	r1, [r0] -	ldr	r1, WDTCR_VAL1 -	str	r1, [r0] -	ldr	r1, WDTCR_VAL2 -	str	r1, [r0] -	/* Write an invalid value to the WDKEY field to trigger -	 * an immediate watchdog reset */ -	mov     r1, $0x4000 -	str     r1, [r0] -	nop -	nop -	nop -	nop -reset_cpu_loop: -	b	reset_cpu_loop - -WDT_TGCR: -	.word	0x01c21c24 -WDT_TIM12: -	.word	0x01c21c10 -WDT_TIM34: -	.word	0x01c21c14 -WDT_PRD12: -	.word	0x01c21c18 -WDT_PRD34: -	.word	0x01c21c1c -WDT_TCR: -	.word	0x01c21c20 -WDT_WDTCR: -	.word	0x01c21c28 -WDTCR_VAL1: -	.word	0xa5c64000 -WDTCR_VAL2: -	.word	0xda7e4000 diff --git a/arch/arm/cpu/arm926ejs/davinci/reset.c b/arch/arm/cpu/arm926ejs/davinci/reset.c new file mode 100644 index 000000000..968fb035c --- /dev/null +++ b/arch/arm/cpu/arm926ejs/davinci/reset.c @@ -0,0 +1,33 @@ +/* + *  Processor reset using WDT. + * + * Copyright (C) 2012 Dmitry Bondar <bond@inmys.ru> + * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net> + * + * This file is released under the terms of GPL v2 and any later version. + * See the file COPYING in the root directory of the source tree for details. +*/ + +#include <common.h> +#include <asm/io.h> +#include <asm/arch/timer_defs.h> +#include <asm/arch/hardware.h> + +void reset_cpu(unsigned long a) +{ +	struct davinci_timer *const wdttimer = +		(struct davinci_timer *)DAVINCI_TIMER1_BASE; +	writel(0x08, &wdttimer->tgcr); +	writel(readl(&wdttimer->tgcr) | 0x03, &wdttimer->tgcr); +	writel(0, &wdttimer->tim12); +	writel(0, &wdttimer->tim34); +	writel(0, &wdttimer->prd12); +	writel(0, &wdttimer->prd34); +	writel(readl(&wdttimer->tcr) | 0x40, &wdttimer->tcr); +	writel(readl(&wdttimer->wdtcr) | 0x4000, &wdttimer->wdtcr); +	writel(0xa5c64000, &wdttimer->wdtcr); +	writel(0xda7e4000, &wdttimer->wdtcr); +	writel(0x4000, &wdttimer->wdtcr); +	while (1) +		/*nothing*/; +} diff --git a/arch/arm/cpu/arm926ejs/davinci/spl.c b/arch/arm/cpu/arm926ejs/davinci/spl.c index 74632e516..03c85c87f 100644 --- a/arch/arm/cpu/arm926ejs/davinci/spl.c +++ b/arch/arm/cpu/arm926ejs/davinci/spl.c @@ -28,6 +28,7 @@  #include <ns16550.h>  #include <malloc.h>  #include <spi_flash.h> +#include <mmc.h>  #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT @@ -74,12 +75,7 @@ void board_init_f(ulong dummy)  void board_init_r(gd_t *id, ulong dummy)  { -#ifdef CONFIG_SPL_NAND_LOAD -	nand_init(); -	puts("Nand boot...\n"); -	nand_boot(); -#endif -#ifdef CONFIG_SPL_SPI_LOAD +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT  	mem_malloc_init(CONFIG_SYS_TEXT_BASE - CONFIG_SYS_MALLOC_LEN,  			CONFIG_SYS_MALLOC_LEN); @@ -90,7 +86,19 @@ void board_init_r(gd_t *id, ulong dummy)  	serial_init();          /* serial communications setup */  	gd->have_console = 1; +#endif + +#ifdef CONFIG_SPL_NAND_LOAD +	nand_init(); +	puts("Nand boot...\n"); +	nand_boot(); +#endif +#ifdef CONFIG_SPL_SPI_LOAD  	puts("SPI boot...\n");  	spi_boot();  #endif +#ifdef CONFIG_SPL_MMC_LOAD +	puts("MMC boot...\n"); +	spl_mmc_load(); +#endif  } diff --git a/arch/arm/cpu/arm926ejs/mx25/generic.c b/arch/arm/cpu/arm926ejs/mx25/generic.c index 8b07dae2b..90e584ac5 100644 --- a/arch/arm/cpu/arm926ejs/mx25/generic.c +++ b/arch/arm/cpu/arm926ejs/mx25/generic.c @@ -64,7 +64,7 @@ static unsigned int imx_decode_pll(unsigned int pll, unsigned int f_ref)  static ulong imx_get_mpllclk(void)  {  	struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE; -	ulong fref = 24000000; +	ulong fref = MXC_HCLK;  	return imx_decode_pll(readl(&ccm->mpctl), fref);  } @@ -186,6 +186,14 @@ int print_cpuinfo(void)  }  #endif +void enable_caches(void) +{ +#ifndef CONFIG_SYS_DCACHE_OFF +	/* Enable D-cache. I-cache is already enabled in start.S */ +	dcache_enable(); +#endif +} +  int cpu_eth_init(bd_t *bis)  {  #if defined(CONFIG_FEC_MXC) diff --git a/arch/arm/cpu/arm926ejs/mx25/timer.c b/arch/arm/cpu/arm926ejs/mx25/timer.c index 1cfd02b23..4dc4041c0 100644 --- a/arch/arm/cpu/arm926ejs/mx25/timer.c +++ b/arch/arm/cpu/arm926ejs/mx25/timer.c @@ -40,6 +40,7 @@  #include <div64.h>  #include <asm/io.h>  #include <asm/arch/imx-regs.h> +#include <asm/arch/clock.h>  DECLARE_GLOBAL_DATA_PTR; @@ -55,28 +56,27 @@ DECLARE_GLOBAL_DATA_PTR;  static inline unsigned long long tick_to_time(unsigned long long tick)  {  	tick *= CONFIG_SYS_HZ; -	do_div(tick, CONFIG_MX25_CLK32); +	do_div(tick, MXC_CLK32);  	return tick;  }  static inline unsigned long long time_to_tick(unsigned long long time)  { -	time *= CONFIG_MX25_CLK32; +	time *= MXC_CLK32;  	do_div(time, CONFIG_SYS_HZ);  	return time;  }  static inline unsigned long long us_to_tick(unsigned long long us)  { -	us = us * CONFIG_MX25_CLK32 + 999999; +	us = us * MXC_CLK32 + 999999;  	do_div(us, 1000000);  	return us;  }  #else  /* ~2% error */ -#define TICK_PER_TIME	((CONFIG_MX25_CLK32 + CONFIG_SYS_HZ / 2) / \ -		CONFIG_SYS_HZ) -#define US_PER_TICK	(1000000 / CONFIG_MX25_CLK32) +#define TICK_PER_TIME	((MXC_CLK32 + CONFIG_SYS_HZ / 2) / CONFIG_SYS_HZ) +#define US_PER_TICK	(1000000 / MXC_CLK32)  static inline unsigned long long tick_to_time(unsigned long long tick)  { @@ -144,7 +144,7 @@ ulong get_timer_masked(void)  {  	/*  	 * get_ticks() returns a long long (64 bit), it wraps in -	 * 2^64 / CONFIG_MX25_CLK32 = 2^64 / 2^15 = 2^49 ~ 5 * 10^14 (s) ~ +	 * 2^64 / MXC_CLK32 = 2^64 / 2^15 = 2^49 ~ 5 * 10^14 (s) ~  	 * 5 * 10^9 days... and get_ticks() * CONFIG_SYS_HZ wraps in  	 * 5 * 10^6 days - long enough.  	 */ @@ -177,6 +177,6 @@ ulong get_tbclk(void)  {  	ulong tbclk; -	tbclk = CONFIG_MX25_CLK32; +	tbclk = MXC_CLK32;  	return tbclk;  } diff --git a/arch/arm/cpu/arm926ejs/mx27/generic.c b/arch/arm/cpu/arm926ejs/mx27/generic.c index 65c481378..41bb84bb6 100644 --- a/arch/arm/cpu/arm926ejs/mx27/generic.c +++ b/arch/arm/cpu/arm926ejs/mx27/generic.c @@ -24,6 +24,7 @@  #include <asm/io.h>  #include <asm/arch/imx-regs.h>  #include <asm/arch/clock.h> +#include <asm/arch/gpio.h>  #ifdef CONFIG_MXC_MMC  #include <asm/arch/mxcmmc.h>  #endif @@ -209,7 +210,7 @@ int cpu_mmc_init(bd_t *bis)  void imx_gpio_mode(int gpio_mode)  { -	struct gpio_regs *regs = (struct gpio_regs *)IMX_GPIO_BASE; +	struct gpio_port_regs *regs = (struct gpio_port_regs *)IMX_GPIO_BASE;  	unsigned int pin = gpio_mode & GPIO_PIN_MASK;  	unsigned int port = (gpio_mode & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT;  	unsigned int ocr = (gpio_mode & GPIO_OCR_MASK) >> GPIO_OCR_SHIFT; @@ -228,11 +229,11 @@ void imx_gpio_mode(int gpio_mode)  	/* Data direction */  	if (gpio_mode & GPIO_OUT) { -		writel(readl(®s->port[port].ddir) | 1 << pin, -				®s->port[port].ddir); +		writel(readl(®s->port[port].gpio_dir) | 1 << pin, +				®s->port[port].gpio_dir);  	} else { -		writel(readl(®s->port[port].ddir) & ~(1 << pin), -				®s->port[port].ddir); +		writel(readl(®s->port[port].gpio_dir) & ~(1 << pin), +				®s->port[port].gpio_dir);  	}  	/* Primary / alternate function */ diff --git a/arch/arm/cpu/arm926ejs/mx28/Makefile b/arch/arm/cpu/arm926ejs/mxs/Makefile index 674a3af1b..eeecf89f8 100644 --- a/arch/arm/cpu/arm926ejs/mx28/Makefile +++ b/arch/arm/cpu/arm926ejs/mxs/Makefile @@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(SOC).o -COBJS	= clock.o mx28.o iomux.o timer.o +COBJS	= clock.o mxs.o iomux.o timer.o  ifdef	CONFIG_SPL_BUILD  COBJS	+= spl_boot.o spl_lradc_init.o spl_mem_init.o spl_power_init.o diff --git a/arch/arm/cpu/arm926ejs/mx28/clock.c b/arch/arm/cpu/arm926ejs/mxs/clock.c index 0439f9c0e..bfea6abeb 100644 --- a/arch/arm/cpu/arm926ejs/mx28/clock.c +++ b/arch/arm/cpu/arm926ejs/mxs/clock.c @@ -43,8 +43,8 @@  static uint32_t mx28_get_pclk(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	uint32_t clkctrl, clkseq, div;  	uint8_t clkfrac, frac; @@ -75,8 +75,8 @@ static uint32_t mx28_get_pclk(void)  static uint32_t mx28_get_hclk(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	uint32_t div;  	uint32_t clkctrl; @@ -93,8 +93,8 @@ static uint32_t mx28_get_hclk(void)  static uint32_t mx28_get_emiclk(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	uint32_t clkctrl, clkseq, div;  	uint8_t clkfrac, frac; @@ -118,8 +118,8 @@ static uint32_t mx28_get_emiclk(void)  static uint32_t mx28_get_gpmiclk(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	uint32_t clkctrl, clkseq, div;  	uint8_t clkfrac, frac; @@ -145,8 +145,8 @@ static uint32_t mx28_get_gpmiclk(void)   */  void mx28_set_ioclk(enum mxs_ioclock io, uint32_t freq)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	uint32_t div;  	int io_reg; @@ -178,8 +178,8 @@ void mx28_set_ioclk(enum mxs_ioclock io, uint32_t freq)   */  static uint32_t mx28_get_ioclk(enum mxs_ioclock io)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	uint8_t ret;  	int io_reg; @@ -199,15 +199,15 @@ static uint32_t mx28_get_ioclk(enum mxs_ioclock io)   */  void mx28_set_sspclk(enum mxs_sspclock ssp, uint32_t freq, int xtal)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	uint32_t clk, clkreg;  	if (ssp > MXC_SSPCLK3)  		return;  	clkreg = (uint32_t)(&clkctrl_regs->hw_clkctrl_ssp0) + -			(ssp * sizeof(struct mx28_register_32)); +			(ssp * sizeof(struct mxs_register_32));  	clrbits_le32(clkreg, CLKCTRL_SSP_CLKGATE);  	while (readl(clkreg) & CLKCTRL_SSP_CLKGATE) @@ -243,8 +243,8 @@ void mx28_set_sspclk(enum mxs_sspclock ssp, uint32_t freq, int xtal)   */  static uint32_t mx28_get_sspclk(enum mxs_sspclock ssp)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	uint32_t clkreg;  	uint32_t clk, tmp; @@ -256,7 +256,7 @@ static uint32_t mx28_get_sspclk(enum mxs_sspclock ssp)  		return XTAL_FREQ_KHZ;  	clkreg = (uint32_t)(&clkctrl_regs->hw_clkctrl_ssp0) + -			(ssp * sizeof(struct mx28_register_32)); +			(ssp * sizeof(struct mxs_register_32));  	tmp = readl(clkreg) & CLKCTRL_SSP_DIV_MASK; @@ -273,12 +273,12 @@ static uint32_t mx28_get_sspclk(enum mxs_sspclock ssp)   */  void mx28_set_ssp_busclock(unsigned int bus, uint32_t freq)  { -	struct mx28_ssp_regs *ssp_regs; +	struct mxs_ssp_regs *ssp_regs;  	const uint32_t sspclk = mx28_get_sspclk(bus);  	uint32_t reg;  	uint32_t divide, rate, tgtclk; -	ssp_regs = (struct mx28_ssp_regs *)(MXS_SSP0_BASE + (bus * 0x2000)); +	ssp_regs = (struct mxs_ssp_regs *)(MXS_SSP0_BASE + (bus * 0x2000));  	/*  	 * SSP bit rate = SSPCLK / (CLOCK_DIVIDE * (1 + CLOCK_RATE)), diff --git a/arch/arm/cpu/arm926ejs/mx28/iomux.c b/arch/arm/cpu/arm926ejs/mxs/iomux.c index 12916b6d6..73f144690 100644 --- a/arch/arm/cpu/arm926ejs/mx28/iomux.c +++ b/arch/arm/cpu/arm926ejs/mxs/iomux.c @@ -43,7 +43,7 @@ int mxs_iomux_setup_pad(iomux_cfg_t pad)  {  	u32 reg, ofs, bp, bm;  	void *iomux_base = (void *)MXS_PINCTRL_BASE; -	struct mx28_register_32 *mxs_reg; +	struct mxs_register_32 *mxs_reg;  	/* muxsel */  	ofs = 0x100; @@ -70,7 +70,7 @@ int mxs_iomux_setup_pad(iomux_cfg_t pad)  	/* vol */  	if (PAD_VOL_VALID(pad)) {  		bp = PAD_PIN(pad) % 8 * 4 + 2; -		mxs_reg = (struct mx28_register_32 *)(iomux_base + ofs); +		mxs_reg = (struct mxs_register_32 *)(iomux_base + ofs);  		if (PAD_VOL(pad))  			writel(1 << bp, &mxs_reg->reg_set);  		else @@ -82,7 +82,7 @@ int mxs_iomux_setup_pad(iomux_cfg_t pad)  		ofs = PULL_OFFSET;  		ofs += PAD_BANK(pad) * 0x10;  		bp = PAD_PIN(pad); -		mxs_reg = (struct mx28_register_32 *)(iomux_base + ofs); +		mxs_reg = (struct mxs_register_32 *)(iomux_base + ofs);  		if (PAD_PULL(pad))  			writel(1 << bp, &mxs_reg->reg_set);  		else diff --git a/arch/arm/cpu/arm926ejs/mx28/mx28.c b/arch/arm/cpu/arm926ejs/mxs/mxs.c index ff2577209..6ce8019b8 100644 --- a/arch/arm/cpu/arm926ejs/mx28/mx28.c +++ b/arch/arm/cpu/arm926ejs/mxs/mxs.c @@ -41,8 +41,8 @@ DECLARE_GLOBAL_DATA_PTR;  /* 1 second delay should be plenty of time for block reset. */  #define	RESET_MAX_TIMEOUT	1000000 -#define	MX28_BLOCK_SFTRST	(1 << 31) -#define	MX28_BLOCK_CLKGATE	(1 << 30) +#define	MXS_BLOCK_SFTRST	(1 << 31) +#define	MXS_BLOCK_CLKGATE	(1 << 30)  /* Lowlevel init isn't used on i.MX28, so just have a dummy here */  inline void lowlevel_init(void) {} @@ -51,10 +51,10 @@ void reset_cpu(ulong ignored) __attribute__((noreturn));  void reset_cpu(ulong ignored)  { -	struct mx28_rtc_regs *rtc_regs = -		(struct mx28_rtc_regs *)MXS_RTC_BASE; -	struct mx28_lcdif_regs *lcdif_regs = -		(struct mx28_lcdif_regs *)MXS_LCDIF_BASE; +	struct mxs_rtc_regs *rtc_regs = +		(struct mxs_rtc_regs *)MXS_RTC_BASE; +	struct mxs_lcdif_regs *lcdif_regs = +		(struct mxs_lcdif_regs *)MXS_LCDIF_BASE;  	/*  	 * Shut down the LCD controller as it interferes with BootROM boot mode @@ -81,7 +81,8 @@ void enable_caches(void)  #endif  } -int mx28_wait_mask_set(struct mx28_register_32 *reg, uint32_t mask, int timeout) +int mxs_wait_mask_set(struct mxs_register_32 *reg, uint32_t mask, unsigned +								int timeout)  {  	while (--timeout) {  		if ((readl(®->reg) & mask) == mask) @@ -92,7 +93,8 @@ int mx28_wait_mask_set(struct mx28_register_32 *reg, uint32_t mask, int timeout)  	return !timeout;  } -int mx28_wait_mask_clr(struct mx28_register_32 *reg, uint32_t mask, int timeout) +int mxs_wait_mask_clr(struct mxs_register_32 *reg, uint32_t mask, unsigned +								int timeout)  {  	while (--timeout) {  		if ((readl(®->reg) & mask) == 0) @@ -103,34 +105,34 @@ int mx28_wait_mask_clr(struct mx28_register_32 *reg, uint32_t mask, int timeout)  	return !timeout;  } -int mx28_reset_block(struct mx28_register_32 *reg) +int mxs_reset_block(struct mxs_register_32 *reg)  {  	/* Clear SFTRST */ -	writel(MX28_BLOCK_SFTRST, ®->reg_clr); +	writel(MXS_BLOCK_SFTRST, ®->reg_clr); -	if (mx28_wait_mask_clr(reg, MX28_BLOCK_SFTRST, RESET_MAX_TIMEOUT)) +	if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))  		return 1;  	/* Clear CLKGATE */ -	writel(MX28_BLOCK_CLKGATE, ®->reg_clr); +	writel(MXS_BLOCK_CLKGATE, ®->reg_clr);  	/* Set SFTRST */ -	writel(MX28_BLOCK_SFTRST, ®->reg_set); +	writel(MXS_BLOCK_SFTRST, ®->reg_set);  	/* Wait for CLKGATE being set */ -	if (mx28_wait_mask_set(reg, MX28_BLOCK_CLKGATE, RESET_MAX_TIMEOUT)) +	if (mxs_wait_mask_set(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))  		return 1;  	/* Clear SFTRST */ -	writel(MX28_BLOCK_SFTRST, ®->reg_clr); +	writel(MXS_BLOCK_SFTRST, ®->reg_clr); -	if (mx28_wait_mask_clr(reg, MX28_BLOCK_SFTRST, RESET_MAX_TIMEOUT)) +	if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT))  		return 1;  	/* Clear CLKGATE */ -	writel(MX28_BLOCK_CLKGATE, ®->reg_clr); +	writel(MXS_BLOCK_CLKGATE, ®->reg_clr); -	if (mx28_wait_mask_clr(reg, MX28_BLOCK_CLKGATE, RESET_MAX_TIMEOUT)) +	if (mxs_wait_mask_clr(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT))  		return 1;  	return 0; @@ -155,8 +157,8 @@ int arch_misc_init(void)  int arch_cpu_init(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	extern uint32_t _start;  	mx28_fixup_vt((uint32_t)&_start); @@ -188,14 +190,48 @@ int arch_cpu_init(void)  }  #if defined(CONFIG_DISPLAY_CPUINFO) +static const char *get_cpu_type(void) +{ +	struct mxs_digctl_regs *digctl_regs = +		(struct mxs_digctl_regs *)MXS_DIGCTL_BASE; + +	switch (readl(&digctl_regs->hw_digctl_chipid) & HW_DIGCTL_CHIPID_MASK) { +	case HW_DIGCTL_CHIPID_MX28: +		return "28"; +	default: +		return "??"; +	} +} + +static const char *get_cpu_rev(void) +{ +	struct mxs_digctl_regs *digctl_regs = +		(struct mxs_digctl_regs *)MXS_DIGCTL_BASE; +	uint8_t rev = readl(&digctl_regs->hw_digctl_chipid) & 0x000000FF; + +	switch (readl(&digctl_regs->hw_digctl_chipid) & HW_DIGCTL_CHIPID_MASK) { +	case HW_DIGCTL_CHIPID_MX28: +		switch (rev) { +		case 0x1: +			return "1.2"; +		default: +			return "??"; +		} +	default: +		return "??"; +	} +} +  int print_cpuinfo(void)  { -	struct mx28_spl_data *data = (struct mx28_spl_data *) -		((CONFIG_SYS_TEXT_BASE - sizeof(struct mx28_spl_data)) & ~0xf); +	struct mxs_spl_data *data = (struct mxs_spl_data *) +		((CONFIG_SYS_TEXT_BASE - sizeof(struct mxs_spl_data)) & ~0xf); -	printf("Freescale i.MX28 family at %d MHz\n", -			mxc_get_clock(MXC_ARM_CLK) / 1000000); -	printf("BOOT:  %s\n", mx28_boot_modes[data->boot_mode_idx].mode); +	printf("CPU:   Freescale i.MX%s rev%s at %d MHz\n", +		get_cpu_type(), +		get_cpu_rev(), +		mxc_get_clock(MXC_ARM_CLK) / 1000000); +	printf("BOOT:  %s\n", mxs_boot_modes[data->boot_mode_idx].mode);  	return 0;  }  #endif @@ -212,11 +248,11 @@ int do_mx28_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])  /*   * Initializes on-chip ethernet controllers.   */ -#ifdef	CONFIG_CMD_NET +#if defined(CONFIG_MX28) && defined(CONFIG_CMD_NET)  int cpu_eth_init(bd_t *bis)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	/* Turn on ENET clocks */  	clrbits_le32(&clkctrl_regs->hw_clkctrl_enet, @@ -257,15 +293,15 @@ void mx28_adjust_mac(int dev_id, unsigned char *mac)  #define	MXS_OCOTP_MAX_TIMEOUT	1000000  void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)  { -	struct mx28_ocotp_regs *ocotp_regs = -		(struct mx28_ocotp_regs *)MXS_OCOTP_BASE; +	struct mxs_ocotp_regs *ocotp_regs = +		(struct mxs_ocotp_regs *)MXS_OCOTP_BASE;  	uint32_t data;  	memset(mac, 0, 6);  	writel(OCOTP_CTRL_RD_BANK_OPEN, &ocotp_regs->hw_ocotp_ctrl_set); -	if (mx28_wait_mask_clr(&ocotp_regs->hw_ocotp_ctrl_reg, OCOTP_CTRL_BUSY, +	if (mxs_wait_mask_clr(&ocotp_regs->hw_ocotp_ctrl_reg, OCOTP_CTRL_BUSY,  				MXS_OCOTP_MAX_TIMEOUT)) {  		printf("MXS FEC: Can't get MAC from OCOTP\n");  		return; @@ -286,13 +322,13 @@ void imx_get_mac_from_fuse(int dev_id, unsigned char *mac)  }  #endif -int mx28_dram_init(void) +int mxs_dram_init(void)  { -	struct mx28_spl_data *data = (struct mx28_spl_data *) -		((CONFIG_SYS_TEXT_BASE - sizeof(struct mx28_spl_data)) & ~0xf); +	struct mxs_spl_data *data = (struct mxs_spl_data *) +		((CONFIG_SYS_TEXT_BASE - sizeof(struct mxs_spl_data)) & ~0xf);  	if (data->mem_dram_size == 0) { -		printf("MX28:\n" +		printf("MXS:\n"  			"Error, the RAM size passed up from SPL is 0!\n");  		hang();  	} diff --git a/arch/arm/cpu/arm926ejs/mx28/mx28_init.h b/arch/arm/cpu/arm926ejs/mxs/mxs_init.h index e3a4493fb..2ddc5bc0c 100644 --- a/arch/arm/cpu/arm926ejs/mx28/mx28_init.h +++ b/arch/arm/cpu/arm926ejs/mxs/mxs_init.h @@ -28,18 +28,18 @@  void early_delay(int delay); -void mx28_power_init(void); +void mxs_power_init(void);  #ifdef	CONFIG_SPL_MX28_PSWITCH_WAIT -void mx28_power_wait_pswitch(void); +void mxs_power_wait_pswitch(void);  #else -static inline void mx28_power_wait_pswitch(void) { } +static inline void mxs_power_wait_pswitch(void) { }  #endif -void mx28_mem_init(void); -uint32_t mx28_mem_get_size(void); +void mxs_mem_init(void); +uint32_t mxs_mem_get_size(void); -void mx28_lradc_init(void); -void mx28_lradc_enable_batt_measurement(void); +void mxs_lradc_init(void); +void mxs_lradc_enable_batt_measurement(void);  #endif	/* __M28_INIT_H__ */ diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_boot.c b/arch/arm/cpu/arm926ejs/mxs/spl_boot.c index a6dfca3f5..ad66c57c5 100644 --- a/arch/arm/cpu/arm926ejs/mx28/spl_boot.c +++ b/arch/arm/cpu/arm926ejs/mxs/spl_boot.c @@ -26,12 +26,11 @@  #include <common.h>  #include <config.h>  #include <asm/io.h> -#include <asm/arch/iomux-mx28.h>  #include <asm/arch/imx-regs.h>  #include <asm/arch/sys_proto.h>  #include <asm/gpio.h> -#include "mx28_init.h" +#include "mxs_init.h"  /*   * This delay function is intended to be used only in early stage of boot, where @@ -39,12 +38,14 @@   * takes a few seconds to roll. The boot doesn't take that long, so to keep the   * code simple, it doesn't take rolling into consideration.   */ -#define	HW_DIGCTRL_MICROSECONDS	0x8001c0c0  void early_delay(int delay)  { -	uint32_t st = readl(HW_DIGCTRL_MICROSECONDS); +	struct mxs_digctl_regs *digctl_regs = +		(struct mxs_digctl_regs *)MXS_DIGCTL_BASE; + +	uint32_t st = readl(&digctl_regs->hw_digctl_microseconds);  	st += delay; -	while (st > readl(HW_DIGCTRL_MICROSECONDS)) +	while (st > readl(&digctl_regs->hw_digctl_microseconds))  		;  } @@ -58,7 +59,7 @@ const iomux_cfg_t iomux_boot[] = {  	MX28_PAD_LCD_D05__GPIO_1_5 | MUX_CONFIG_BOOTMODE_PAD,  }; -uint8_t mx28_get_bootmode_index(void) +uint8_t mxs_get_bootmode_index(void)  {  	uint8_t bootmode = 0;  	int i; @@ -83,31 +84,31 @@ uint8_t mx28_get_bootmode_index(void)  	bootmode |= (gpio_get_value(MX28_PAD_LCD_D04__GPIO_1_4) ? 1 : 0) << 4;  	bootmode |= (gpio_get_value(MX28_PAD_LCD_D05__GPIO_1_5) ? 1 : 0) << 5; -	for (i = 0; i < ARRAY_SIZE(mx28_boot_modes); i++) { -		masked = bootmode & mx28_boot_modes[i].boot_mask; -		if (masked == mx28_boot_modes[i].boot_pads) +	for (i = 0; i < ARRAY_SIZE(mxs_boot_modes); i++) { +		masked = bootmode & mxs_boot_modes[i].boot_mask; +		if (masked == mxs_boot_modes[i].boot_pads)  			break;  	}  	return i;  } -void mx28_common_spl_init(const iomux_cfg_t *iomux_setup, +void mxs_common_spl_init(const iomux_cfg_t *iomux_setup,  			const unsigned int iomux_size)  { -	struct mx28_spl_data *data = (struct mx28_spl_data *) -		((CONFIG_SYS_TEXT_BASE - sizeof(struct mx28_spl_data)) & ~0xf); -	uint8_t bootmode = mx28_get_bootmode_index(); +	struct mxs_spl_data *data = (struct mxs_spl_data *) +		((CONFIG_SYS_TEXT_BASE - sizeof(struct mxs_spl_data)) & ~0xf); +	uint8_t bootmode = mxs_get_bootmode_index();  	mxs_iomux_setup_multiple_pads(iomux_setup, iomux_size); -	mx28_power_init(); +	mxs_power_init(); -	mx28_mem_init(); -	data->mem_dram_size = mx28_mem_get_size(); +	mxs_mem_init(); +	data->mem_dram_size = mxs_mem_get_size();  	data->boot_mode_idx = bootmode; -	mx28_power_wait_pswitch(); +	mxs_power_wait_pswitch();  }  /* Support aparatus */ diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_lradc_init.c b/arch/arm/cpu/arm926ejs/mxs/spl_lradc_init.c index 88a603c11..d90f0a131 100644 --- a/arch/arm/cpu/arm926ejs/mx28/spl_lradc_init.c +++ b/arch/arm/cpu/arm926ejs/mxs/spl_lradc_init.c @@ -28,11 +28,11 @@  #include <asm/io.h>  #include <asm/arch/imx-regs.h> -#include "mx28_init.h" +#include "mxs_init.h" -void mx28_lradc_init(void) +void mxs_lradc_init(void)  { -	struct mx28_lradc_regs *regs = (struct mx28_lradc_regs *)MXS_LRADC_BASE; +	struct mxs_lradc_regs *regs = (struct mxs_lradc_regs *)MXS_LRADC_BASE;  	writel(LRADC_CTRL0_SFTRST, ®s->hw_lradc_ctrl0_clr);  	writel(LRADC_CTRL0_CLKGATE, ®s->hw_lradc_ctrl0_clr); @@ -49,9 +49,9 @@ void mx28_lradc_init(void)  			LRADC_CTRL4_LRADC6SELECT_CHANNEL10);  } -void mx28_lradc_enable_batt_measurement(void) +void mxs_lradc_enable_batt_measurement(void)  { -	struct mx28_lradc_regs *regs = (struct mx28_lradc_regs *)MXS_LRADC_BASE; +	struct mxs_lradc_regs *regs = (struct mxs_lradc_regs *)MXS_LRADC_BASE;  	/* Check if the channel is present at all. */  	if (!(readl(®s->hw_lradc_status) & LRADC_STATUS_CHANNEL7_PRESENT)) diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_mem_init.c b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c index e17a4d7c7..e693145b9 100644 --- a/arch/arm/cpu/arm926ejs/mx28/spl_mem_init.c +++ b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c @@ -26,12 +26,11 @@  #include <common.h>  #include <config.h>  #include <asm/io.h> -#include <asm/arch/iomux-mx28.h>  #include <asm/arch/imx-regs.h> -#include "mx28_init.h" +#include "mxs_init.h" -uint32_t dram_vals[] = { +static uint32_t mx28_dram_vals[] = {  	0x00000000, 0x00000000, 0x00000000, 0x00000000,  	0x00000000, 0x00000000, 0x00000000, 0x00000000,  	0x00000000, 0x00000000, 0x00000000, 0x00000000, @@ -82,26 +81,26 @@ uint32_t dram_vals[] = {  	0x00000000, 0x00010001  }; -void __mx28_adjust_memory_params(uint32_t *dram_vals) +void __mxs_adjust_memory_params(uint32_t *dram_vals)  {  } -void mx28_adjust_memory_params(uint32_t *dram_vals) -	__attribute__((weak, alias("__mx28_adjust_memory_params"))); +void mxs_adjust_memory_params(uint32_t *dram_vals) +	__attribute__((weak, alias("__mxs_adjust_memory_params"))); -void init_m28_200mhz_ddr2(void) +void init_mx28_200mhz_ddr2(void)  {  	int i; -	mx28_adjust_memory_params(dram_vals); +	mxs_adjust_memory_params(mx28_dram_vals); -	for (i = 0; i < ARRAY_SIZE(dram_vals); i++) -		writel(dram_vals[i], MXS_DRAM_BASE + (4 * i)); +	for (i = 0; i < ARRAY_SIZE(mx28_dram_vals); i++) +		writel(mx28_dram_vals[i], MXS_DRAM_BASE + (4 * i));  } -void mx28_mem_init_clock(void) +void mxs_mem_init_clock(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	/* Gate EMI clock */  	writeb(CLKCTRL_FRAC_CLKGATE, @@ -129,10 +128,10 @@ void mx28_mem_init_clock(void)  	early_delay(10000);  } -void mx28_mem_setup_cpu_and_hbus(void) +void mxs_mem_setup_cpu_and_hbus(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	/* Set fractional divider for ref_cpu to 480 * 18 / 19 = 454MHz  	 * and ungate CPU clock */ @@ -161,10 +160,10 @@ void mx28_mem_setup_cpu_and_hbus(void)  	early_delay(15000);  } -void mx28_mem_setup_vdda(void) +void mxs_mem_setup_vdda(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	writel((0xc << POWER_VDDACTRL_TRG_OFFSET) |  		(0x7 << POWER_VDDACTRL_BO_OFFSET_OFFSET) | @@ -172,10 +171,10 @@ void mx28_mem_setup_vdda(void)  		&power_regs->hw_power_vddactrl);  } -void mx28_mem_setup_vddd(void) +void mxs_mem_setup_vddd(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	writel((0x1c << POWER_VDDDCTRL_TRG_OFFSET) |  		(0x7 << POWER_VDDDCTRL_BO_OFFSET_OFFSET) | @@ -183,7 +182,7 @@ void mx28_mem_setup_vddd(void)  		&power_regs->hw_power_vdddctrl);  } -uint32_t mx28_mem_get_size(void) +uint32_t mxs_mem_get_size(void)  {  	uint32_t sz, da;  	uint32_t *vt = (uint32_t *)0x20; @@ -202,12 +201,12 @@ uint32_t mx28_mem_get_size(void)  	return sz;  } -void mx28_mem_init(void) +void mxs_mem_init(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; -	struct mx28_pinctrl_regs *pinctrl_regs = -		(struct mx28_pinctrl_regs *)MXS_PINCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_pinctrl_regs *pinctrl_regs = +		(struct mxs_pinctrl_regs *)MXS_PINCTRL_BASE;  	/* Set DDR2 mode */  	writel(PINCTRL_EMI_DS_CTRL_DDR_MODE_DDR2, @@ -219,9 +218,9 @@ void mx28_mem_init(void)  	early_delay(11000); -	mx28_mem_init_clock(); +	mxs_mem_init_clock(); -	mx28_mem_setup_vdda(); +	mxs_mem_setup_vdda();  	/*  	 * Configure the DRAM registers @@ -230,7 +229,7 @@ void mx28_mem_init(void)  	/* Clear START bit from DRAM_CTL16 */  	clrbits_le32(MXS_DRAM_BASE + 0x40, 1); -	init_m28_200mhz_ddr2(); +	init_mx28_200mhz_ddr2();  	/* Clear SREFRESH bit from DRAM_CTL17 */  	clrbits_le32(MXS_DRAM_BASE + 0x44, 1); @@ -242,9 +241,9 @@ void mx28_mem_init(void)  	while (!(readl(MXS_DRAM_BASE + 0xe8) & (1 << 20)))  		; -	mx28_mem_setup_vddd(); +	mxs_mem_setup_vddd();  	early_delay(10000); -	mx28_mem_setup_cpu_and_hbus(); +	mxs_mem_setup_cpu_and_hbus();  } diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c b/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c index 4b09b0c3b..4b917bd18 100644 --- a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c +++ b/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c @@ -28,22 +28,22 @@  #include <asm/io.h>  #include <asm/arch/imx-regs.h> -#include "mx28_init.h" +#include "mxs_init.h" -void mx28_power_clock2xtal(void) +void mxs_power_clock2xtal(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	/* Set XTAL as CPU reference clock */  	writel(CLKCTRL_CLKSEQ_BYPASS_CPU,  		&clkctrl_regs->hw_clkctrl_clkseq_set);  } -void mx28_power_clock2pll(void) +void mxs_power_clock2pll(void)  { -	struct mx28_clkctrl_regs *clkctrl_regs = -		(struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; +	struct mxs_clkctrl_regs *clkctrl_regs = +		(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;  	setbits_le32(&clkctrl_regs->hw_clkctrl_pll0ctrl0,  			CLKCTRL_PLL0CTRL0_POWER); @@ -52,10 +52,10 @@ void mx28_power_clock2pll(void)  			CLKCTRL_CLKSEQ_BYPASS_CPU);  } -void mx28_power_clear_auto_restart(void) +void mxs_power_clear_auto_restart(void)  { -	struct mx28_rtc_regs *rtc_regs = -		(struct mx28_rtc_regs *)MXS_RTC_BASE; +	struct mxs_rtc_regs *rtc_regs = +		(struct mxs_rtc_regs *)MXS_RTC_BASE;  	writel(RTC_CTRL_SFTRST, &rtc_regs->hw_rtc_ctrl_clr);  	while (readl(&rtc_regs->hw_rtc_ctrl) & RTC_CTRL_SFTRST) @@ -85,10 +85,10 @@ void mx28_power_clear_auto_restart(void)  		;  } -void mx28_power_set_linreg(void) +void mxs_power_set_linreg(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	/* Set linear regulator 25mV below switching converter */  	clrsetbits_le32(&power_regs->hw_power_vdddctrl, @@ -104,10 +104,10 @@ void mx28_power_set_linreg(void)  			POWER_VDDIOCTRL_LINREG_OFFSET_1STEPS_BELOW);  } -int mx28_get_batt_volt(void) +int mxs_get_batt_volt(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	uint32_t volt = readl(&power_regs->hw_power_battmonitor);  	volt &= POWER_BATTMONITOR_BATT_VAL_MASK;  	volt >>= POWER_BATTMONITOR_BATT_VAL_OFFSET; @@ -115,16 +115,16 @@ int mx28_get_batt_volt(void)  	return volt;  } -int mx28_is_batt_ready(void) +int mxs_is_batt_ready(void)  { -	return (mx28_get_batt_volt() >= 3600); +	return (mxs_get_batt_volt() >= 3600);  } -int mx28_is_batt_good(void) +int mxs_is_batt_good(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; -	uint32_t volt = mx28_get_batt_volt(); +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE; +	uint32_t volt = mxs_get_batt_volt();  	if ((volt >= 2400) && (volt <= 4300))  		return 1; @@ -145,7 +145,7 @@ int mx28_is_batt_good(void)  	early_delay(500000); -	volt = mx28_get_batt_volt(); +	volt = mxs_get_batt_volt();  	if (volt >= 3500)  		return 0; @@ -160,10 +160,10 @@ int mx28_is_batt_good(void)  	return 0;  } -void mx28_power_setup_5v_detect(void) +void mxs_power_setup_5v_detect(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	/* Start 5V detection */  	clrsetbits_le32(&power_regs->hw_power_5vctrl, @@ -172,10 +172,10 @@ void mx28_power_setup_5v_detect(void)  			POWER_5VCTRL_PWRUP_VBUS_CMPS);  } -void mx28_src_power_init(void) +void mxs_src_power_init(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	/* Improve efficieny and reduce transient ripple */  	writel(POWER_LOOPCTRL_TOGGLE_DIF | POWER_LOOPCTRL_EN_CM_HYST | @@ -203,10 +203,10 @@ void mx28_src_power_init(void)  	clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_DCDC_XFER);  } -void mx28_power_init_4p2_params(void) +void mxs_power_init_4p2_params(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	/* Setup 4P2 parameters */  	clrsetbits_le32(&power_regs->hw_power_dcdc4p2, @@ -227,10 +227,10 @@ void mx28_power_init_4p2_params(void)  		0x3f << POWER_5VCTRL_CHARGE_4P2_ILIMIT_OFFSET);  } -void mx28_enable_4p2_dcdc_input(int xfer) +void mxs_enable_4p2_dcdc_input(int xfer)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	uint32_t tmp, vbus_thresh, vbus_5vdetect, pwd_bo;  	uint32_t prev_5v_brnout, prev_5v_droop; @@ -323,10 +323,10 @@ void mx28_enable_4p2_dcdc_input(int xfer)  				POWER_CTRL_ENIRQ_VDD5V_DROOP);  } -void mx28_power_init_4p2_regulator(void) +void mxs_power_init_4p2_regulator(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	uint32_t tmp, tmp2;  	setbits_le32(&power_regs->hw_power_dcdc4p2, POWER_DCDC4P2_ENABLE_4P2); @@ -346,7 +346,7 @@ void mx28_power_init_4p2_regulator(void)  	 * gradually to avoid large inrush current from the 5V cable which can  	 * cause transients/problems  	 */ -	mx28_enable_4p2_dcdc_input(0); +	mxs_enable_4p2_dcdc_input(0);  	if (readl(&power_regs->hw_power_ctrl) & POWER_CTRL_VBUS_VALID_IRQ) {  		/* @@ -407,17 +407,17 @@ void mx28_power_init_4p2_regulator(void)  	writel(POWER_CTRL_DCDC4P2_BO_IRQ, &power_regs->hw_power_ctrl_clr);  } -void mx28_power_init_dcdc_4p2_source(void) +void mxs_power_init_dcdc_4p2_source(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	if (!(readl(&power_regs->hw_power_dcdc4p2) &  		POWER_DCDC4P2_ENABLE_DCDC)) {  		hang();  	} -	mx28_enable_4p2_dcdc_input(1); +	mxs_enable_4p2_dcdc_input(1);  	if (readl(&power_regs->hw_power_ctrl) & POWER_CTRL_VBUS_VALID_IRQ) {  		clrbits_le32(&power_regs->hw_power_dcdc4p2, @@ -429,10 +429,10 @@ void mx28_power_init_dcdc_4p2_source(void)  	}  } -void mx28_power_enable_4p2(void) +void mxs_power_enable_4p2(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	uint32_t vdddctrl, vddactrl, vddioctrl;  	uint32_t tmp; @@ -451,11 +451,11 @@ void mx28_power_enable_4p2(void)  	setbits_le32(&power_regs->hw_power_vddioctrl,  		POWER_VDDIOCTRL_DISABLE_FET | POWER_VDDIOCTRL_PWDN_BRNOUT); -	mx28_power_init_4p2_params(); -	mx28_power_init_4p2_regulator(); +	mxs_power_init_4p2_params(); +	mxs_power_init_4p2_regulator();  	/* Shutdown battery (none present) */ -	if (!mx28_is_batt_ready()) { +	if (!mxs_is_batt_ready()) {  		clrbits_le32(&power_regs->hw_power_dcdc4p2,  				POWER_DCDC4P2_BO_MASK);  		writel(POWER_CTRL_DCDC4P2_BO_IRQ, @@ -464,7 +464,7 @@ void mx28_power_enable_4p2(void)  				&power_regs->hw_power_ctrl_clr);  	} -	mx28_power_init_dcdc_4p2_source(); +	mxs_power_init_dcdc_4p2_source();  	writel(vdddctrl, &power_regs->hw_power_vdddctrl);  	early_delay(20); @@ -488,10 +488,10 @@ void mx28_power_enable_4p2(void)  			&power_regs->hw_power_charge_clr);  } -void mx28_boot_valid_5v(void) +void mxs_boot_valid_5v(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	/*  	 * Use VBUSVALID level instead of VDD5V_GT_VDDIO level to trigger a 5V @@ -508,22 +508,22 @@ void mx28_boot_valid_5v(void)  	writel(POWER_CTRL_VBUS_VALID_IRQ | POWER_CTRL_VDD5V_GT_VDDIO_IRQ,  		&power_regs->hw_power_ctrl_clr); -	mx28_power_enable_4p2(); +	mxs_power_enable_4p2();  } -void mx28_powerdown(void) +void mxs_powerdown(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	writel(POWER_RESET_UNLOCK_KEY, &power_regs->hw_power_reset);  	writel(POWER_RESET_UNLOCK_KEY | POWER_RESET_PWD_OFF,  		&power_regs->hw_power_reset);  } -void mx28_batt_boot(void) +void mxs_batt_boot(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_PWDN_5VBRNOUT);  	clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_ENABLE_DCDC); @@ -542,7 +542,7 @@ void mx28_batt_boot(void)  	clrsetbits_le32(&power_regs->hw_power_minpwr,  			POWER_MINPWR_HALFFETS, POWER_MINPWR_DOUBLE_FETS); -	mx28_power_set_linreg(); +	mxs_power_set_linreg();  	clrbits_le32(&power_regs->hw_power_vdddctrl,  		POWER_VDDDCTRL_DISABLE_FET | POWER_VDDDCTRL_ENABLE_LINREG); @@ -564,10 +564,10 @@ void mx28_batt_boot(void)  		0x8 << POWER_5VCTRL_CHARGE_4P2_ILIMIT_OFFSET);  } -void mx28_handle_5v_conflict(void) +void mxs_handle_5v_conflict(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	uint32_t tmp;  	setbits_le32(&power_regs->hw_power_vddioctrl, @@ -577,52 +577,56 @@ void mx28_handle_5v_conflict(void)  		tmp = readl(&power_regs->hw_power_sts);  		if (tmp & POWER_STS_VDDIO_BO) { -			mx28_powerdown(); +			/* +			 * VDDIO has a brownout, then the VDD5V_GT_VDDIO becomes +			 * unreliable +			 */ +			mxs_powerdown();  			break;  		}  		if (tmp & POWER_STS_VDD5V_GT_VDDIO) { -			mx28_boot_valid_5v(); +			mxs_boot_valid_5v();  			break;  		} else { -			mx28_powerdown(); +			mxs_powerdown();  			break;  		}  		if (tmp & POWER_STS_PSWITCH_MASK) { -			mx28_batt_boot(); +			mxs_batt_boot();  			break;  		}  	}  } -void mx28_5v_boot(void) +void mxs_5v_boot(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	/*  	 * NOTE: In original IMX-Bootlets, this also checks for VBUSVALID,  	 * but their implementation always returns 1 so we omit it here.  	 */  	if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) { -		mx28_boot_valid_5v(); +		mxs_boot_valid_5v();  		return;  	}  	early_delay(1000);  	if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) { -		mx28_boot_valid_5v(); +		mxs_boot_valid_5v();  		return;  	} -	mx28_handle_5v_conflict(); +	mxs_handle_5v_conflict();  } -void mx28_init_batt_bo(void) +void mxs_init_batt_bo(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	/* Brownout at 3V */  	clrsetbits_le32(&power_regs->hw_power_battmonitor, @@ -633,10 +637,10 @@ void mx28_init_batt_bo(void)  	writel(POWER_CTRL_ENIRQ_BATT_BO, &power_regs->hw_power_ctrl_clr);  } -void mx28_switch_vddd_to_dcdc_source(void) +void mxs_switch_vddd_to_dcdc_source(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	clrsetbits_le32(&power_regs->hw_power_vdddctrl,  		POWER_VDDDCTRL_LINREG_OFFSET_MASK, @@ -647,51 +651,48 @@ void mx28_switch_vddd_to_dcdc_source(void)  		POWER_VDDDCTRL_DISABLE_STEPPING);  } -void mx28_power_configure_power_source(void) +void mxs_power_configure_power_source(void)  {  	int batt_ready, batt_good; -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; -	struct mx28_lradc_regs *lradc_regs = -		(struct mx28_lradc_regs *)MXS_LRADC_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE; +	struct mxs_lradc_regs *lradc_regs = +		(struct mxs_lradc_regs *)MXS_LRADC_BASE; -	mx28_src_power_init(); - -	batt_ready = mx28_is_batt_ready(); +	mxs_src_power_init();  	if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) { -		batt_good = mx28_is_batt_good(); +		batt_ready = mxs_is_batt_ready();  		if (batt_ready) {  			/* 5V source detected, good battery detected. */ -			mx28_batt_boot(); +			mxs_batt_boot();  		} else { -			if (batt_good) { -				/* 5V source detected, low battery detceted. */ -			} else { +			batt_good = mxs_is_batt_good(); +			if (!batt_good) {  				/* 5V source detected, bad battery detected. */  				writel(LRADC_CONVERSION_AUTOMATIC,  					&lradc_regs->hw_lradc_conversion_clr);  				clrbits_le32(&power_regs->hw_power_battmonitor,  					POWER_BATTMONITOR_BATT_VAL_MASK);  			} -			mx28_5v_boot(); +			mxs_5v_boot();  		}  	} else {  		/* 5V not detected, booting from battery. */ -		mx28_batt_boot(); +		mxs_batt_boot();  	} -	mx28_power_clock2pll(); +	mxs_power_clock2pll(); -	mx28_init_batt_bo(); +	mxs_init_batt_bo(); -	mx28_switch_vddd_to_dcdc_source(); +	mxs_switch_vddd_to_dcdc_source();  } -void mx28_enable_output_rail_protection(void) +void mxs_enable_output_rail_protection(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	writel(POWER_CTRL_VDDD_BO_IRQ | POWER_CTRL_VDDA_BO_IRQ |  		POWER_CTRL_VDDIO_BO_IRQ, &power_regs->hw_power_ctrl_clr); @@ -706,17 +707,17 @@ void mx28_enable_output_rail_protection(void)  			POWER_VDDIOCTRL_PWDN_BRNOUT);  } -int mx28_get_vddio_power_source_off(void) +int mxs_get_vddio_power_source_off(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	uint32_t tmp;  	if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) {  		tmp = readl(&power_regs->hw_power_vddioctrl);  		if (tmp & POWER_VDDIOCTRL_DISABLE_FET) {  			if ((tmp & POWER_VDDIOCTRL_LINREG_OFFSET_MASK) == -				POWER_VDDDCTRL_LINREG_OFFSET_0STEPS) { +				POWER_VDDIOCTRL_LINREG_OFFSET_0STEPS) {  				return 1;  			}  		} @@ -724,7 +725,7 @@ int mx28_get_vddio_power_source_off(void)  		if (!(readl(&power_regs->hw_power_5vctrl) &  			POWER_5VCTRL_ENABLE_DCDC)) {  			if ((tmp & POWER_VDDIOCTRL_LINREG_OFFSET_MASK) == -				POWER_VDDDCTRL_LINREG_OFFSET_0STEPS) { +				POWER_VDDIOCTRL_LINREG_OFFSET_0STEPS) {  				return 1;  			}  		} @@ -734,10 +735,10 @@ int mx28_get_vddio_power_source_off(void)  } -int mx28_get_vddd_power_source_off(void) +int mxs_get_vddd_power_source_off(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	uint32_t tmp;  	tmp = readl(&power_regs->hw_power_vdddctrl); @@ -765,21 +766,21 @@ int mx28_get_vddd_power_source_off(void)  	return 0;  } -void mx28_power_set_vddio(uint32_t new_target, uint32_t new_brownout) +void mxs_power_set_vddio(uint32_t new_target, uint32_t new_brownout)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	uint32_t cur_target, diff, bo_int = 0;  	uint32_t powered_by_linreg = 0; -	new_brownout = new_target - new_brownout; +	new_brownout = (new_target - new_brownout + 25) / 50;  	cur_target = readl(&power_regs->hw_power_vddioctrl);  	cur_target &= POWER_VDDIOCTRL_TRG_MASK;  	cur_target *= 50;	/* 50 mV step*/  	cur_target += 2800;	/* 2800 mV lowest */ -	powered_by_linreg = mx28_get_vddio_power_source_off(); +	powered_by_linreg = mxs_get_vddio_power_source_off();  	if (new_target > cur_target) {  		if (powered_by_linreg) { @@ -858,25 +859,25 @@ void mx28_power_set_vddio(uint32_t new_target, uint32_t new_brownout)  	}  	clrsetbits_le32(&power_regs->hw_power_vddioctrl, -			POWER_VDDDCTRL_BO_OFFSET_MASK, -			new_brownout << POWER_VDDDCTRL_BO_OFFSET_OFFSET); +			POWER_VDDIOCTRL_BO_OFFSET_MASK, +			new_brownout << POWER_VDDIOCTRL_BO_OFFSET_OFFSET);  } -void mx28_power_set_vddd(uint32_t new_target, uint32_t new_brownout) +void mxs_power_set_vddd(uint32_t new_target, uint32_t new_brownout)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	uint32_t cur_target, diff, bo_int = 0;  	uint32_t powered_by_linreg = 0; -	new_brownout = new_target - new_brownout; +	new_brownout = (new_target - new_brownout + 12) / 25;  	cur_target = readl(&power_regs->hw_power_vdddctrl);  	cur_target &= POWER_VDDDCTRL_TRG_MASK;  	cur_target *= 25;	/* 25 mV step*/  	cur_target += 800;	/* 800 mV lowest */ -	powered_by_linreg = mx28_get_vddd_power_source_off(); +	powered_by_linreg = mxs_get_vddd_power_source_off();  	if (new_target > cur_target) {  		if (powered_by_linreg) {  			bo_int = readl(&power_regs->hw_power_vdddctrl); @@ -959,31 +960,31 @@ void mx28_power_set_vddd(uint32_t new_target, uint32_t new_brownout)  			new_brownout << POWER_VDDDCTRL_BO_OFFSET_OFFSET);  } -void mx28_setup_batt_detect(void) +void mxs_setup_batt_detect(void)  { -	mx28_lradc_init(); -	mx28_lradc_enable_batt_measurement(); +	mxs_lradc_init(); +	mxs_lradc_enable_batt_measurement();  	early_delay(10);  } -void mx28_power_init(void) +void mxs_power_init(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE; -	mx28_power_clock2xtal(); -	mx28_power_clear_auto_restart(); -	mx28_power_set_linreg(); -	mx28_power_setup_5v_detect(); +	mxs_power_clock2xtal(); +	mxs_power_clear_auto_restart(); +	mxs_power_set_linreg(); +	mxs_power_setup_5v_detect(); -	mx28_setup_batt_detect(); +	mxs_setup_batt_detect(); -	mx28_power_configure_power_source(); -	mx28_enable_output_rail_protection(); +	mxs_power_configure_power_source(); +	mxs_enable_output_rail_protection(); -	mx28_power_set_vddio(3300, 3150); +	mxs_power_set_vddio(3300, 3150); -	mx28_power_set_vddd(1350, 1200); +	mxs_power_set_vddd(1350, 1200);  	writel(POWER_CTRL_VDDD_BO_IRQ | POWER_CTRL_VDDA_BO_IRQ |  		POWER_CTRL_VDDIO_BO_IRQ | POWER_CTRL_VDD5V_DROOP_IRQ | @@ -996,10 +997,10 @@ void mx28_power_init(void)  }  #ifdef	CONFIG_SPL_MX28_PSWITCH_WAIT -void mx28_power_wait_pswitch(void) +void mxs_power_wait_pswitch(void)  { -	struct mx28_power_regs *power_regs = -		(struct mx28_power_regs *)MXS_POWER_BASE; +	struct mxs_power_regs *power_regs = +		(struct mxs_power_regs *)MXS_POWER_BASE;  	while (!(readl(&power_regs->hw_power_sts) & POWER_STS_PSWITCH_MASK))  		; diff --git a/arch/arm/cpu/arm926ejs/mx28/start.S b/arch/arm/cpu/arm926ejs/mxs/start.S index e572b786b..7ccd33717 100644 --- a/arch/arm/cpu/arm926ejs/mx28/start.S +++ b/arch/arm/cpu/arm926ejs/mxs/start.S @@ -180,14 +180,6 @@ _reset:  	orr	r0,r0,#0xd3  	msr	cpsr,r0 -	/* -	 * we do sys-critical inits only at reboot, -	 * not when booting from ram! -	 */ -#ifndef CONFIG_SKIP_LOWLEVEL_INIT -	bl	cpu_init_crit -#endif -  	bl	board_init_ll  	/* @@ -207,40 +199,6 @@ _reset:  	pop	{r0-r12,r14}  	bx	lr -/* - ************************************************************************* - * - * CPU_init_critical registers - * - * setup important registers - * setup memory timing - * - ************************************************************************* - */ -#ifndef CONFIG_SKIP_LOWLEVEL_INIT -cpu_init_crit: -	/* -	 * flush v4 I/D caches -	 */ -	mov	r0, #0 -	mcr	p15, 0, r0, c7, c7, 0	/* flush v3/v4 cache */ -	mcr	p15, 0, r0, c8, c7, 0	/* flush v4 TLB */ - -	/* -	 * disable MMU stuff and caches -	 */ -	mrc	p15, 0, r0, c1, c0, 0 -	bic	r0, r0, #0x00002300	/* clear bits 13, 9:8 (--V- --RS) */ -	bic	r0, r0, #0x00000087	/* clear bits 7, 2:0 (B--- -CAM) */ -	orr	r0, r0, #0x00000002	/* set bit 2 (A) Align */ -	orr	r0, r0, #0x00001000	/* set bit 12 (I) I-Cache */ -	mcr	p15, 0, r0, c1, c0, 0 - -	mov	pc, lr		/* back to my caller */ - -	.align	5 -#endif /* CONFIG_SKIP_LOWLEVEL_INIT */ -  _hang:  	ldr	sp, _TEXT_BASE			/* switch to abort stack */  1: diff --git a/arch/arm/cpu/arm926ejs/mx28/timer.c b/arch/arm/cpu/arm926ejs/mxs/timer.c index 5b73f4a2b..4ed75e604 100644 --- a/arch/arm/cpu/arm926ejs/mx28/timer.c +++ b/arch/arm/cpu/arm926ejs/mxs/timer.c @@ -62,11 +62,11 @@ static inline unsigned long us_to_tick(unsigned long us)  int timer_init(void)  { -	struct mx28_timrot_regs *timrot_regs = -		(struct mx28_timrot_regs *)MXS_TIMROT_BASE; +	struct mxs_timrot_regs *timrot_regs = +		(struct mxs_timrot_regs *)MXS_TIMROT_BASE;  	/* Reset Timers and Rotary Encoder module */ -	mx28_reset_block(&timrot_regs->hw_timrot_rotctrl_reg); +	mxs_reset_block(&timrot_regs->hw_timrot_rotctrl_reg);  	/* Set fixed_count to 0 */  	writel(0, &timrot_regs->hw_timrot_fixed_count0); @@ -84,8 +84,8 @@ int timer_init(void)  unsigned long long get_ticks(void)  { -	struct mx28_timrot_regs *timrot_regs = -		(struct mx28_timrot_regs *)MXS_TIMROT_BASE; +	struct mxs_timrot_regs *timrot_regs = +		(struct mxs_timrot_regs *)MXS_TIMROT_BASE;  	/* Current tick value */  	uint32_t now = readl(&timrot_regs->hw_timrot_running_count0); diff --git a/arch/arm/cpu/arm926ejs/mxs/u-boot-imx28.bd b/arch/arm/cpu/arm926ejs/mxs/u-boot-imx28.bd new file mode 100644 index 000000000..c60615a45 --- /dev/null +++ b/arch/arm/cpu/arm926ejs/mxs/u-boot-imx28.bd @@ -0,0 +1,14 @@ +sources { +	u_boot_spl="spl/u-boot-spl.bin"; +	u_boot="u-boot.bin"; +} + +section (0) { +	load u_boot_spl > 0x0000; +	load ivt (entry = 0x0014) > 0x8000; +	hab call 0x8000; + +	load u_boot > 0x40000100; +	load ivt (entry = 0x40000100) > 0x8000; +	hab call 0x8000; +} diff --git a/arch/arm/cpu/arm926ejs/mx28/u-boot-spl.lds b/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds index 0fccd5296..f8ea38c03 100644 --- a/arch/arm/cpu/arm926ejs/mx28/u-boot-spl.lds +++ b/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds @@ -37,7 +37,7 @@ SECTIONS  	. = ALIGN(4);  	.text	:  	{ -		arch/arm/cpu/arm926ejs/mx28/start.o	(.text) +		arch/arm/cpu/arm926ejs/mxs/start.o	(.text)  		*(.text)  	} diff --git a/arch/arm/cpu/arm926ejs/orion5x/cpu.c b/arch/arm/cpu/arm926ejs/orion5x/cpu.c index 792b11dfc..c3948d38f 100644 --- a/arch/arm/cpu/arm926ejs/orion5x/cpu.c +++ b/arch/arm/cpu/arm926ejs/orion5x/cpu.c @@ -292,7 +292,9 @@ int arch_misc_init(void)  	writel(ORION5X_MPP0_7, ORION5X_MPP_BASE+0x00);  	writel(ORION5X_MPP8_15, ORION5X_MPP_BASE+0x04);  	writel(ORION5X_MPP16_23, ORION5X_MPP_BASE+0x50); +	writel(ORION5X_GPIO_OUT_VALUE, ORION5X_GPIO_BASE+0x00);  	writel(ORION5X_GPIO_OUT_ENABLE, ORION5X_GPIO_BASE+0x04); +	writel(ORION5X_GPIO_IN_POLARITY, ORION5X_GPIO_BASE+0x0c);  	/* initialize timer */  	timer_init_r(); |