aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorMichal Simek <michal.simek@xilinx.com>2013-03-20 06:11:43 -0400
committerMichal Simek <michal.simek@xilinx.com>2013-04-04 03:22:28 -0400
commit732078c369f0b6ad9fe75c1faff721e91260bc5d (patch)
treef89298d77dd4369df13d67c84da097b750bf82c1 /arch/arm
parent4f0f234fce1d263cc9881456352e8fd56ead0514 (diff)
arm: zynq: Load scu baseaddress at run time
Use Cortex a9 cp15 to read scu baseaddress. Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-zynq/common.c34
-rw-r--r--arch/arm/mach-zynq/common.h2
2 files changed, 24 insertions, 12 deletions
diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c
index 68e0907de5d0..f9e5f3ac8eec 100644
--- a/arch/arm/mach-zynq/common.c
+++ b/arch/arm/mach-zynq/common.c
@@ -33,10 +33,13 @@
33#include <asm/mach-types.h> 33#include <asm/mach-types.h>
34#include <asm/page.h> 34#include <asm/page.h>
35#include <asm/pgtable.h> 35#include <asm/pgtable.h>
36#include <asm/smp_scu.h>
36#include <asm/hardware/cache-l2x0.h> 37#include <asm/hardware/cache-l2x0.h>
37 38
38#include "common.h" 39#include "common.h"
39 40
41void __iomem *zynq_scu_base;
42
40static struct of_device_id zynq_of_bus_ids[] __initdata = { 43static struct of_device_id zynq_of_bus_ids[] __initdata = {
41 { .compatible = "simple-bus", }, 44 { .compatible = "simple-bus", },
42 {} 45 {}
@@ -56,17 +59,6 @@ static void __init xilinx_init_machine(void)
56 of_platform_bus_probe(NULL, zynq_of_bus_ids, NULL); 59 of_platform_bus_probe(NULL, zynq_of_bus_ids, NULL);
57} 60}
58 61
59#define SCU_PERIPH_PHYS 0xF8F00000
60#define SCU_PERIPH_SIZE SZ_8K
61#define SCU_PERIPH_VIRT (VMALLOC_END - SCU_PERIPH_SIZE)
62
63static struct map_desc scu_desc __initdata = {
64 .virtual = SCU_PERIPH_VIRT,
65 .pfn = __phys_to_pfn(SCU_PERIPH_PHYS),
66 .length = SCU_PERIPH_SIZE,
67 .type = MT_DEVICE,
68};
69
70static void __init xilinx_zynq_timer_init(void) 62static void __init xilinx_zynq_timer_init(void)
71{ 63{
72 struct device_node *np; 64 struct device_node *np;
@@ -81,13 +73,31 @@ static void __init xilinx_zynq_timer_init(void)
81 clocksource_of_init(); 73 clocksource_of_init();
82} 74}
83 75
76static struct map_desc zynq_cortex_a9_scu_map __initdata = {
77 .length = SZ_256,
78 .type = MT_DEVICE,
79};
80
81static void __init zynq_scu_map_io(void)
82{
83 unsigned long base;
84
85 base = scu_a9_get_base();
86 zynq_cortex_a9_scu_map.pfn = __phys_to_pfn(base);
87 /* Expected address is in vmalloc area that's why simple assign here */
88 zynq_cortex_a9_scu_map.virtual = base;
89 iotable_init(&zynq_cortex_a9_scu_map, 1);
90 zynq_scu_base = (void __iomem *)base;
91 BUG_ON(!zynq_scu_base);
92}
93
84/** 94/**
85 * xilinx_map_io() - Create memory mappings needed for early I/O. 95 * xilinx_map_io() - Create memory mappings needed for early I/O.
86 */ 96 */
87static void __init xilinx_map_io(void) 97static void __init xilinx_map_io(void)
88{ 98{
89 debug_ll_io_init(); 99 debug_ll_io_init();
90 iotable_init(&scu_desc, 1); 100 zynq_scu_map_io();
91} 101}
92 102
93static const char *xilinx_dt_match[] = { 103static const char *xilinx_dt_match[] = {
diff --git a/arch/arm/mach-zynq/common.h b/arch/arm/mach-zynq/common.h
index 5050bb10bb12..d7164d50cffe 100644
--- a/arch/arm/mach-zynq/common.h
+++ b/arch/arm/mach-zynq/common.h
@@ -17,4 +17,6 @@
17#ifndef __MACH_ZYNQ_COMMON_H__ 17#ifndef __MACH_ZYNQ_COMMON_H__
18#define __MACH_ZYNQ_COMMON_H__ 18#define __MACH_ZYNQ_COMMON_H__
19 19
20extern void __iomem *zynq_scu_base;
21
20#endif 22#endif