diff options
Diffstat (limited to 'arch/arm')
| -rw-r--r-- | arch/arm/cpu/arm926ejs/mxs/mxs.c | 63 | ||||
| -rw-r--r-- | arch/arm/imx-common/Makefile | 3 | ||||
| -rw-r--r-- | arch/arm/imx-common/misc.c | 84 | ||||
| -rw-r--r-- | arch/arm/include/asm/arch-mx6/sys_proto.h | 10 | 
4 files changed, 97 insertions, 63 deletions
| diff --git a/arch/arm/cpu/arm926ejs/mxs/mxs.c b/arch/arm/cpu/arm926ejs/mxs/mxs.c index 6616f4e77..a5e388b5a 100644 --- a/arch/arm/cpu/arm926ejs/mxs/mxs.c +++ b/arch/arm/cpu/arm926ejs/mxs/mxs.c @@ -39,12 +39,6 @@  DECLARE_GLOBAL_DATA_PTR; -/* 1 second delay should be plenty of time for block reset. */ -#define	RESET_MAX_TIMEOUT	1000000 - -#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) {} @@ -82,63 +76,6 @@ void enable_caches(void)  #endif  } -int mxs_wait_mask_set(struct mxs_register_32 *reg, uint32_t mask, unsigned -								int timeout) -{ -	while (--timeout) { -		if ((readl(®->reg) & mask) == mask) -			break; -		udelay(1); -	} - -	return !timeout; -} - -int mxs_wait_mask_clr(struct mxs_register_32 *reg, uint32_t mask, unsigned -								int timeout) -{ -	while (--timeout) { -		if ((readl(®->reg) & mask) == 0) -			break; -		udelay(1); -	} - -	return !timeout; -} - -int mxs_reset_block(struct mxs_register_32 *reg) -{ -	/* Clear SFTRST */ -	writel(MXS_BLOCK_SFTRST, ®->reg_clr); - -	if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT)) -		return 1; - -	/* Clear CLKGATE */ -	writel(MXS_BLOCK_CLKGATE, ®->reg_clr); - -	/* Set SFTRST */ -	writel(MXS_BLOCK_SFTRST, ®->reg_set); - -	/* Wait for CLKGATE being set */ -	if (mxs_wait_mask_set(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT)) -		return 1; - -	/* Clear SFTRST */ -	writel(MXS_BLOCK_SFTRST, ®->reg_clr); - -	if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT)) -		return 1; - -	/* Clear CLKGATE */ -	writel(MXS_BLOCK_CLKGATE, ®->reg_clr); - -	if (mxs_wait_mask_clr(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT)) -		return 1; - -	return 0; -} -  void mx28_fixup_vt(uint32_t start_addr)  {  	uint32_t *vt = (uint32_t *)0x20; diff --git a/arch/arm/imx-common/Makefile b/arch/arm/imx-common/Makefile index 44b682280..930943942 100644 --- a/arch/arm/imx-common/Makefile +++ b/arch/arm/imx-common/Makefile @@ -31,6 +31,9 @@ ifeq ($(SOC),$(filter $(SOC),mx5 mx6))  COBJS-y	= iomux-v3.o timer.o cpu.o speed.o  COBJS-$(CONFIG_I2C_MXC) += i2c-mxv7.o  endif +ifeq ($(SOC),$(filter $(SOC),mx6 mxs)) +COBJS-y	+= misc.o +endif  COBJS-$(CONFIG_CMD_BMODE) += cmd_bmode.o  COBJS-$(CONFIG_CMD_HDMIDETECT) += cmd_hdmidet.o  COBJS	:= $(sort $(COBJS-y)) diff --git a/arch/arm/imx-common/misc.c b/arch/arm/imx-common/misc.c new file mode 100644 index 000000000..220785ca9 --- /dev/null +++ b/arch/arm/imx-common/misc.c @@ -0,0 +1,84 @@ +/* + * Copyright 2013 Stefan Roese <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. + */ + +#include <common.h> +#include <asm/errno.h> +#include <asm/io.h> +#include <asm/imx-common/regs-common.h> + +/* 1 second delay should be plenty of time for block reset. */ +#define	RESET_MAX_TIMEOUT	1000000 + +#define	MXS_BLOCK_SFTRST	(1 << 31) +#define	MXS_BLOCK_CLKGATE	(1 << 30) + +int mxs_wait_mask_set(struct mxs_register_32 *reg, uint32_t mask, unsigned +								int timeout) +{ +	while (--timeout) { +		if ((readl(®->reg) & mask) == mask) +			break; +		udelay(1); +	} + +	return !timeout; +} + +int mxs_wait_mask_clr(struct mxs_register_32 *reg, uint32_t mask, unsigned +								int timeout) +{ +	while (--timeout) { +		if ((readl(®->reg) & mask) == 0) +			break; +		udelay(1); +	} + +	return !timeout; +} + +int mxs_reset_block(struct mxs_register_32 *reg) +{ +	/* Clear SFTRST */ +	writel(MXS_BLOCK_SFTRST, ®->reg_clr); + +	if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT)) +		return 1; + +	/* Clear CLKGATE */ +	writel(MXS_BLOCK_CLKGATE, ®->reg_clr); + +	/* Set SFTRST */ +	writel(MXS_BLOCK_SFTRST, ®->reg_set); + +	/* Wait for CLKGATE being set */ +	if (mxs_wait_mask_set(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT)) +		return 1; + +	/* Clear SFTRST */ +	writel(MXS_BLOCK_SFTRST, ®->reg_clr); + +	if (mxs_wait_mask_clr(reg, MXS_BLOCK_SFTRST, RESET_MAX_TIMEOUT)) +		return 1; + +	/* Clear CLKGATE */ +	writel(MXS_BLOCK_CLKGATE, ®->reg_clr); + +	if (mxs_wait_mask_clr(reg, MXS_BLOCK_CLKGATE, RESET_MAX_TIMEOUT)) +		return 1; + +	return 0; +} diff --git a/arch/arm/include/asm/arch-mx6/sys_proto.h b/arch/arm/include/asm/arch-mx6/sys_proto.h index 319329761..38e4e516e 100644 --- a/arch/arm/include/asm/arch-mx6/sys_proto.h +++ b/arch/arm/include/asm/arch-mx6/sys_proto.h @@ -24,6 +24,8 @@  #ifndef _SYS_PROTO_H_  #define _SYS_PROTO_H_ +#include <asm/imx-common/regs-common.h> +  #define MXC_CPU_MX51		0x51  #define MXC_CPU_MX53		0x53  #define MXC_CPU_MX6SL		0x60 @@ -46,4 +48,12 @@ void set_vddsoc(u32 mv);  int fecmxc_initialize(bd_t *bis);  u32 get_ahb_clk(void);  u32 get_periph_clk(void); + +int mxs_reset_block(struct mxs_register_32 *reg); +int mxs_wait_mask_set(struct mxs_register_32 *reg, +		       uint32_t mask, +		       unsigned int timeout); +int mxs_wait_mask_clr(struct mxs_register_32 *reg, +		       uint32_t mask, +		       unsigned int timeout);  #endif |