1a7ed099fSArnd Bergmann /* 2a7ed099fSArnd Bergmann * arch/arm/mach-spear13xx/spear13xx.c 3a7ed099fSArnd Bergmann * 4a7ed099fSArnd Bergmann * SPEAr13XX machines common source file 5a7ed099fSArnd Bergmann * 6a7ed099fSArnd Bergmann * Copyright (C) 2012 ST Microelectronics 7a7ed099fSArnd Bergmann * Viresh Kumar <viresh.linux@gmail.com> 8a7ed099fSArnd Bergmann * 9a7ed099fSArnd Bergmann * This file is licensed under the terms of the GNU General Public 10a7ed099fSArnd Bergmann * License version 2. This program is licensed "as is" without any 11a7ed099fSArnd Bergmann * warranty of any kind, whether express or implied. 12a7ed099fSArnd Bergmann */ 13a7ed099fSArnd Bergmann 14a7ed099fSArnd Bergmann #define pr_fmt(fmt) "SPEAr13xx: " fmt 15a7ed099fSArnd Bergmann 16a7ed099fSArnd Bergmann #include <linux/amba/pl022.h> 17a7ed099fSArnd Bergmann #include <linux/clk.h> 18442a33ebSArnd Bergmann #include <linux/clocksource.h> 19a7ed099fSArnd Bergmann #include <linux/err.h> 20a7ed099fSArnd Bergmann #include <linux/of.h> 21a7ed099fSArnd Bergmann #include <asm/hardware/cache-l2x0.h> 22a7ed099fSArnd Bergmann #include <asm/mach/map.h> 23a7ed099fSArnd Bergmann #include <mach/spear.h> 24442a33ebSArnd Bergmann #include "generic.h" 25a7ed099fSArnd Bergmann 26a7ed099fSArnd Bergmann void __init spear13xx_l2x0_init(void) 27a7ed099fSArnd Bergmann { 28a7ed099fSArnd Bergmann /* 29a7ed099fSArnd Bergmann * 512KB (64KB/way), 8-way associativity, parity supported 30a7ed099fSArnd Bergmann * 31a7ed099fSArnd Bergmann * FIXME: 9th bit, of Auxillary Controller register must be set 32a7ed099fSArnd Bergmann * for some spear13xx devices for stable L2 operation. 33a7ed099fSArnd Bergmann * 34a7ed099fSArnd Bergmann * Enable Early BRESP, L2 prefetch for Instruction and Data, 35a7ed099fSArnd Bergmann * write alloc and 'Full line of zero' options 36a7ed099fSArnd Bergmann * 37a7ed099fSArnd Bergmann */ 385497e7b8SOlof Johansson if (!IS_ENABLED(CONFIG_CACHE_L2X0)) 395497e7b8SOlof Johansson return; 40a7ed099fSArnd Bergmann 411a5a954cSRussell King writel_relaxed(0x06, VA_L2CC_BASE + L310_PREFETCH_CTRL); 42a7ed099fSArnd Bergmann 43a7ed099fSArnd Bergmann /* 44a7ed099fSArnd Bergmann * Program following latencies in order to make 45a7ed099fSArnd Bergmann * SPEAr1340 work at 600 MHz 46a7ed099fSArnd Bergmann */ 471a5a954cSRussell King writel_relaxed(0x221, VA_L2CC_BASE + L310_TAG_LATENCY_CTRL); 481a5a954cSRussell King writel_relaxed(0x441, VA_L2CC_BASE + L310_DATA_LATENCY_CTRL); 49adf4b00eSRussell King l2x0_init(VA_L2CC_BASE, 0x30a00001, 0xfe0fffff); 50a7ed099fSArnd Bergmann } 51a7ed099fSArnd Bergmann 52a7ed099fSArnd Bergmann /* 53a7ed099fSArnd Bergmann * Following will create 16MB static virtual/physical mappings 54a7ed099fSArnd Bergmann * PHYSICAL VIRTUAL 55a7ed099fSArnd Bergmann * 0xB3000000 0xFE000000 56a7ed099fSArnd Bergmann * 0xE0000000 0xFD000000 57a7ed099fSArnd Bergmann * 0xEC000000 0xFC000000 58a7ed099fSArnd Bergmann * 0xED000000 0xFB000000 59a7ed099fSArnd Bergmann */ 60a7ed099fSArnd Bergmann struct map_desc spear13xx_io_desc[] __initdata = { 61a7ed099fSArnd Bergmann { 62a7ed099fSArnd Bergmann .virtual = (unsigned long)VA_PERIP_GRP2_BASE, 63a7ed099fSArnd Bergmann .pfn = __phys_to_pfn(PERIP_GRP2_BASE), 64a7ed099fSArnd Bergmann .length = SZ_16M, 65a7ed099fSArnd Bergmann .type = MT_DEVICE 66a7ed099fSArnd Bergmann }, { 67a7ed099fSArnd Bergmann .virtual = (unsigned long)VA_PERIP_GRP1_BASE, 68a7ed099fSArnd Bergmann .pfn = __phys_to_pfn(PERIP_GRP1_BASE), 69a7ed099fSArnd Bergmann .length = SZ_16M, 70a7ed099fSArnd Bergmann .type = MT_DEVICE 71a7ed099fSArnd Bergmann }, { 72a7ed099fSArnd Bergmann .virtual = (unsigned long)VA_A9SM_AND_MPMC_BASE, 73a7ed099fSArnd Bergmann .pfn = __phys_to_pfn(A9SM_AND_MPMC_BASE), 74a7ed099fSArnd Bergmann .length = SZ_16M, 75a7ed099fSArnd Bergmann .type = MT_DEVICE 76a7ed099fSArnd Bergmann }, { 77a7ed099fSArnd Bergmann .virtual = (unsigned long)VA_L2CC_BASE, 78a7ed099fSArnd Bergmann .pfn = __phys_to_pfn(L2CC_BASE), 79a7ed099fSArnd Bergmann .length = SZ_4K, 80a7ed099fSArnd Bergmann .type = MT_DEVICE 81a7ed099fSArnd Bergmann }, 82a7ed099fSArnd Bergmann }; 83a7ed099fSArnd Bergmann 84a7ed099fSArnd Bergmann /* This will create static memory mapping for selected devices */ 85a7ed099fSArnd Bergmann void __init spear13xx_map_io(void) 86a7ed099fSArnd Bergmann { 87a7ed099fSArnd Bergmann iotable_init(spear13xx_io_desc, ARRAY_SIZE(spear13xx_io_desc)); 88a7ed099fSArnd Bergmann } 89a7ed099fSArnd Bergmann 90a7ed099fSArnd Bergmann static void __init spear13xx_clk_init(void) 91a7ed099fSArnd Bergmann { 92a7ed099fSArnd Bergmann if (of_machine_is_compatible("st,spear1310")) 93d9909ebeSArnd Bergmann spear1310_clk_init(VA_MISC_BASE, VA_SPEAR1310_RAS_BASE); 94a7ed099fSArnd Bergmann else if (of_machine_is_compatible("st,spear1340")) 95d9909ebeSArnd Bergmann spear1340_clk_init(VA_MISC_BASE); 96a7ed099fSArnd Bergmann else 97a7ed099fSArnd Bergmann pr_err("%s: Unknown machine\n", __func__); 98a7ed099fSArnd Bergmann } 99a7ed099fSArnd Bergmann 100a7ed099fSArnd Bergmann void __init spear13xx_timer_init(void) 101a7ed099fSArnd Bergmann { 102a7ed099fSArnd Bergmann char pclk_name[] = "osc_24m_clk"; 103a7ed099fSArnd Bergmann struct clk *gpt_clk, *pclk; 104a7ed099fSArnd Bergmann 105a7ed099fSArnd Bergmann spear13xx_clk_init(); 106a7ed099fSArnd Bergmann 107a7ed099fSArnd Bergmann /* get the system timer clock */ 108a7ed099fSArnd Bergmann gpt_clk = clk_get_sys("gpt0", NULL); 109a7ed099fSArnd Bergmann if (IS_ERR(gpt_clk)) { 110a7ed099fSArnd Bergmann pr_err("%s:couldn't get clk for gpt\n", __func__); 111a7ed099fSArnd Bergmann BUG(); 112a7ed099fSArnd Bergmann } 113a7ed099fSArnd Bergmann 114a7ed099fSArnd Bergmann /* get the suitable parent clock for timer*/ 115a7ed099fSArnd Bergmann pclk = clk_get(NULL, pclk_name); 116a7ed099fSArnd Bergmann if (IS_ERR(pclk)) { 117a7ed099fSArnd Bergmann pr_err("%s:couldn't get %s as parent for gpt\n", __func__, 118a7ed099fSArnd Bergmann pclk_name); 119a7ed099fSArnd Bergmann BUG(); 120a7ed099fSArnd Bergmann } 121a7ed099fSArnd Bergmann 122a7ed099fSArnd Bergmann clk_set_parent(gpt_clk, pclk); 123a7ed099fSArnd Bergmann clk_put(gpt_clk); 124a7ed099fSArnd Bergmann clk_put(pclk); 125a7ed099fSArnd Bergmann 126a7ed099fSArnd Bergmann spear_setup_of_timer(); 127442a33ebSArnd Bergmann clocksource_of_init(); 128a7ed099fSArnd Bergmann } 129