diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2011-12-16 15:14:10 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-01-02 15:00:27 +0100 |
commit | 1679cebce784def9f2e1423b22bda4d36aa631dc (patch) | |
tree | ada15549d3bf278a390914fb50d8157580875de2 /arch/arm/mach-imx/imx5.c | |
parent | 3ee217a69c7341efd44f8d0b5e8c0d0f154b071a (diff) | |
download | barebox-1679cebce784def9f2e1423b22bda4d36aa631dc.tar.gz barebox-1679cebce784def9f2e1423b22bda4d36aa631dc.tar.xz |
ARM i.MX5: prepare to add a imx51_lowlevel_init
- move code which can be shared between i.MX53 and i.MX51
to a common file
- rename mx53_init_lowlevel to imx53_init_lowlevel
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/mach-imx/imx5.c')
-rw-r--r-- | arch/arm/mach-imx/imx5.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/arch/arm/mach-imx/imx5.c b/arch/arm/mach-imx/imx5.c new file mode 100644 index 0000000000..9ec78b2afd --- /dev/null +++ b/arch/arm/mach-imx/imx5.c @@ -0,0 +1,58 @@ +#include <common.h> +#include <io.h> +#include <sizes.h> +#include <mach/imx5.h> +#include <mach/clock-imx51_53.h> + +void imx5_setup_pll(void __iomem *base, int freq, u32 op, u32 mfd, u32 mfn) +{ + u32 r; + + /* + * If freq < 300MHz, we need to set dpdck0_2_en to 0 + */ + r = 0x00000232; + if (freq >= 300) + r |= 0x1000; + + writel(r, base + MX5_PLL_DP_CTL); + + writel(0x2, base + MX5_PLL_DP_CONFIG); + + writel(op, base + MX5_PLL_DP_OP); + writel(op, base + MX5_PLL_DP_HFS_OP); + + writel(mfd, base + MX5_PLL_DP_MFD); + writel(mfd, base + MX5_PLL_DP_HFS_MFD); + + writel(mfn, base + MX5_PLL_DP_MFN); + writel(mfn, base + MX5_PLL_DP_HFS_MFN); + + writel(0x00001232, base + MX5_PLL_DP_CTL); + + while (!(readl(base + MX5_PLL_DP_CTL) & 1)); +} + +void imx5_init_lowlevel(void) +{ + u32 r; + + /* ARM errata ID #468414 */ + __asm__ __volatile__("mrc 15, 0, %0, c1, c0, 1":"=r"(r)); + r |= (1 << 5); /* enable L1NEON bit */ + r &= ~(1 << 1); /* explicitly disable L2 cache */ + __asm__ __volatile__("mcr 15, 0, %0, c1, c0, 1" : : "r"(r)); + + /* reconfigure L2 cache aux control reg */ + r = 0xc0 | /* tag RAM */ + 0x4 | /* data RAM */ + (1 << 24) | /* disable write allocate delay */ + (1 << 23) | /* disable write allocate combine */ + (1 << 22); /* disable write allocate */ + + __asm__ __volatile__("mcr 15, 1, %0, c9, c0, 2" : : "r"(r)); + + __asm__ __volatile__("mrc 15, 0, %0, c1, c0, 1":"=r"(r)); + r |= 1 << 1; /* enable L2 cache */ + __asm__ __volatile__("mcr 15, 0, %0, c1, c0, 1" : : "r"(r)); +} |