162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/arm/mach-spear13xx/spear13xx.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * SPEAr13XX machines common source file 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2012 ST Microelectronics 862306a36Sopenharmony_ci * Viresh Kumar <vireshk@kernel.org> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define pr_fmt(fmt) "SPEAr13xx: " fmt 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/amba/pl022.h> 1462306a36Sopenharmony_ci#include <linux/clk.h> 1562306a36Sopenharmony_ci#include <linux/clk/spear.h> 1662306a36Sopenharmony_ci#include <linux/clocksource.h> 1762306a36Sopenharmony_ci#include <linux/err.h> 1862306a36Sopenharmony_ci#include <linux/of.h> 1962306a36Sopenharmony_ci#include <asm/hardware/cache-l2x0.h> 2062306a36Sopenharmony_ci#include <asm/mach/map.h> 2162306a36Sopenharmony_ci#include "spear.h" 2262306a36Sopenharmony_ci#include "generic.h" 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_civoid __init spear13xx_l2x0_init(void) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci /* 2762306a36Sopenharmony_ci * 512KB (64KB/way), 8-way associativity, parity supported 2862306a36Sopenharmony_ci * 2962306a36Sopenharmony_ci * FIXME: 9th bit, of Auxiliary Controller register must be set 3062306a36Sopenharmony_ci * for some spear13xx devices for stable L2 operation. 3162306a36Sopenharmony_ci * 3262306a36Sopenharmony_ci * Enable Early BRESP, L2 prefetch for Instruction and Data, 3362306a36Sopenharmony_ci * write alloc and 'Full line of zero' options 3462306a36Sopenharmony_ci * 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci if (!IS_ENABLED(CONFIG_CACHE_L2X0)) 3762306a36Sopenharmony_ci return; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci writel_relaxed(0x06, VA_L2CC_BASE + L310_PREFETCH_CTRL); 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci /* 4262306a36Sopenharmony_ci * Program following latencies in order to make 4362306a36Sopenharmony_ci * SPEAr1340 work at 600 MHz 4462306a36Sopenharmony_ci */ 4562306a36Sopenharmony_ci writel_relaxed(0x221, VA_L2CC_BASE + L310_TAG_LATENCY_CTRL); 4662306a36Sopenharmony_ci writel_relaxed(0x441, VA_L2CC_BASE + L310_DATA_LATENCY_CTRL); 4762306a36Sopenharmony_ci l2x0_init(VA_L2CC_BASE, 0x30a00001, 0xfe0fffff); 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* 5162306a36Sopenharmony_ci * Following will create 16MB static virtual/physical mappings 5262306a36Sopenharmony_ci * PHYSICAL VIRTUAL 5362306a36Sopenharmony_ci * 0xB3000000 0xF9000000 5462306a36Sopenharmony_ci * 0xE0000000 0xFD000000 5562306a36Sopenharmony_ci * 0xEC000000 0xFC000000 5662306a36Sopenharmony_ci * 0xED000000 0xFB000000 5762306a36Sopenharmony_ci */ 5862306a36Sopenharmony_cistatic struct map_desc spear13xx_io_desc[] __initdata = { 5962306a36Sopenharmony_ci { 6062306a36Sopenharmony_ci .virtual = (unsigned long)VA_PERIP_GRP2_BASE, 6162306a36Sopenharmony_ci .pfn = __phys_to_pfn(PERIP_GRP2_BASE), 6262306a36Sopenharmony_ci .length = SZ_16M, 6362306a36Sopenharmony_ci .type = MT_DEVICE 6462306a36Sopenharmony_ci }, { 6562306a36Sopenharmony_ci .virtual = (unsigned long)VA_PERIP_GRP1_BASE, 6662306a36Sopenharmony_ci .pfn = __phys_to_pfn(PERIP_GRP1_BASE), 6762306a36Sopenharmony_ci .length = SZ_16M, 6862306a36Sopenharmony_ci .type = MT_DEVICE 6962306a36Sopenharmony_ci }, { 7062306a36Sopenharmony_ci .virtual = (unsigned long)VA_A9SM_AND_MPMC_BASE, 7162306a36Sopenharmony_ci .pfn = __phys_to_pfn(A9SM_AND_MPMC_BASE), 7262306a36Sopenharmony_ci .length = SZ_16M, 7362306a36Sopenharmony_ci .type = MT_DEVICE 7462306a36Sopenharmony_ci }, { 7562306a36Sopenharmony_ci .virtual = (unsigned long)VA_L2CC_BASE, 7662306a36Sopenharmony_ci .pfn = __phys_to_pfn(L2CC_BASE), 7762306a36Sopenharmony_ci .length = SZ_4K, 7862306a36Sopenharmony_ci .type = MT_DEVICE 7962306a36Sopenharmony_ci }, 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* This will create static memory mapping for selected devices */ 8362306a36Sopenharmony_civoid __init spear13xx_map_io(void) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci iotable_init(spear13xx_io_desc, ARRAY_SIZE(spear13xx_io_desc)); 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic void __init spear13xx_clk_init(void) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci if (of_machine_is_compatible("st,spear1310")) 9162306a36Sopenharmony_ci spear1310_clk_init(VA_MISC_BASE, VA_SPEAR1310_RAS_BASE); 9262306a36Sopenharmony_ci else if (of_machine_is_compatible("st,spear1340")) 9362306a36Sopenharmony_ci spear1340_clk_init(VA_MISC_BASE); 9462306a36Sopenharmony_ci else 9562306a36Sopenharmony_ci pr_err("%s: Unknown machine\n", __func__); 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_civoid __init spear13xx_timer_init(void) 9962306a36Sopenharmony_ci{ 10062306a36Sopenharmony_ci char pclk_name[] = "osc_24m_clk"; 10162306a36Sopenharmony_ci struct clk *gpt_clk, *pclk; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci spear13xx_clk_init(); 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci /* get the system timer clock */ 10662306a36Sopenharmony_ci gpt_clk = clk_get_sys("gpt0", NULL); 10762306a36Sopenharmony_ci if (IS_ERR(gpt_clk)) { 10862306a36Sopenharmony_ci pr_err("%s:couldn't get clk for gpt\n", __func__); 10962306a36Sopenharmony_ci BUG(); 11062306a36Sopenharmony_ci } 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci /* get the suitable parent clock for timer*/ 11362306a36Sopenharmony_ci pclk = clk_get(NULL, pclk_name); 11462306a36Sopenharmony_ci if (IS_ERR(pclk)) { 11562306a36Sopenharmony_ci pr_err("%s:couldn't get %s as parent for gpt\n", __func__, 11662306a36Sopenharmony_ci pclk_name); 11762306a36Sopenharmony_ci BUG(); 11862306a36Sopenharmony_ci } 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci clk_set_parent(gpt_clk, pclk); 12162306a36Sopenharmony_ci clk_put(gpt_clk); 12262306a36Sopenharmony_ci clk_put(pclk); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci spear_setup_of_timer(); 12562306a36Sopenharmony_ci timer_probe(); 12662306a36Sopenharmony_ci} 127