diff options
Diffstat (limited to 'arch/arm/cpu')
| -rw-r--r-- | arch/arm/cpu/arm926ejs/config.mk | 2 | ||||
| -rw-r--r-- | arch/arm/cpu/arm926ejs/mxs/clock.c | 3 | ||||
| -rw-r--r-- | arch/arm/cpu/arm926ejs/mxs/mxs_init.h | 2 | ||||
| -rw-r--r-- | arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c | 16 | ||||
| -rw-r--r-- | arch/arm/cpu/arm926ejs/mxs/spl_power_init.c | 2 | ||||
| -rw-r--r-- | arch/arm/cpu/arm926ejs/mxs/timer.c | 39 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/Makefile | 2 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/config.mk | 2 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/mx6/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/mx6/lowlevel_init.S | 35 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/mx6/soc.c | 16 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/start.S | 19 | 
12 files changed, 85 insertions, 54 deletions
| diff --git a/arch/arm/cpu/arm926ejs/config.mk b/arch/arm/cpu/arm926ejs/config.mk index 47f24f580..6a3a1bb35 100644 --- a/arch/arm/cpu/arm926ejs/config.mk +++ b/arch/arm/cpu/arm926ejs/config.mk @@ -34,6 +34,6 @@ PLATFORM_RELFLAGS += $(PF_RELFLAGS_SLB_AT)  ifneq ($(CONFIG_IMX_CONFIG),) -ALL-y	+= $(OBJTREE)/u-boot.imx +ALL-y	+= $(obj)u-boot.imx  endif diff --git a/arch/arm/cpu/arm926ejs/mxs/clock.c b/arch/arm/cpu/arm926ejs/mxs/clock.c index 00b9aba45..43e766334 100644 --- a/arch/arm/cpu/arm926ejs/mxs/clock.c +++ b/arch/arm/cpu/arm926ejs/mxs/clock.c @@ -289,7 +289,8 @@ static uint32_t mxs_get_sspclk(enum mxs_sspclock ssp)  void mxs_set_ssp_busclock(unsigned int bus, uint32_t freq)  {  	struct mxs_ssp_regs *ssp_regs; -	const uint32_t sspclk = mxs_get_sspclk(bus); +	const enum mxs_sspclock clk = mxs_ssp_clock_by_bus(bus); +	const uint32_t sspclk = mxs_get_sspclk(clk);  	uint32_t reg;  	uint32_t divide, rate, tgtclk; diff --git a/arch/arm/cpu/arm926ejs/mxs/mxs_init.h b/arch/arm/cpu/arm926ejs/mxs/mxs_init.h index 2ddc5bc0c..084def5b1 100644 --- a/arch/arm/cpu/arm926ejs/mxs/mxs_init.h +++ b/arch/arm/cpu/arm926ejs/mxs/mxs_init.h @@ -30,7 +30,7 @@ void early_delay(int delay);  void mxs_power_init(void); -#ifdef	CONFIG_SPL_MX28_PSWITCH_WAIT +#ifdef	CONFIG_SPL_MXS_PSWITCH_WAIT  void mxs_power_wait_pswitch(void);  #else  static inline void mxs_power_wait_pswitch(void) { } diff --git a/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c index f8392f639..fdac73cfa 100644 --- a/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c +++ b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c @@ -27,6 +27,7 @@  #include <config.h>  #include <asm/io.h>  #include <asm/arch/imx-regs.h> +#include <asm/arch/sys_proto.h>  #include <linux/compiler.h>  #include "mxs_init.h" @@ -119,6 +120,10 @@ static void initialize_dram_values(void)  		writel(dram_vals[i], MXS_DRAM_BASE + (4 * i));  #ifdef CONFIG_MX23 +	/* +	 * Enable tRAS lockout in HW_DRAM_CTL08 ; it must be the last +	 * element to be set +	 */  	writel((1 << 24), MXS_DRAM_BASE + (4 * 8));  #endif  } @@ -229,7 +234,7 @@ static void mx23_mem_setup_vddmem(void)  	struct mxs_power_regs *power_regs =  		(struct mxs_power_regs *)MXS_POWER_BASE; -	writel((0x12 << POWER_VDDMEMCTRL_TRG_OFFSET) | +	writel((0x10 << POWER_VDDMEMCTRL_TRG_OFFSET) |  		POWER_VDDMEMCTRL_ENABLE_ILIMIT |  		POWER_VDDMEMCTRL_ENABLE_LINREG |  		POWER_VDDMEMCTRL_PULLDOWN_ACTIVE, @@ -237,13 +242,20 @@ static void mx23_mem_setup_vddmem(void)  	early_delay(10000); -	writel((0x12 << POWER_VDDMEMCTRL_TRG_OFFSET) | +	writel((0x10 << POWER_VDDMEMCTRL_TRG_OFFSET) |  		POWER_VDDMEMCTRL_ENABLE_LINREG,  		&power_regs->hw_power_vddmemctrl);  }  static void mx23_mem_init(void)  { +	/* +	 * Reset/ungate the EMI block. This is essential, otherwise the system +	 * suffers from memory instability. This thing is mx23 specific and is +	 * no longer present on mx28. +	 */ +	mxs_reset_block((struct mxs_register_32 *)MXS_EMI_BASE); +  	mx23_mem_setup_vddmem();  	/* diff --git a/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c b/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c index e9d6302b7..287c698ff 100644 --- a/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c +++ b/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c @@ -921,7 +921,7 @@ void mxs_power_init(void)  	early_delay(1000);  } -#ifdef	CONFIG_SPL_MX28_PSWITCH_WAIT +#ifdef	CONFIG_SPL_MXS_PSWITCH_WAIT  void mxs_power_wait_pswitch(void)  {  	struct mxs_power_regs *power_regs = diff --git a/arch/arm/cpu/arm926ejs/mxs/timer.c b/arch/arm/cpu/arm926ejs/mxs/timer.c index 373841180..2039106e4 100644 --- a/arch/arm/cpu/arm926ejs/mxs/timer.c +++ b/arch/arm/cpu/arm926ejs/mxs/timer.c @@ -32,7 +32,11 @@  #include <asm/arch/sys_proto.h>  /* Maximum fixed count */ -#define TIMER_LOAD_VAL	0xffffffff +#if defined(CONFIG_MX23) +#define TIMER_LOAD_VAL 0xffff +#elif defined(CONFIG_MX28) +#define TIMER_LOAD_VAL 0xffffffff +#endif  DECLARE_GLOBAL_DATA_PTR; @@ -42,22 +46,22 @@ DECLARE_GLOBAL_DATA_PTR;  /*   * This driver uses 1kHz clock source.   */ -#define	MX28_INCREMENTER_HZ		1000 +#define	MXS_INCREMENTER_HZ		1000  static inline unsigned long tick_to_time(unsigned long tick)  { -	return tick / (MX28_INCREMENTER_HZ / CONFIG_SYS_HZ); +	return tick / (MXS_INCREMENTER_HZ / CONFIG_SYS_HZ);  }  static inline unsigned long time_to_tick(unsigned long time)  { -	return time * (MX28_INCREMENTER_HZ / CONFIG_SYS_HZ); +	return time * (MXS_INCREMENTER_HZ / CONFIG_SYS_HZ);  }  /* Calculate how many ticks happen in "us" microseconds */  static inline unsigned long us_to_tick(unsigned long us)  { -	return (us * MX28_INCREMENTER_HZ) / 1000000; +	return (us * MXS_INCREMENTER_HZ) / 1000000;  }  int timer_init(void) @@ -69,7 +73,11 @@ int timer_init(void)  	mxs_reset_block(&timrot_regs->hw_timrot_rotctrl_reg);  	/* Set fixed_count to 0 */ +#if defined(CONFIG_MX23) +	writel(0, &timrot_regs->hw_timrot_timcount0); +#elif defined(CONFIG_MX28)  	writel(0, &timrot_regs->hw_timrot_fixed_count0); +#endif  	/* Set UPDATE bit and 1Khz frequency */  	writel(TIMROT_TIMCTRLn_UPDATE | TIMROT_TIMCTRLn_RELOAD | @@ -77,7 +85,11 @@ int timer_init(void)  		&timrot_regs->hw_timrot_timctrl0);  	/* Set fixed_count to maximal value */ +#if defined(CONFIG_MX23) +	writel(TIMER_LOAD_VAL - 1, &timrot_regs->hw_timrot_timcount0); +#elif defined(CONFIG_MX28)  	writel(TIMER_LOAD_VAL, &timrot_regs->hw_timrot_fixed_count0); +#endif  	return 0;  } @@ -86,9 +98,16 @@ unsigned long long get_ticks(void)  {  	struct mxs_timrot_regs *timrot_regs =  		(struct mxs_timrot_regs *)MXS_TIMROT_BASE; +	uint32_t now;  	/* Current tick value */ -	uint32_t now = readl(&timrot_regs->hw_timrot_running_count0); +#if defined(CONFIG_MX23) +	/* Upper bits are the valid ones. */ +	now = readl(&timrot_regs->hw_timrot_timcount0) >> +		TIMROT_RUNNING_COUNTn_RUNNING_COUNT_OFFSET; +#elif defined(CONFIG_MX28) +	now = readl(&timrot_regs->hw_timrot_running_count0); +#endif  	if (lastdec >= now) {  		/* @@ -117,17 +136,17 @@ ulong get_timer(ulong base)  }  /* We use the HW_DIGCTL_MICROSECONDS register for sub-millisecond timer. */ -#define	MX28_HW_DIGCTL_MICROSECONDS	0x8001c0c0 +#define	MXS_HW_DIGCTL_MICROSECONDS	0x8001c0c0  void __udelay(unsigned long usec)  {  	uint32_t old, new, incr;  	uint32_t counter = 0; -	old = readl(MX28_HW_DIGCTL_MICROSECONDS); +	old = readl(MXS_HW_DIGCTL_MICROSECONDS);  	while (counter < usec) { -		new = readl(MX28_HW_DIGCTL_MICROSECONDS); +		new = readl(MXS_HW_DIGCTL_MICROSECONDS);  		/* Check if the timer wrapped. */  		if (new < old) { @@ -152,5 +171,5 @@ void __udelay(unsigned long usec)  ulong get_tbclk(void)  { -	return MX28_INCREMENTER_HZ; +	return MXS_INCREMENTER_HZ;  } diff --git a/arch/arm/cpu/armv7/Makefile b/arch/arm/cpu/armv7/Makefile index ee8c2b3fa..4668b3cf2 100644 --- a/arch/arm/cpu/armv7/Makefile +++ b/arch/arm/cpu/armv7/Makefile @@ -32,7 +32,7 @@ COBJS	+= cache_v7.o  COBJS	+= cpu.o  COBJS	+= syslib.o -ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX)$(CONFIG_TEGRA),) +ifneq ($(CONFIG_AM33XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX)$(CONFIG_TEGRA)$(CONFIG_MX6),)  SOBJS	+= lowlevel_init.o  endif diff --git a/arch/arm/cpu/armv7/config.mk b/arch/arm/cpu/armv7/config.mk index 350e94639..9c3e2f3ce 100644 --- a/arch/arm/cpu/armv7/config.mk +++ b/arch/arm/cpu/armv7/config.mk @@ -40,5 +40,5 @@ PF_NO_UNALIGNED := $(call cc-option, -mno-unaligned-access,)  PLATFORM_NO_UNALIGNED := $(PF_NO_UNALIGNED)  ifneq ($(CONFIG_IMX_CONFIG),) -ALL-y	+= $(OBJTREE)/u-boot.imx +ALL-y	+= $(obj)u-boot.imx  endif diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile index cbce411cc..4f9ca6890 100644 --- a/arch/arm/cpu/armv7/mx6/Makefile +++ b/arch/arm/cpu/armv7/mx6/Makefile @@ -28,7 +28,6 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(SOC).o  COBJS	= soc.o clock.o -SOBJS   = lowlevel_init.o  SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)  OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/arch/arm/cpu/armv7/mx6/lowlevel_init.S b/arch/arm/cpu/armv7/mx6/lowlevel_init.S deleted file mode 100644 index 7b60ca745..000000000 --- a/arch/arm/cpu/armv7/mx6/lowlevel_init.S +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. - * - * 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 - */ -.section ".text.init", "x" - -#include <linux/linkage.h> - -.macro init_arm_errata -	/* ARM erratum ID #743622 */ -	mrc	p15, 0, r10, c15, c0, 1		/* read diagnostic register */ -	orr	r10, r10, #1 << 6		/* set bit #6 */ -	/* ARM erratum ID #751472 */ -	orr	r10, r10, #1 << 11		/* set bit #11 */ -	mcr	p15, 0, r10, c15, c0, 1		/* write diagnostic register */ -.endm - -ENTRY(lowlevel_init) -	init_arm_errata -	mov pc, lr -ENDPROC(lowlevel_init) diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c index a8aad5dd0..193ba1240 100644 --- a/arch/arm/cpu/armv7/mx6/soc.c +++ b/arch/arm/cpu/armv7/mx6/soc.c @@ -30,6 +30,7 @@  #include <asm/arch/clock.h>  #include <asm/arch/sys_proto.h>  #include <asm/imx-common/boot_mode.h> +#include <stdbool.h>  struct scu_regs {  	u32	ctrl; @@ -121,12 +122,23 @@ void set_vddsoc(u32 mv)  	writel(reg, &anatop->reg_core);  } +static void imx_set_wdog_powerdown(bool enable) +{ +	struct wdog_regs *wdog1 = (struct wdog_regs *)WDOG1_BASE_ADDR; +	struct wdog_regs *wdog2 = (struct wdog_regs *)WDOG2_BASE_ADDR; + +	/* Write to the PDE (Power Down Enable) bit */ +	writew(enable, &wdog1->wmcr); +	writew(enable, &wdog2->wmcr); +} +  int arch_cpu_init(void)  {  	init_aips();  	set_vddsoc(1200);	/* Set VDDSOC to 1.2V */ +	imx_set_wdog_powerdown(false); /* Disable PDE bit of WMCR register */  	return 0;  } @@ -193,3 +205,7 @@ const struct boot_mode soc_boot_modes[] = {  	{"esdhc4",	MAKE_CFGVAL(0x40, 0x38, 0x00, 0x00)},  	{NULL,		0},  }; + +void s_init(void) +{ +} diff --git a/arch/arm/cpu/armv7/start.S b/arch/arm/cpu/armv7/start.S index 6b59529d5..30f02d394 100644 --- a/arch/arm/cpu/armv7/start.S +++ b/arch/arm/cpu/armv7/start.S @@ -309,6 +309,25 @@ ENTRY(cpu_init_cp15)  	orr	r0, r0, #0x00001000	@ set bit 12 (I) I-cache  #endif  	mcr	p15, 0, r0, c1, c0, 0 + +#ifdef CONFIG_ARM_ERRATA_742230 +	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register +	orr	r0, r0, #1 << 4		@ set bit #4 +	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register +#endif + +#ifdef CONFIG_ARM_ERRATA_743622 +	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register +	orr	r0, r0, #1 << 6		@ set bit #6 +	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register +#endif + +#ifdef CONFIG_ARM_ERRATA_751472 +	mrc	p15, 0, r0, c15, c0, 1	@ read diagnostic register +	orr	r0, r0, #1 << 11	@ set bit #11 +	mcr	p15, 0, r0, c15, c0, 1	@ write diagnostic register +#endif +  	mov	pc, lr			@ back to my caller  ENDPROC(cpu_init_cp15) |