diff options
Diffstat (limited to 'arch/arm/mach-ux500/timer.c')
-rw-r--r-- | arch/arm/mach-ux500/timer.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/arch/arm/mach-ux500/timer.c b/arch/arm/mach-ux500/timer.c index aea467d04ff7..d37df98b5c32 100644 --- a/arch/arm/mach-ux500/timer.c +++ b/arch/arm/mach-ux500/timer.c | |||
@@ -7,29 +7,52 @@ | |||
7 | #include <linux/io.h> | 7 | #include <linux/io.h> |
8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
9 | #include <linux/clksrc-dbx500-prcmu.h> | 9 | #include <linux/clksrc-dbx500-prcmu.h> |
10 | #include <linux/of.h> | ||
10 | 11 | ||
11 | #include <asm/localtimer.h> | 12 | #include <asm/smp_twd.h> |
12 | 13 | ||
13 | #include <plat/mtu.h> | 14 | #include <plat/mtu.h> |
14 | 15 | ||
15 | #include <mach/setup.h> | 16 | #include <mach/setup.h> |
16 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
18 | #include <mach/irqs.h> | ||
19 | |||
20 | #ifdef CONFIG_HAVE_ARM_TWD | ||
21 | static DEFINE_TWD_LOCAL_TIMER(u5500_twd_local_timer, | ||
22 | U5500_TWD_BASE, IRQ_LOCALTIMER); | ||
23 | static DEFINE_TWD_LOCAL_TIMER(u8500_twd_local_timer, | ||
24 | U8500_TWD_BASE, IRQ_LOCALTIMER); | ||
25 | |||
26 | static void __init ux500_twd_init(void) | ||
27 | { | ||
28 | struct twd_local_timer *twd_local_timer; | ||
29 | int err; | ||
30 | |||
31 | twd_local_timer = cpu_is_u5500() ? &u5500_twd_local_timer : | ||
32 | &u8500_twd_local_timer; | ||
33 | |||
34 | if (of_have_populated_dt()) | ||
35 | twd_local_timer_of_register(); | ||
36 | else { | ||
37 | err = twd_local_timer_register(twd_local_timer); | ||
38 | if (err) | ||
39 | pr_err("twd_local_timer_register failed %d\n", err); | ||
40 | } | ||
41 | } | ||
42 | #else | ||
43 | #define ux500_twd_init() do { } while(0) | ||
44 | #endif | ||
17 | 45 | ||
18 | static void __init ux500_timer_init(void) | 46 | static void __init ux500_timer_init(void) |
19 | { | 47 | { |
48 | void __iomem *mtu_timer_base; | ||
20 | void __iomem *prcmu_timer_base; | 49 | void __iomem *prcmu_timer_base; |
21 | 50 | ||
22 | if (cpu_is_u5500()) { | 51 | if (cpu_is_u5500()) { |
23 | #ifdef CONFIG_LOCAL_TIMERS | 52 | mtu_timer_base = __io_address(U5500_MTU0_BASE); |
24 | twd_base = __io_address(U5500_TWD_BASE); | ||
25 | #endif | ||
26 | mtu_base = __io_address(U5500_MTU0_BASE); | ||
27 | prcmu_timer_base = __io_address(U5500_PRCMU_TIMER_3_BASE); | 53 | prcmu_timer_base = __io_address(U5500_PRCMU_TIMER_3_BASE); |
28 | } else if (cpu_is_u8500()) { | 54 | } else if (cpu_is_u8500()) { |
29 | #ifdef CONFIG_LOCAL_TIMERS | 55 | mtu_timer_base = __io_address(U8500_MTU0_BASE); |
30 | twd_base = __io_address(U8500_TWD_BASE); | ||
31 | #endif | ||
32 | mtu_base = __io_address(U8500_MTU0_BASE); | ||
33 | prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE); | 56 | prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE); |
34 | } else { | 57 | } else { |
35 | ux500_unknown_soc(); | 58 | ux500_unknown_soc(); |
@@ -52,8 +75,9 @@ static void __init ux500_timer_init(void) | |||
52 | * | 75 | * |
53 | */ | 76 | */ |
54 | 77 | ||
55 | nmdk_timer_init(); | 78 | nmdk_timer_init(mtu_timer_base); |
56 | clksrc_dbx500_prcmu_init(prcmu_timer_base); | 79 | clksrc_dbx500_prcmu_init(prcmu_timer_base); |
80 | ux500_twd_init(); | ||
57 | } | 81 | } |
58 | 82 | ||
59 | static void ux500_timer_reset(void) | 83 | static void ux500_timer_reset(void) |