aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-ux500
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-ux500')
-rw-r--r--arch/arm/mach-ux500/board-mop500-uib.c1
-rw-r--r--arch/arm/mach-ux500/board-mop500.c13
-rw-r--r--arch/arm/mach-ux500/cache-l2x0.c3
-rw-r--r--arch/arm/mach-ux500/cpu-db8500.c9
-rw-r--r--arch/arm/mach-ux500/cpu.c11
-rw-r--r--arch/arm/mach-ux500/id.c2
-rw-r--r--arch/arm/mach-ux500/id.h (renamed from arch/arm/mach-ux500/include/mach/id.h)21
-rw-r--r--arch/arm/mach-ux500/include/mach/hardware.h1
-rw-r--r--arch/arm/mach-ux500/include/mach/setup.h3
-rw-r--r--arch/arm/mach-ux500/platsmp.c9
-rw-r--r--arch/arm/mach-ux500/timer.c15
11 files changed, 47 insertions, 41 deletions
diff --git a/arch/arm/mach-ux500/board-mop500-uib.c b/arch/arm/mach-ux500/board-mop500-uib.c
index 1f47d962e3a1..7037d3687e9f 100644
--- a/arch/arm/mach-ux500/board-mop500-uib.c
+++ b/arch/arm/mach-ux500/board-mop500-uib.c
@@ -13,6 +13,7 @@
13 13
14#include <mach/hardware.h> 14#include <mach/hardware.h>
15#include "board-mop500.h" 15#include "board-mop500.h"
16#include "id.h"
16 17
17enum mop500_uib { 18enum mop500_uib {
18 STUIB, 19 STUIB,
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index d453522edb0d..0e928d281759 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -40,7 +40,6 @@
40 40
41#include <asm/mach-types.h> 41#include <asm/mach-types.h>
42#include <asm/mach/arch.h> 42#include <asm/mach/arch.h>
43#include <asm/hardware/gic.h>
44 43
45#include <mach/hardware.h> 44#include <mach/hardware.h>
46#include <mach/setup.h> 45#include <mach/setup.h>
@@ -751,8 +750,7 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
751 .map_io = u8500_map_io, 750 .map_io = u8500_map_io,
752 .init_irq = ux500_init_irq, 751 .init_irq = ux500_init_irq,
753 /* we re-use nomadik timer here */ 752 /* we re-use nomadik timer here */
754 .timer = &ux500_timer, 753 .init_time = ux500_timer_init,
755 .handle_irq = gic_handle_irq,
756 .init_machine = mop500_init_machine, 754 .init_machine = mop500_init_machine,
757 .init_late = ux500_init_late, 755 .init_late = ux500_init_late,
758MACHINE_END 756MACHINE_END
@@ -761,8 +759,7 @@ MACHINE_START(U8520, "ST-Ericsson U8520 Platform HREFP520")
761 .atag_offset = 0x100, 759 .atag_offset = 0x100,
762 .map_io = u8500_map_io, 760 .map_io = u8500_map_io,
763 .init_irq = ux500_init_irq, 761 .init_irq = ux500_init_irq,
764 .timer = &ux500_timer, 762 .init_time = ux500_timer_init,
765 .handle_irq = gic_handle_irq,
766 .init_machine = mop500_init_machine, 763 .init_machine = mop500_init_machine,
767 .init_late = ux500_init_late, 764 .init_late = ux500_init_late,
768MACHINE_END 765MACHINE_END
@@ -772,8 +769,7 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
772 .smp = smp_ops(ux500_smp_ops), 769 .smp = smp_ops(ux500_smp_ops),
773 .map_io = u8500_map_io, 770 .map_io = u8500_map_io,
774 .init_irq = ux500_init_irq, 771 .init_irq = ux500_init_irq,
775 .timer = &ux500_timer, 772 .init_time = ux500_timer_init,
776 .handle_irq = gic_handle_irq,
777 .init_machine = hrefv60_init_machine, 773 .init_machine = hrefv60_init_machine,
778 .init_late = ux500_init_late, 774 .init_late = ux500_init_late,
779MACHINE_END 775MACHINE_END
@@ -784,8 +780,7 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
784 .map_io = u8500_map_io, 780 .map_io = u8500_map_io,
785 .init_irq = ux500_init_irq, 781 .init_irq = ux500_init_irq,
786 /* we re-use nomadik timer here */ 782 /* we re-use nomadik timer here */
787 .timer = &ux500_timer, 783 .init_time = ux500_timer_init,
788 .handle_irq = gic_handle_irq,
789 .init_machine = snowball_init_machine, 784 .init_machine = snowball_init_machine,
790 .init_late = NULL, 785 .init_late = NULL,
791MACHINE_END 786MACHINE_END
diff --git a/arch/arm/mach-ux500/cache-l2x0.c b/arch/arm/mach-ux500/cache-l2x0.c
index 75d5b512a3d5..1c1609da76ce 100644
--- a/arch/arm/mach-ux500/cache-l2x0.c
+++ b/arch/arm/mach-ux500/cache-l2x0.c
@@ -10,7 +10,8 @@
10#include <asm/cacheflush.h> 10#include <asm/cacheflush.h>
11#include <asm/hardware/cache-l2x0.h> 11#include <asm/hardware/cache-l2x0.h>
12#include <mach/hardware.h> 12#include <mach/hardware.h>
13#include <mach/id.h> 13
14#include "id.h"
14 15
15static void __iomem *l2x0_base; 16static void __iomem *l2x0_base;
16 17
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c
index db0bb75e2c76..d614d7150dcb 100644
--- a/arch/arm/mach-ux500/cpu-db8500.c
+++ b/arch/arm/mach-ux500/cpu-db8500.c
@@ -27,7 +27,6 @@
27#include <asm/pmu.h> 27#include <asm/pmu.h>
28#include <asm/mach/map.h> 28#include <asm/mach/map.h>
29#include <asm/mach/arch.h> 29#include <asm/mach/arch.h>
30#include <asm/hardware/gic.h>
31 30
32#include <mach/hardware.h> 31#include <mach/hardware.h>
33#include <mach/setup.h> 32#include <mach/setup.h>
@@ -37,7 +36,9 @@
37 36
38#include "devices-db8500.h" 37#include "devices-db8500.h"
39#include "ste-dma40-db8500.h" 38#include "ste-dma40-db8500.h"
39
40#include "board-mop500.h" 40#include "board-mop500.h"
41#include "id.h"
41 42
42/* minimum static i/o mapping required to boot U8500 platforms */ 43/* minimum static i/o mapping required to boot U8500 platforms */
43static struct map_desc u8500_uart_io_desc[] __initdata = { 44static struct map_desc u8500_uart_io_desc[] __initdata = {
@@ -285,7 +286,8 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
285 OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL), 286 OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL),
286 OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL), 287 OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL),
287 /* Requires device name bindings. */ 288 /* Requires device name bindings. */
288 OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL), 289 OF_DEV_AUXDATA("stericsson,nmk_pinctrl", U8500_PRCMU_BASE,
290 "pinctrl-db8500", NULL),
289 /* Requires clock name and DMA bindings. */ 291 /* Requires clock name and DMA bindings. */
290 OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000, 292 OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000,
291 "ux500-msp-i2s.0", &msp0_platform_data), 293 "ux500-msp-i2s.0", &msp0_platform_data),
@@ -340,8 +342,7 @@ DT_MACHINE_START(U8500_DT, "ST-Ericsson Ux5x0 platform (Device Tree Support)")
340 .map_io = u8500_map_io, 342 .map_io = u8500_map_io,
341 .init_irq = ux500_init_irq, 343 .init_irq = ux500_init_irq,
342 /* we re-use nomadik timer here */ 344 /* we re-use nomadik timer here */
343 .timer = &ux500_timer, 345 .init_time = ux500_timer_init,
344 .handle_irq = gic_handle_irq,
345 .init_machine = u8500_init_machine, 346 .init_machine = u8500_init_machine,
346 .init_late = NULL, 347 .init_late = NULL,
347 .dt_compat = stericsson_dt_platform_compat, 348 .dt_compat = stericsson_dt_platform_compat,
diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c
index 721e7b4275f3..506c5b2d0fad 100644
--- a/arch/arm/mach-ux500/cpu.c
+++ b/arch/arm/mach-ux500/cpu.c
@@ -17,9 +17,10 @@
17#include <linux/of.h> 17#include <linux/of.h>
18#include <linux/of_irq.h> 18#include <linux/of_irq.h>
19#include <linux/irq.h> 19#include <linux/irq.h>
20#include <linux/irqchip.h>
21#include <linux/irqchip/arm-gic.h>
20#include <linux/platform_data/clk-ux500.h> 22#include <linux/platform_data/clk-ux500.h>
21 23
22#include <asm/hardware/gic.h>
23#include <asm/mach/map.h> 24#include <asm/mach/map.h>
24 25
25#include <mach/hardware.h> 26#include <mach/hardware.h>
@@ -27,6 +28,7 @@
27#include <mach/devices.h> 28#include <mach/devices.h>
28 29
29#include "board-mop500.h" 30#include "board-mop500.h"
31#include "id.h"
30 32
31void __iomem *_PRCMU_BASE; 33void __iomem *_PRCMU_BASE;
32 34
@@ -42,11 +44,6 @@ void __iomem *_PRCMU_BASE;
42 * This feels fragile because it depends on the gpio device getting probed 44 * This feels fragile because it depends on the gpio device getting probed
43 * _before_ any device uses the gpio interrupts. 45 * _before_ any device uses the gpio interrupts.
44*/ 46*/
45static const struct of_device_id ux500_dt_irq_match[] = {
46 { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, },
47 {},
48};
49
50void __init ux500_init_irq(void) 47void __init ux500_init_irq(void)
51{ 48{
52 void __iomem *dist_base; 49 void __iomem *dist_base;
@@ -62,7 +59,7 @@ void __init ux500_init_irq(void)
62 59
63#ifdef CONFIG_OF 60#ifdef CONFIG_OF
64 if (of_have_populated_dt()) 61 if (of_have_populated_dt())
65 of_irq_init(ux500_dt_irq_match); 62 irqchip_init();
66 else 63 else
67#endif 64#endif
68 gic_init(0, 29, dist_base, cpu_base); 65 gic_init(0, 29, dist_base, cpu_base);
diff --git a/arch/arm/mach-ux500/id.c b/arch/arm/mach-ux500/id.c
index d1579920139f..9f951842e1e5 100644
--- a/arch/arm/mach-ux500/id.c
+++ b/arch/arm/mach-ux500/id.c
@@ -17,6 +17,8 @@
17#include <mach/hardware.h> 17#include <mach/hardware.h>
18#include <mach/setup.h> 18#include <mach/setup.h>
19 19
20#include "id.h"
21
20struct dbx500_asic_id dbx500_id; 22struct dbx500_asic_id dbx500_id;
21 23
22static unsigned int ux500_read_asicid(phys_addr_t addr) 24static unsigned int ux500_read_asicid(phys_addr_t addr)
diff --git a/arch/arm/mach-ux500/include/mach/id.h b/arch/arm/mach-ux500/id.h
index 9c42642ab168..bcc58a8cccbc 100644
--- a/arch/arm/mach-ux500/include/mach/id.h
+++ b/arch/arm/mach-ux500/id.h
@@ -61,9 +61,14 @@ static inline bool __attribute_const__ cpu_is_u8540(void)
61 return dbx500_partnumber() == 0x8540; 61 return dbx500_partnumber() == 0x8540;
62} 62}
63 63
64static inline bool __attribute_const__ cpu_is_u8580(void)
65{
66 return dbx500_partnumber() == 0x8580;
67}
68
64static inline bool cpu_is_ux540_family(void) 69static inline bool cpu_is_ux540_family(void)
65{ 70{
66 return cpu_is_u9540() || cpu_is_u8540(); 71 return cpu_is_u9540() || cpu_is_u8540() || cpu_is_u8580();
67} 72}
68 73
69/* 74/*
@@ -115,6 +120,20 @@ static inline bool cpu_is_u8500v20_or_later(void)
115 return (cpu_is_u8500() && !cpu_is_u8500v10() && !cpu_is_u8500v11()); 120 return (cpu_is_u8500() && !cpu_is_u8500v10() && !cpu_is_u8500v11());
116} 121}
117 122
123/*
124 * 8540 revisions
125 */
126
127static inline bool __attribute_const__ cpu_is_u8540v10(void)
128{
129 return cpu_is_u8540() && dbx500_revision() == 0xA0;
130}
131
132static inline bool __attribute_const__ cpu_is_u8580v10(void)
133{
134 return cpu_is_u8580() && dbx500_revision() == 0xA0;
135}
136
118static inline bool ux500_is_svp(void) 137static inline bool ux500_is_svp(void)
119{ 138{
120 return false; 139 return false;
diff --git a/arch/arm/mach-ux500/include/mach/hardware.h b/arch/arm/mach-ux500/include/mach/hardware.h
index 28d16e744bfd..5201ddace503 100644
--- a/arch/arm/mach-ux500/include/mach/hardware.h
+++ b/arch/arm/mach-ux500/include/mach/hardware.h
@@ -39,7 +39,6 @@
39 39
40#ifndef __ASSEMBLY__ 40#ifndef __ASSEMBLY__
41 41
42#include <mach/id.h>
43extern void __iomem *_PRCMU_BASE; 42extern void __iomem *_PRCMU_BASE;
44 43
45#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x) 44#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x)
diff --git a/arch/arm/mach-ux500/include/mach/setup.h b/arch/arm/mach-ux500/include/mach/setup.h
index 6be4c4d2ab88..bddce2b49372 100644
--- a/arch/arm/mach-ux500/include/mach/setup.h
+++ b/arch/arm/mach-ux500/include/mach/setup.h
@@ -28,8 +28,7 @@ extern struct device *ux500_soc_device_init(const char *soc_id);
28struct amba_device; 28struct amba_device;
29extern void __init amba_add_devices(struct amba_device *devs[], int num); 29extern void __init amba_add_devices(struct amba_device *devs[], int num);
30 30
31struct sys_timer; 31extern void ux500_timer_init(void);
32extern struct sys_timer ux500_timer;
33 32
34#define __IO_DEV_DESC(x, sz) { \ 33#define __IO_DEV_DESC(x, sz) { \
35 .virtual = IO_ADDRESS(x), \ 34 .virtual = IO_ADDRESS(x), \
diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c
index 3db7782f3afb..18f7af339dc9 100644
--- a/arch/arm/mach-ux500/platsmp.c
+++ b/arch/arm/mach-ux500/platsmp.c
@@ -16,14 +16,17 @@
16#include <linux/device.h> 16#include <linux/device.h>
17#include <linux/smp.h> 17#include <linux/smp.h>
18#include <linux/io.h> 18#include <linux/io.h>
19#include <linux/irqchip/arm-gic.h>
19 20
20#include <asm/cacheflush.h> 21#include <asm/cacheflush.h>
21#include <asm/hardware/gic.h>
22#include <asm/smp_plat.h> 22#include <asm/smp_plat.h>
23#include <asm/smp_scu.h> 23#include <asm/smp_scu.h>
24
24#include <mach/hardware.h> 25#include <mach/hardware.h>
25#include <mach/setup.h> 26#include <mach/setup.h>
26 27
28#include "id.h"
29
27/* This is called from headsmp.S to wakeup the secondary core */ 30/* This is called from headsmp.S to wakeup the secondary core */
28extern void u8500_secondary_startup(void); 31extern void u8500_secondary_startup(void);
29 32
@@ -91,7 +94,7 @@ static int __cpuinit ux500_boot_secondary(unsigned int cpu, struct task_struct *
91 */ 94 */
92 write_pen_release(cpu_logical_map(cpu)); 95 write_pen_release(cpu_logical_map(cpu));
93 96
94 smp_send_reschedule(cpu); 97 arch_send_wakeup_ipi_mask(cpumask_of(cpu));
95 98
96 timeout = jiffies + (1 * HZ); 99 timeout = jiffies + (1 * HZ);
97 while (time_before(jiffies, timeout)) { 100 while (time_before(jiffies, timeout)) {
@@ -155,8 +158,6 @@ static void __init ux500_smp_init_cpus(void)
155 158
156 for (i = 0; i < ncores; i++) 159 for (i = 0; i < ncores; i++)
157 set_cpu_possible(i, true); 160 set_cpu_possible(i, true);
158
159 set_smp_cross_call(gic_raise_softirq);
160} 161}
161 162
162static void __init ux500_smp_prepare_cpus(unsigned int max_cpus) 163static void __init ux500_smp_prepare_cpus(unsigned int max_cpus)
diff --git a/arch/arm/mach-ux500/timer.c b/arch/arm/mach-ux500/timer.c
index 875309acb022..a6af0b8732ba 100644
--- a/arch/arm/mach-ux500/timer.c
+++ b/arch/arm/mach-ux500/timer.c
@@ -17,6 +17,8 @@
17#include <mach/hardware.h> 17#include <mach/hardware.h>
18#include <mach/irqs.h> 18#include <mach/irqs.h>
19 19
20#include "id.h"
21
20#ifdef CONFIG_HAVE_ARM_TWD 22#ifdef CONFIG_HAVE_ARM_TWD
21static DEFINE_TWD_LOCAL_TIMER(u8500_twd_local_timer, 23static DEFINE_TWD_LOCAL_TIMER(u8500_twd_local_timer,
22 U8500_TWD_BASE, IRQ_LOCALTIMER); 24 U8500_TWD_BASE, IRQ_LOCALTIMER);
@@ -46,7 +48,7 @@ const static struct of_device_id prcmu_timer_of_match[] __initconst = {
46 { }, 48 { },
47}; 49};
48 50
49static void __init ux500_timer_init(void) 51void __init ux500_timer_init(void)
50{ 52{
51 void __iomem *mtu_timer_base; 53 void __iomem *mtu_timer_base;
52 void __iomem *prcmu_timer_base; 54 void __iomem *prcmu_timer_base;
@@ -99,14 +101,3 @@ dt_fail:
99 clksrc_dbx500_prcmu_init(prcmu_timer_base); 101 clksrc_dbx500_prcmu_init(prcmu_timer_base);
100 ux500_twd_init(); 102 ux500_twd_init();
101} 103}
102
103static void ux500_timer_reset(void)
104{
105 nmdk_clkevt_reset();
106 nmdk_clksrc_reset();
107}
108
109struct sys_timer ux500_timer = {
110 .init = ux500_timer_init,
111 .resume = ux500_timer_reset,
112};