diff options
| author | Sascha Hauer <s.hauer@pengutronix.de> | 2008-03-30 11:30:43 +0100 | 
|---|---|---|
| committer | Peter Pearse <peter.pearse@arm.com> | 2008-03-30 11:30:43 +0100 | 
| commit | c98b47ad24b2d91f41c09a3d62d7f70ad84f4b7d (patch) | |
| tree | 59d23f1e9e65137d2e9b479304e74899d59ce4b5 /cpu/arm1136/mx31/generic.c | |
| parent | 8bf69d81782619187933a605f1a95ee1d069478d (diff) | |
| download | olio-uboot-2014.01-c98b47ad24b2d91f41c09a3d62d7f70ad84f4b7d.tar.xz olio-uboot-2014.01-c98b47ad24b2d91f41c09a3d62d7f70ad84f4b7d.zip  | |
core support for Freescale mx31
This patch adds the core support for Freescale mx31
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Guennadi Liakhovetski <lg@denx.de>
Diffstat (limited to 'cpu/arm1136/mx31/generic.c')
| -rw-r--r-- | cpu/arm1136/mx31/generic.c | 99 | 
1 files changed, 99 insertions, 0 deletions
diff --git a/cpu/arm1136/mx31/generic.c b/cpu/arm1136/mx31/generic.c new file mode 100644 index 000000000..297d616d5 --- /dev/null +++ b/cpu/arm1136/mx31/generic.c @@ -0,0 +1,99 @@ +/* + * (C) Copyright 2007 + * Sascha Hauer, Pengutronix + * + * 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/mx31-regs.h> + +static u32 mx31_decode_pll(u32 reg, u32 infreq) +{ +	u32 mfi = (reg >> 10) & 0xf; +	u32 mfn = reg & 0x3f; +	u32 mfd = (reg >> 16) & 0x3f; +	u32 pd =  (reg >> 26) & 0xf; + +	mfi = mfi <= 5 ? 5 : mfi; +	mfd += 1; +	pd += 1; + +	return ((2 * (infreq >> 10) * (mfi * mfd + mfn)) / +		(mfd * pd)) << 10; +} + +u32 mx31_get_mpl_dpdgck_clk(void) +{ +	u32 infreq; + +	if ((__REG(CCM_CCMR) & CCMR_PRCS_MASK) == CCMR_FPM) +		infreq = CONFIG_MX31_CLK32 * 1024; +	else +		infreq = CONFIG_MX31_HCLK_FREQ; + +	return mx31_decode_pll(__REG(CCM_MPCTL), infreq); } + +u32 mx31_get_mcu_main_clk(void) +{ +	/* For now we assume mpl_dpdgck_clk == mcu_main_clk +	 * which should be correct for most boards +	 */ +	return mx31_get_mpl_dpdgck_clk(); +} + +u32 mx31_get_ipg_clk(void) +{ +	u32 freq = mx31_get_mcu_main_clk(); +	u32 pdr0 = __REG(CCM_PDR0); + +	freq /= ((pdr0 >> 3) & 0x7) + 1; +	freq /= ((pdr0 >> 6) & 0x3) + 1; + +	return freq; +} + +void mx31_dump_clocks(void) +{ +	u32 cpufreq = mx31_get_mcu_main_clk(); +	printf("mx31 cpu clock: %dMHz\n", cpufreq / 1000000); +	printf("ipg clock     : %dHz\n", mx31_get_ipg_clk()); +} + +void mx31_gpio_mux(unsigned long mode) +{ +	unsigned long reg, shift, tmp; + +	reg = IOMUXC_BASE + (mode & 0xfc); +	shift = (~mode & 0x3) * 8; + +	tmp = __REG(reg); +	tmp &= ~(0xff << shift); +	tmp |= ((mode >> 8) & 0xff) << shift; +	__REG(reg) = tmp; +} + +#if defined(CONFIG_DISPLAY_CPUINFO) +int print_cpuinfo(void) +{ +	printf("CPU:   Freescale i.MX31 at %d MHz\n", +		mx31_get_mcu_main_clk() / 1000000); +	return 0; +} +#endif  |