common.c revision dcf9c7f9f4c5acd9ea72782263d2d76bbeadd9f7
1b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn/* 2b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * This file contains common code that is intended to be used across 3b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * boards so that it's not replicated. 4b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * 5b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * Copyright (C) 2011 Xilinx 6b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * 7b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * This software is licensed under the terms of the GNU General Public 8b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * License version 2, as published by the Free Software Foundation, and 9b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * may be copied, distributed, and modified under those terms. 10b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * 11b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * This program is distributed in the hope that it will be useful, 12b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * but WITHOUT ANY WARRANTY; without even the implied warranty of 13b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn * GNU General Public License for more details. 15b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn */ 16b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn 17b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <linux/init.h> 18b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <linux/kernel.h> 19b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <linux/cpumask.h> 20b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <linux/platform_device.h> 21b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <linux/clk.h> 224a32c74e762236a53627536b9b9c1693d3073359Michal Simek#include <linux/clk-provider.h> 230f586fbf6f6a9119392a5cb0f193ac11c753b09eJosh Cartwright#include <linux/clk/zynq.h> 24e932900a3279b5dbb6d8f43c7b369003620e137cMichal Simek#include <linux/clocksource.h> 250f586fbf6f6a9119392a5cb0f193ac11c753b09eJosh Cartwright#include <linux/of_address.h> 26b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <linux/of_irq.h> 27b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <linux/of_platform.h> 283d64b4496f5fd90618106555344205a522178c0cArnd Bergmann#include <linux/of.h> 2946f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek#include <linux/memblock.h> 309f4f5d26c66153bc63ea60f4f05dd6f19e9e7b48Soren Brinkmann#include <linux/irqchip.h> 319f4f5d26c66153bc63ea60f4f05dd6f19e9e7b48Soren Brinkmann#include <linux/irqchip/arm-gic.h> 32b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn 333d64b4496f5fd90618106555344205a522178c0cArnd Bergmann#include <asm/mach/arch.h> 34b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <asm/mach/map.h> 3503e07595febc4857b2b6ad756826f369c7628ec8Josh Cartwright#include <asm/mach/time.h> 363d64b4496f5fd90618106555344205a522178c0cArnd Bergmann#include <asm/mach-types.h> 37b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <asm/page.h> 389a45eb691d8712b64a733178746557f708043444Josh Cartwright#include <asm/pgtable.h> 39732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek#include <asm/smp_scu.h> 40b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include <asm/hardware/cache-l2x0.h> 41b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn 42b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn#include "common.h" 43b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn 44732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simekvoid __iomem *zynq_scu_base; 45732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek 4646f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek/** 4746f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek * zynq_memory_init - Initialize special memory 4846f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek * 4946f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek * We need to stop things allocating the low memory as DMA can't work in 5046f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek * the 1st 512K of memory. 5146f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek */ 5246f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simekstatic void __init zynq_memory_init(void) 5346f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek{ 5446f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek if (!__pa(PAGE_OFFSET)) 5546f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek memblock_reserve(__pa(PAGE_OFFSET), __pa(swapper_pg_dir)); 5646f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek} 5746f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek 583e8ceca6c76ec2d5ee47ece0420cf10d041cf58fDaniel Lezcanostatic struct platform_device zynq_cpuidle_device = { 593e8ceca6c76ec2d5ee47ece0420cf10d041cf58fDaniel Lezcano .name = "cpuidle-zynq", 603e8ceca6c76ec2d5ee47ece0420cf10d041cf58fDaniel Lezcano}; 613e8ceca6c76ec2d5ee47ece0420cf10d041cf58fDaniel Lezcano 62b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn/** 63889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simek * zynq_init_machine - System specific initialization, intended to be 64889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simek * called from board specific initialization. 65b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn */ 66889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simekstatic void __init zynq_init_machine(void) 67b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn{ 68cd325295871fbd172340a73f323f6a19c0b0525dSoren Brinkmann struct platform_device_info devinfo = { .name = "cpufreq-cpu0", }; 69cd325295871fbd172340a73f323f6a19c0b0525dSoren Brinkmann 70f4d5d7b7c60c0258f7556f5cfddec2934666aa77Soren Brinkmann of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 713e8ceca6c76ec2d5ee47ece0420cf10d041cf58fDaniel Lezcano 723e8ceca6c76ec2d5ee47ece0420cf10d041cf58fDaniel Lezcano platform_device_register(&zynq_cpuidle_device); 73cd325295871fbd172340a73f323f6a19c0b0525dSoren Brinkmann platform_device_register_full(&devinfo); 74016f4dcae81e842a2b7dbfbc0fc9257f9f16e785Michal Simek 75016f4dcae81e842a2b7dbfbc0fc9257f9f16e785Michal Simek zynq_slcr_init(); 76b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn} 77b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn 78889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simekstatic void __init zynq_timer_init(void) 7903e07595febc4857b2b6ad756826f369c7628ec8Josh Cartwright{ 80016f4dcae81e842a2b7dbfbc0fc9257f9f16e785Michal Simek zynq_early_slcr_init(); 816f69c7f21ce89409ccc54bd596434fa61d5b26ffSteffen Trumtrar 82b0504e39c27b00101c9c1fa2c58fd896ae0f64f5Michal Simek zynq_clock_init(); 834a32c74e762236a53627536b9b9c1693d3073359Michal Simek of_clk_init(NULL); 84c5263bb8b7944f1e34b36b5ea8a9119fc48a31aeMichal Simek clocksource_of_init(); 8503e07595febc4857b2b6ad756826f369c7628ec8Josh Cartwright} 8603e07595febc4857b2b6ad756826f369c7628ec8Josh Cartwright 87732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simekstatic struct map_desc zynq_cortex_a9_scu_map __initdata = { 88732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek .length = SZ_256, 89732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek .type = MT_DEVICE, 90732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek}; 91732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek 92732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simekstatic void __init zynq_scu_map_io(void) 93732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek{ 94732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek unsigned long base; 95732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek 96732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek base = scu_a9_get_base(); 97732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek zynq_cortex_a9_scu_map.pfn = __phys_to_pfn(base); 98732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek /* Expected address is in vmalloc area that's why simple assign here */ 99732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek zynq_cortex_a9_scu_map.virtual = base; 100732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek iotable_init(&zynq_cortex_a9_scu_map, 1); 101732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek zynq_scu_base = (void __iomem *)base; 102732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek BUG_ON(!zynq_scu_base); 103732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek} 104732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek 105b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn/** 106889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simek * zynq_map_io - Create memory mappings needed for early I/O. 107b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn */ 108889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simekstatic void __init zynq_map_io(void) 109b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn{ 110385f02b1696004461d89589e69ae7247081a74a2Josh Cartwright debug_ll_io_init(); 111732078c369f0b6ad9fe75c1faff721e91260bc5dMichal Simek zynq_scu_map_io(); 112b85a3ef4ac65169b65fd2fe9bec7912bbf475ba4John Linn} 1133d64b4496f5fd90618106555344205a522178c0cArnd Bergmann 1149f4f5d26c66153bc63ea60f4f05dd6f19e9e7b48Soren Brinkmannstatic void __init zynq_irq_init(void) 1159f4f5d26c66153bc63ea60f4f05dd6f19e9e7b48Soren Brinkmann{ 1169f4f5d26c66153bc63ea60f4f05dd6f19e9e7b48Soren Brinkmann gic_arch_extn.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND; 1179f4f5d26c66153bc63ea60f4f05dd6f19e9e7b48Soren Brinkmann irqchip_init(); 1189f4f5d26c66153bc63ea60f4f05dd6f19e9e7b48Soren Brinkmann} 1199f4f5d26c66153bc63ea60f4f05dd6f19e9e7b48Soren Brinkmann 120fe08bf9f46d6ae8e08de32d29234a2c928eebf8fVincent Stehléstatic void zynq_system_reset(enum reboot_mode mode, const char *cmd) 12196790f0a283976bc59f68657237293fe97b02334Michal Simek{ 12296790f0a283976bc59f68657237293fe97b02334Michal Simek zynq_slcr_system_reset(); 12396790f0a283976bc59f68657237293fe97b02334Michal Simek} 12496790f0a283976bc59f68657237293fe97b02334Michal Simek 125889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simekstatic const char * const zynq_dt_match[] = { 126e06f1a9ed7ebff170ba05d2606d079fb36c6a52dJosh Cartwright "xlnx,zynq-7000", 1273d64b4496f5fd90618106555344205a522178c0cArnd Bergmann NULL 1283d64b4496f5fd90618106555344205a522178c0cArnd Bergmann}; 1293d64b4496f5fd90618106555344205a522178c0cArnd Bergmann 130514a590847ff42dc00ba6c6165736128ad7730a8Arnd BergmannDT_MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform") 131dcf9c7f9f4c5acd9ea72782263d2d76bbeadd9f7Russell King /* 64KB way size, 8-way associativity, parity disabled */ 132dcf9c7f9f4c5acd9ea72782263d2d76bbeadd9f7Russell King .l2c_aux_val = 0x02000000, 133dcf9c7f9f4c5acd9ea72782263d2d76bbeadd9f7Russell King .l2c_aux_mask = 0xf0ffffff, 134aa7eb2bb4e4a22e41bbe4612ff46e5885b13c33eMichal Simek .smp = smp_ops(zynq_smp_ops), 135889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simek .map_io = zynq_map_io, 1369f4f5d26c66153bc63ea60f4f05dd6f19e9e7b48Soren Brinkmann .init_irq = zynq_irq_init, 137889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simek .init_machine = zynq_init_machine, 138889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simek .init_time = zynq_timer_init, 139889faa88142801ee6bec2de2b8fb4c606076d52fMichal Simek .dt_compat = zynq_dt_match, 14046f5b96085b03f9e71a0134de77efc6a1f9d84c3Michal Simek .reserve = zynq_memory_init, 14196790f0a283976bc59f68657237293fe97b02334Michal Simek .restart = zynq_system_reset, 1423d64b4496f5fd90618106555344205a522178c0cArnd BergmannMACHINE_END 143