diff options
Diffstat (limited to 'arch/arm/mach-msm')
-rw-r--r-- | arch/arm/mach-msm/board-halibut.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-msm/board-mahimahi.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-msm/board-msm7x27.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-msm/board-msm7x30.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-msm/board-msm8x60.c | 11 | ||||
-rw-r--r-- | arch/arm/mach-msm/board-qsd8x50.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-msm/board-sapphire.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-msm/board-trout.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-msm/include/mach/debug-macro.S | 4 | ||||
-rw-r--r-- | arch/arm/mach-msm/include/mach/entry-macro-qgic.S | 73 | ||||
-rw-r--r-- | arch/arm/mach-msm/include/mach/memory.h | 35 | ||||
-rw-r--r-- | arch/arm/mach-msm/timer.c | 69 |
12 files changed, 56 insertions, 162 deletions
diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c index f81ef1f9d46f..a60ab6d04ec5 100644 --- a/arch/arm/mach-msm/board-halibut.c +++ b/arch/arm/mach-msm/board-halibut.c | |||
@@ -93,7 +93,7 @@ static void __init halibut_map_io(void) | |||
93 | } | 93 | } |
94 | 94 | ||
95 | MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") | 95 | MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)") |
96 | .boot_params = 0x10000100, | 96 | .atag_offset = 0x100, |
97 | .fixup = halibut_fixup, | 97 | .fixup = halibut_fixup, |
98 | .map_io = halibut_map_io, | 98 | .map_io = halibut_map_io, |
99 | .init_irq = halibut_init_irq, | 99 | .init_irq = halibut_init_irq, |
diff --git a/arch/arm/mach-msm/board-mahimahi.c b/arch/arm/mach-msm/board-mahimahi.c index 1df15aa3c66d..5a4882fc6f7a 100644 --- a/arch/arm/mach-msm/board-mahimahi.c +++ b/arch/arm/mach-msm/board-mahimahi.c | |||
@@ -74,7 +74,7 @@ static void __init mahimahi_map_io(void) | |||
74 | extern struct sys_timer msm_timer; | 74 | extern struct sys_timer msm_timer; |
75 | 75 | ||
76 | MACHINE_START(MAHIMAHI, "mahimahi") | 76 | MACHINE_START(MAHIMAHI, "mahimahi") |
77 | .boot_params = 0x20000100, | 77 | .atag_offset = 0x100, |
78 | .fixup = mahimahi_fixup, | 78 | .fixup = mahimahi_fixup, |
79 | .map_io = mahimahi_map_io, | 79 | .map_io = mahimahi_map_io, |
80 | .init_irq = msm_init_irq, | 80 | .init_irq = msm_init_irq, |
diff --git a/arch/arm/mach-msm/board-msm7x27.c b/arch/arm/mach-msm/board-msm7x27.c index 1a313e10c68a..6d84ee740df4 100644 --- a/arch/arm/mach-msm/board-msm7x27.c +++ b/arch/arm/mach-msm/board-msm7x27.c | |||
@@ -129,7 +129,7 @@ static void __init msm7x2x_map_io(void) | |||
129 | } | 129 | } |
130 | 130 | ||
131 | MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF") | 131 | MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF") |
132 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 132 | .atag_offset = 0x100, |
133 | .map_io = msm7x2x_map_io, | 133 | .map_io = msm7x2x_map_io, |
134 | .init_irq = msm7x2x_init_irq, | 134 | .init_irq = msm7x2x_init_irq, |
135 | .init_machine = msm7x2x_init, | 135 | .init_machine = msm7x2x_init, |
@@ -137,7 +137,7 @@ MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF") | |||
137 | MACHINE_END | 137 | MACHINE_END |
138 | 138 | ||
139 | MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA") | 139 | MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA") |
140 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 140 | .atag_offset = 0x100, |
141 | .map_io = msm7x2x_map_io, | 141 | .map_io = msm7x2x_map_io, |
142 | .init_irq = msm7x2x_init_irq, | 142 | .init_irq = msm7x2x_init_irq, |
143 | .init_machine = msm7x2x_init, | 143 | .init_machine = msm7x2x_init, |
@@ -145,7 +145,7 @@ MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA") | |||
145 | MACHINE_END | 145 | MACHINE_END |
146 | 146 | ||
147 | MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF") | 147 | MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF") |
148 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 148 | .atag_offset = 0x100, |
149 | .map_io = msm7x2x_map_io, | 149 | .map_io = msm7x2x_map_io, |
150 | .init_irq = msm7x2x_init_irq, | 150 | .init_irq = msm7x2x_init_irq, |
151 | .init_machine = msm7x2x_init, | 151 | .init_machine = msm7x2x_init, |
@@ -153,7 +153,7 @@ MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF") | |||
153 | MACHINE_END | 153 | MACHINE_END |
154 | 154 | ||
155 | MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA") | 155 | MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA") |
156 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 156 | .atag_offset = 0x100, |
157 | .map_io = msm7x2x_map_io, | 157 | .map_io = msm7x2x_map_io, |
158 | .init_irq = msm7x2x_init_irq, | 158 | .init_irq = msm7x2x_init_irq, |
159 | .init_machine = msm7x2x_init, | 159 | .init_machine = msm7x2x_init, |
diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c index 9043417ea52f..71de5062c71e 100644 --- a/arch/arm/mach-msm/board-msm7x30.c +++ b/arch/arm/mach-msm/board-msm7x30.c | |||
@@ -121,7 +121,7 @@ static void __init msm7x30_map_io(void) | |||
121 | } | 121 | } |
122 | 122 | ||
123 | MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") | 123 | MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") |
124 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 124 | .atag_offset = 0x100, |
125 | .fixup = msm7x30_fixup, | 125 | .fixup = msm7x30_fixup, |
126 | .reserve = msm7x30_reserve, | 126 | .reserve = msm7x30_reserve, |
127 | .map_io = msm7x30_map_io, | 127 | .map_io = msm7x30_map_io, |
@@ -131,7 +131,7 @@ MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF") | |||
131 | MACHINE_END | 131 | MACHINE_END |
132 | 132 | ||
133 | MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA") | 133 | MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA") |
134 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 134 | .atag_offset = 0x100, |
135 | .fixup = msm7x30_fixup, | 135 | .fixup = msm7x30_fixup, |
136 | .reserve = msm7x30_reserve, | 136 | .reserve = msm7x30_reserve, |
137 | .map_io = msm7x30_map_io, | 137 | .map_io = msm7x30_map_io, |
@@ -141,7 +141,7 @@ MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA") | |||
141 | MACHINE_END | 141 | MACHINE_END |
142 | 142 | ||
143 | MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID") | 143 | MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID") |
144 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 144 | .atag_offset = 0x100, |
145 | .fixup = msm7x30_fixup, | 145 | .fixup = msm7x30_fixup, |
146 | .reserve = msm7x30_reserve, | 146 | .reserve = msm7x30_reserve, |
147 | .map_io = msm7x30_map_io, | 147 | .map_io = msm7x30_map_io, |
diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c index 9221f54778be..106170fb1844 100644 --- a/arch/arm/mach-msm/board-msm8x60.c +++ b/arch/arm/mach-msm/board-msm8x60.c | |||
@@ -53,8 +53,6 @@ static void __init msm8x60_map_io(void) | |||
53 | 53 | ||
54 | static void __init msm8x60_init_irq(void) | 54 | static void __init msm8x60_init_irq(void) |
55 | { | 55 | { |
56 | unsigned int i; | ||
57 | |||
58 | gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE, | 56 | gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE, |
59 | (void *)MSM_QGIC_CPU_BASE); | 57 | (void *)MSM_QGIC_CPU_BASE); |
60 | 58 | ||
@@ -66,15 +64,6 @@ static void __init msm8x60_init_irq(void) | |||
66 | */ | 64 | */ |
67 | if (!machine_is_msm8x60_sim()) | 65 | if (!machine_is_msm8x60_sim()) |
68 | writel(0x0000FFFF, MSM_QGIC_DIST_BASE + GIC_DIST_ENABLE_SET); | 66 | writel(0x0000FFFF, MSM_QGIC_DIST_BASE + GIC_DIST_ENABLE_SET); |
69 | |||
70 | /* FIXME: Not installing AVS_SVICINT and AVS_SVICINTSWDONE yet | ||
71 | * as they are configured as level, which does not play nice with | ||
72 | * handle_percpu_irq. | ||
73 | */ | ||
74 | for (i = GIC_PPI_START; i < GIC_SPI_START; i++) { | ||
75 | if (i != AVS_SVICINT && i != AVS_SVICINTSWDONE) | ||
76 | irq_set_handler(i, handle_percpu_irq); | ||
77 | } | ||
78 | } | 67 | } |
79 | 68 | ||
80 | static void __init msm8x60_init(void) | 69 | static void __init msm8x60_init(void) |
diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c index 24e9b89738ef..7e8909c978c3 100644 --- a/arch/arm/mach-msm/board-qsd8x50.c +++ b/arch/arm/mach-msm/board-qsd8x50.c | |||
@@ -192,7 +192,7 @@ static void __init qsd8x50_init(void) | |||
192 | } | 192 | } |
193 | 193 | ||
194 | MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") | 194 | MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") |
195 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 195 | .atag_offset = 0x100, |
196 | .map_io = qsd8x50_map_io, | 196 | .map_io = qsd8x50_map_io, |
197 | .init_irq = qsd8x50_init_irq, | 197 | .init_irq = qsd8x50_init_irq, |
198 | .init_machine = qsd8x50_init, | 198 | .init_machine = qsd8x50_init, |
@@ -200,7 +200,7 @@ MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF") | |||
200 | MACHINE_END | 200 | MACHINE_END |
201 | 201 | ||
202 | MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5") | 202 | MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5") |
203 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 203 | .atag_offset = 0x100, |
204 | .map_io = qsd8x50_map_io, | 204 | .map_io = qsd8x50_map_io, |
205 | .init_irq = qsd8x50_init_irq, | 205 | .init_irq = qsd8x50_init_irq, |
206 | .init_machine = qsd8x50_init, | 206 | .init_machine = qsd8x50_init, |
diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c index 11c1e75ebb1b..32b465763dbd 100644 --- a/arch/arm/mach-msm/board-sapphire.c +++ b/arch/arm/mach-msm/board-sapphire.c | |||
@@ -104,7 +104,7 @@ static void __init sapphire_map_io(void) | |||
104 | 104 | ||
105 | MACHINE_START(SAPPHIRE, "sapphire") | 105 | MACHINE_START(SAPPHIRE, "sapphire") |
106 | /* Maintainer: Brian Swetland <swetland@google.com> */ | 106 | /* Maintainer: Brian Swetland <swetland@google.com> */ |
107 | .boot_params = PLAT_PHYS_OFFSET + 0x100, | 107 | .atag_offset = 0x100, |
108 | .fixup = sapphire_fixup, | 108 | .fixup = sapphire_fixup, |
109 | .map_io = sapphire_map_io, | 109 | .map_io = sapphire_map_io, |
110 | .init_irq = sapphire_init_irq, | 110 | .init_irq = sapphire_init_irq, |
diff --git a/arch/arm/mach-msm/board-trout.c b/arch/arm/mach-msm/board-trout.c index 7acd2021ada9..6b9b227c87c5 100644 --- a/arch/arm/mach-msm/board-trout.c +++ b/arch/arm/mach-msm/board-trout.c | |||
@@ -93,7 +93,7 @@ static void __init trout_map_io(void) | |||
93 | } | 93 | } |
94 | 94 | ||
95 | MACHINE_START(TROUT, "HTC Dream") | 95 | MACHINE_START(TROUT, "HTC Dream") |
96 | .boot_params = 0x10000100, | 96 | .atag_offset = 0x100, |
97 | .fixup = trout_fixup, | 97 | .fixup = trout_fixup, |
98 | .map_io = trout_map_io, | 98 | .map_io = trout_map_io, |
99 | .init_irq = trout_init_irq, | 99 | .init_irq = trout_init_irq, |
diff --git a/arch/arm/mach-msm/include/mach/debug-macro.S b/arch/arm/mach-msm/include/mach/debug-macro.S index 646b99ebc773..2dc73ccddb11 100644 --- a/arch/arm/mach-msm/include/mach/debug-macro.S +++ b/arch/arm/mach-msm/include/mach/debug-macro.S | |||
@@ -20,7 +20,7 @@ | |||
20 | #include <mach/msm_iomap.h> | 20 | #include <mach/msm_iomap.h> |
21 | 21 | ||
22 | #if defined(CONFIG_HAS_MSM_DEBUG_UART_PHYS) && !defined(CONFIG_MSM_DEBUG_UART_NONE) | 22 | #if defined(CONFIG_HAS_MSM_DEBUG_UART_PHYS) && !defined(CONFIG_MSM_DEBUG_UART_NONE) |
23 | .macro addruart, rp, rv | 23 | .macro addruart, rp, rv, tmp |
24 | ldr \rp, =MSM_DEBUG_UART_PHYS | 24 | ldr \rp, =MSM_DEBUG_UART_PHYS |
25 | ldr \rv, =MSM_DEBUG_UART_BASE | 25 | ldr \rv, =MSM_DEBUG_UART_BASE |
26 | .endm | 26 | .endm |
@@ -37,7 +37,7 @@ | |||
37 | beq 1001b | 37 | beq 1001b |
38 | .endm | 38 | .endm |
39 | #else | 39 | #else |
40 | .macro addruart, rp, rv | 40 | .macro addruart, rp, rv, tmp |
41 | mov \rv, #0xff000000 | 41 | mov \rv, #0xff000000 |
42 | orr \rv, \rv, #0x00f00000 | 42 | orr \rv, \rv, #0x00f00000 |
43 | .endm | 43 | .endm |
diff --git a/arch/arm/mach-msm/include/mach/entry-macro-qgic.S b/arch/arm/mach-msm/include/mach/entry-macro-qgic.S index 12467157afb9..717076f3ca73 100644 --- a/arch/arm/mach-msm/include/mach/entry-macro-qgic.S +++ b/arch/arm/mach-msm/include/mach/entry-macro-qgic.S | |||
@@ -8,81 +8,10 @@ | |||
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <mach/hardware.h> | 11 | #include <asm/hardware/entry-macro-gic.S> |
12 | #include <asm/hardware/gic.h> | ||
13 | 12 | ||
14 | .macro disable_fiq | 13 | .macro disable_fiq |
15 | .endm | 14 | .endm |
16 | 15 | ||
17 | .macro get_irqnr_preamble, base, tmp | ||
18 | ldr \base, =gic_cpu_base_addr | ||
19 | ldr \base, [\base] | ||
20 | .endm | ||
21 | |||
22 | .macro arch_ret_to_user, tmp1, tmp2 | 16 | .macro arch_ret_to_user, tmp1, tmp2 |
23 | .endm | 17 | .endm |
24 | |||
25 | /* | ||
26 | * The interrupt numbering scheme is defined in the | ||
27 | * interrupt controller spec. To wit: | ||
28 | * | ||
29 | * Migrated the code from ARM MP port to be more consistent | ||
30 | * with interrupt processing , the following still holds true | ||
31 | * however, all interrupts are treated the same regardless of | ||
32 | * if they are local IPI or PPI | ||
33 | * | ||
34 | * Interrupts 0-15 are IPI | ||
35 | * 16-31 are PPI | ||
36 | * (16-18 are the timers) | ||
37 | * 32-1020 are global | ||
38 | * 1021-1022 are reserved | ||
39 | * 1023 is "spurious" (no interrupt) | ||
40 | * | ||
41 | * A simple read from the controller will tell us the number of the | ||
42 | * highest priority enabled interrupt. We then just need to check | ||
43 | * whether it is in the valid range for an IRQ (0-1020 inclusive). | ||
44 | * | ||
45 | * Base ARM code assumes that the local (private) peripheral interrupts | ||
46 | * are not valid, we treat them differently, in that the privates are | ||
47 | * handled like normal shared interrupts with the exception that only | ||
48 | * one processor can register the interrupt and the handler must be | ||
49 | * the same for all processors. | ||
50 | */ | ||
51 | |||
52 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
53 | |||
54 | ldr \irqstat, [\base, #GIC_CPU_INTACK] /* bits 12-10 =srcCPU, | ||
55 | 9-0 =int # */ | ||
56 | |||
57 | bic \irqnr, \irqstat, #0x1c00 @mask src | ||
58 | cmp \irqnr, #15 | ||
59 | ldr \tmp, =1021 | ||
60 | cmpcc \irqnr, \irqnr | ||
61 | cmpne \irqnr, \tmp | ||
62 | cmpcs \irqnr, \irqnr | ||
63 | |||
64 | .endm | ||
65 | |||
66 | /* We assume that irqstat (the raw value of the IRQ acknowledge | ||
67 | * register) is preserved from the macro above. | ||
68 | * If there is an IPI, we immediately signal end of interrupt on the | ||
69 | * controller, since this requires the original irqstat value which | ||
70 | * we won't easily be able to recreate later. | ||
71 | */ | ||
72 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
73 | bic \irqnr, \irqstat, #0x1c00 | ||
74 | cmp \irqnr, #16 | ||
75 | strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
76 | cmpcs \irqnr, \irqnr | ||
77 | .endm | ||
78 | |||
79 | /* As above, this assumes that irqstat and base are preserved.. */ | ||
80 | |||
81 | .macro test_for_ltirq, irqnr, irqstat, base, tmp | ||
82 | bic \irqnr, \irqstat, #0x1c00 | ||
83 | mov \tmp, #0 | ||
84 | cmp \irqnr, #16 | ||
85 | moveq \tmp, #1 | ||
86 | streq \irqstat, [\base, #GIC_CPU_EOI] | ||
87 | cmp \tmp, #0 | ||
88 | .endm | ||
diff --git a/arch/arm/mach-msm/include/mach/memory.h b/arch/arm/mach-msm/include/mach/memory.h deleted file mode 100644 index 58d5e7eec431..000000000000 --- a/arch/arm/mach-msm/include/mach/memory.h +++ /dev/null | |||
@@ -1,35 +0,0 @@ | |||
1 | /* arch/arm/mach-msm/include/mach/memory.h | ||
2 | * | ||
3 | * Copyright (C) 2007 Google, Inc. | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #ifndef __ASM_ARCH_MEMORY_H | ||
17 | #define __ASM_ARCH_MEMORY_H | ||
18 | |||
19 | /* physical offset of RAM */ | ||
20 | #if defined(CONFIG_ARCH_QSD8X50) && defined(CONFIG_MSM_SOC_REV_A) | ||
21 | #define PLAT_PHYS_OFFSET UL(0x00000000) | ||
22 | #elif defined(CONFIG_ARCH_QSD8X50) | ||
23 | #define PLAT_PHYS_OFFSET UL(0x20000000) | ||
24 | #elif defined(CONFIG_ARCH_MSM7X30) | ||
25 | #define PLAT_PHYS_OFFSET UL(0x00000000) | ||
26 | #elif defined(CONFIG_ARCH_MSM8X60) | ||
27 | #define PLAT_PHYS_OFFSET UL(0x40000000) | ||
28 | #elif defined(CONFIG_ARCH_MSM8960) | ||
29 | #define PLAT_PHYS_OFFSET UL(0x40000000) | ||
30 | #else | ||
31 | #define PLAT_PHYS_OFFSET UL(0x10000000) | ||
32 | #endif | ||
33 | |||
34 | #endif | ||
35 | |||
diff --git a/arch/arm/mach-msm/timer.c b/arch/arm/mach-msm/timer.c index 63621f152c98..afeeca52fc66 100644 --- a/arch/arm/mach-msm/timer.c +++ b/arch/arm/mach-msm/timer.c | |||
@@ -71,12 +71,16 @@ enum timer_location { | |||
71 | struct msm_clock { | 71 | struct msm_clock { |
72 | struct clock_event_device clockevent; | 72 | struct clock_event_device clockevent; |
73 | struct clocksource clocksource; | 73 | struct clocksource clocksource; |
74 | struct irqaction irq; | 74 | unsigned int irq; |
75 | void __iomem *regbase; | 75 | void __iomem *regbase; |
76 | uint32_t freq; | 76 | uint32_t freq; |
77 | uint32_t shift; | 77 | uint32_t shift; |
78 | void __iomem *global_counter; | 78 | void __iomem *global_counter; |
79 | void __iomem *local_counter; | 79 | void __iomem *local_counter; |
80 | union { | ||
81 | struct clock_event_device *evt; | ||
82 | struct clock_event_device __percpu **percpu_evt; | ||
83 | }; | ||
80 | }; | 84 | }; |
81 | 85 | ||
82 | enum { | 86 | enum { |
@@ -87,13 +91,10 @@ enum { | |||
87 | 91 | ||
88 | 92 | ||
89 | static struct msm_clock msm_clocks[]; | 93 | static struct msm_clock msm_clocks[]; |
90 | static struct clock_event_device *local_clock_event; | ||
91 | 94 | ||
92 | static irqreturn_t msm_timer_interrupt(int irq, void *dev_id) | 95 | static irqreturn_t msm_timer_interrupt(int irq, void *dev_id) |
93 | { | 96 | { |
94 | struct clock_event_device *evt = dev_id; | 97 | struct clock_event_device *evt = *(struct clock_event_device **)dev_id; |
95 | if (smp_processor_id() != 0) | ||
96 | evt = local_clock_event; | ||
97 | if (evt->event_handler == NULL) | 98 | if (evt->event_handler == NULL) |
98 | return IRQ_HANDLED; | 99 | return IRQ_HANDLED; |
99 | evt->event_handler(evt); | 100 | evt->event_handler(evt); |
@@ -171,13 +172,7 @@ static struct msm_clock msm_clocks[] = { | |||
171 | .mask = CLOCKSOURCE_MASK(32), | 172 | .mask = CLOCKSOURCE_MASK(32), |
172 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 173 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
173 | }, | 174 | }, |
174 | .irq = { | 175 | .irq = INT_GP_TIMER_EXP, |
175 | .name = "gp_timer", | ||
176 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_RISING, | ||
177 | .handler = msm_timer_interrupt, | ||
178 | .dev_id = &msm_clocks[0].clockevent, | ||
179 | .irq = INT_GP_TIMER_EXP | ||
180 | }, | ||
181 | .freq = GPT_HZ, | 176 | .freq = GPT_HZ, |
182 | }, | 177 | }, |
183 | [MSM_CLOCK_DGT] = { | 178 | [MSM_CLOCK_DGT] = { |
@@ -196,13 +191,7 @@ static struct msm_clock msm_clocks[] = { | |||
196 | .mask = CLOCKSOURCE_MASK((32 - MSM_DGT_SHIFT)), | 191 | .mask = CLOCKSOURCE_MASK((32 - MSM_DGT_SHIFT)), |
197 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 192 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
198 | }, | 193 | }, |
199 | .irq = { | 194 | .irq = INT_DEBUG_TIMER_EXP, |
200 | .name = "dg_timer", | ||
201 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_RISING, | ||
202 | .handler = msm_timer_interrupt, | ||
203 | .dev_id = &msm_clocks[1].clockevent, | ||
204 | .irq = INT_DEBUG_TIMER_EXP | ||
205 | }, | ||
206 | .freq = DGT_HZ >> MSM_DGT_SHIFT, | 195 | .freq = DGT_HZ >> MSM_DGT_SHIFT, |
207 | .shift = MSM_DGT_SHIFT, | 196 | .shift = MSM_DGT_SHIFT, |
208 | } | 197 | } |
@@ -261,10 +250,30 @@ static void __init msm_timer_init(void) | |||
261 | printk(KERN_ERR "msm_timer_init: clocksource_register " | 250 | printk(KERN_ERR "msm_timer_init: clocksource_register " |
262 | "failed for %s\n", cs->name); | 251 | "failed for %s\n", cs->name); |
263 | 252 | ||
264 | res = setup_irq(clock->irq.irq, &clock->irq); | 253 | ce->irq = clock->irq; |
254 | if (cpu_is_msm8x60() || cpu_is_msm8960()) { | ||
255 | clock->percpu_evt = alloc_percpu(struct clock_event_device *); | ||
256 | if (!clock->percpu_evt) { | ||
257 | pr_err("msm_timer_init: memory allocation " | ||
258 | "failed for %s\n", ce->name); | ||
259 | continue; | ||
260 | } | ||
261 | |||
262 | *__this_cpu_ptr(clock->percpu_evt) = ce; | ||
263 | res = request_percpu_irq(ce->irq, msm_timer_interrupt, | ||
264 | ce->name, clock->percpu_evt); | ||
265 | if (!res) | ||
266 | enable_percpu_irq(ce->irq, 0); | ||
267 | } else { | ||
268 | clock->evt = ce; | ||
269 | res = request_irq(ce->irq, msm_timer_interrupt, | ||
270 | IRQF_TIMER | IRQF_NOBALANCING | IRQF_TRIGGER_RISING, | ||
271 | ce->name, &clock->evt); | ||
272 | } | ||
273 | |||
265 | if (res) | 274 | if (res) |
266 | printk(KERN_ERR "msm_timer_init: setup_irq " | 275 | pr_err("msm_timer_init: request_irq failed for %s\n", |
267 | "failed for %s\n", cs->name); | 276 | ce->name); |
268 | 277 | ||
269 | clockevents_register_device(ce); | 278 | clockevents_register_device(ce); |
270 | } | 279 | } |
@@ -273,6 +282,7 @@ static void __init msm_timer_init(void) | |||
273 | #ifdef CONFIG_SMP | 282 | #ifdef CONFIG_SMP |
274 | int __cpuinit local_timer_setup(struct clock_event_device *evt) | 283 | int __cpuinit local_timer_setup(struct clock_event_device *evt) |
275 | { | 284 | { |
285 | static bool local_timer_inited; | ||
276 | struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER]; | 286 | struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER]; |
277 | 287 | ||
278 | /* Use existing clock_event for cpu 0 */ | 288 | /* Use existing clock_event for cpu 0 */ |
@@ -281,12 +291,13 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt) | |||
281 | 291 | ||
282 | writel(DGT_CLK_CTL_DIV_4, MSM_TMR_BASE + DGT_CLK_CTL); | 292 | writel(DGT_CLK_CTL_DIV_4, MSM_TMR_BASE + DGT_CLK_CTL); |
283 | 293 | ||
284 | if (!local_clock_event) { | 294 | if (!local_timer_inited) { |
285 | writel(0, clock->regbase + TIMER_ENABLE); | 295 | writel(0, clock->regbase + TIMER_ENABLE); |
286 | writel(0, clock->regbase + TIMER_CLEAR); | 296 | writel(0, clock->regbase + TIMER_CLEAR); |
287 | writel(~0, clock->regbase + TIMER_MATCH_VAL); | 297 | writel(~0, clock->regbase + TIMER_MATCH_VAL); |
298 | local_timer_inited = true; | ||
288 | } | 299 | } |
289 | evt->irq = clock->irq.irq; | 300 | evt->irq = clock->irq; |
290 | evt->name = "local_timer"; | 301 | evt->name = "local_timer"; |
291 | evt->features = CLOCK_EVT_FEAT_ONESHOT; | 302 | evt->features = CLOCK_EVT_FEAT_ONESHOT; |
292 | evt->rating = clock->clockevent.rating; | 303 | evt->rating = clock->clockevent.rating; |
@@ -298,17 +309,17 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt) | |||
298 | clockevent_delta2ns(0xf0000000 >> clock->shift, evt); | 309 | clockevent_delta2ns(0xf0000000 >> clock->shift, evt); |
299 | evt->min_delta_ns = clockevent_delta2ns(4, evt); | 310 | evt->min_delta_ns = clockevent_delta2ns(4, evt); |
300 | 311 | ||
301 | local_clock_event = evt; | 312 | *__this_cpu_ptr(clock->percpu_evt) = evt; |
302 | 313 | enable_percpu_irq(evt->irq, 0); | |
303 | gic_enable_ppi(clock->irq.irq); | ||
304 | 314 | ||
305 | clockevents_register_device(evt); | 315 | clockevents_register_device(evt); |
306 | return 0; | 316 | return 0; |
307 | } | 317 | } |
308 | 318 | ||
309 | inline int local_timer_ack(void) | 319 | void local_timer_stop(struct clock_event_device *evt) |
310 | { | 320 | { |
311 | return 1; | 321 | evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt); |
322 | disable_percpu_irq(evt->irq); | ||
312 | } | 323 | } |
313 | 324 | ||
314 | #endif | 325 | #endif |