aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-imx/mach-imx6q.c
diff options
context:
space:
mode:
authorDirk Behme <dirk.behme@de.bosch.com>2013-04-26 04:13:56 -0400
committerShawn Guo <shawn.guo@linaro.org>2013-06-17 03:45:09 -0400
commitb3a9c315378ff811bf34393f2f0a6e8b9ffced3b (patch)
treeefb7315aba99bd79aecf017f1e6786b9415e1480 /arch/arm/mach-imx/mach-imx6q.c
parent75f83d06c3305e0f0a00e7d141acf8ceef608fe9 (diff)
ARM: i.MX6: add i.MX6 specific L2 cache configuration
To improve the performance and power consumption add an i.MX6 specific L2 cache initialization. This configuration is taken from Freescale's kernel patch "ENGR00153601 [MX6]Adjust L2 cache parameter" [1] with two additional improvements: a) The L2X0_POWER_CTRL has only the two bits we set. So no need to read the register before. Remove the register read done in Freescale's patch. b) In the L2X0_PREFETCH_CTRL register, besides the double linefill (bit[30]), additionally enable the instruction and data prefetch (bit[29-28]). Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com> Signed-off-by: Shawn Guo <shawn.guo@linaro.org> [1] http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/commit/arch/arm/mach-mx6/mm.c?h=imx_3.0.35_12.09.01&id=814656410b40c67a10b25300e51b0477b2bb96d1
Diffstat (limited to 'arch/arm/mach-imx/mach-imx6q.c')
-rw-r--r--arch/arm/mach-imx/mach-imx6q.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
index 5536fd81379a..ec4b7fc61edb 100644
--- a/arch/arm/mach-imx/mach-imx6q.c
+++ b/arch/arm/mach-imx/mach-imx6q.c
@@ -253,10 +253,44 @@ static void __init imx6q_map_io(void)
253 imx_scu_map_io(); 253 imx_scu_map_io();
254} 254}
255 255
256#ifdef CONFIG_CACHE_L2X0
257static void __init imx6q_init_l2cache(void)
258{
259 void __iomem *l2x0_base;
260 struct device_node *np;
261 unsigned int val;
262
263 np = of_find_compatible_node(NULL, NULL, "arm,pl310-cache");
264 if (!np)
265 goto out;
266
267 l2x0_base = of_iomap(np, 0);
268 if (!l2x0_base) {
269 of_node_put(np);
270 goto out;
271 }
272
273 /* Configure the L2 PREFETCH and POWER registers */
274 val = readl_relaxed(l2x0_base + L2X0_PREFETCH_CTRL);
275 val |= 0x70800000;
276 writel_relaxed(val, l2x0_base + L2X0_PREFETCH_CTRL);
277 val = L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN;
278 writel_relaxed(val, l2x0_base + L2X0_POWER_CTRL);
279
280 iounmap(l2x0_base);
281 of_node_put(np);
282
283out:
284 l2x0_of_init(0, ~0UL);
285}
286#else
287static inline void imx6q_init_l2cache(void) {}
288#endif
289
256static void __init imx6q_init_irq(void) 290static void __init imx6q_init_irq(void)
257{ 291{
258 imx6q_init_revision(); 292 imx6q_init_revision();
259 l2x0_of_init(0, ~0UL); 293 imx6q_init_l2cache();
260 imx_src_init(); 294 imx_src_init();
261 imx_gpc_init(); 295 imx_gpc_init();
262 irqchip_init(); 296 irqchip_init();