summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-imx/imx5.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2011-12-16 15:14:10 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-01-02 15:00:27 +0100
commit1679cebce784def9f2e1423b22bda4d36aa631dc (patch)
treeada15549d3bf278a390914fb50d8157580875de2 /arch/arm/mach-imx/imx5.c
parent3ee217a69c7341efd44f8d0b5e8c0d0f154b071a (diff)
downloadbarebox-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.c58
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));
+}