diff options
Diffstat (limited to 'arch/arm/mach-orion')
-rw-r--r-- | arch/arm/mach-orion/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-orion/common.c | 16 | ||||
-rw-r--r-- | arch/arm/mach-orion/common.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-orion/time.c | 181 |
4 files changed, 18 insertions, 187 deletions
diff --git a/arch/arm/mach-orion/Makefile b/arch/arm/mach-orion/Makefile index f91d937a73e8..d894caa5060f 100644 --- a/arch/arm/mach-orion/Makefile +++ b/arch/arm/mach-orion/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | obj-y += common.o addr-map.o pci.o gpio.o irq.o time.o | 1 | obj-y += common.o addr-map.o pci.o gpio.o irq.o |
2 | obj-$(CONFIG_MACH_DB88F5281) += db88f5281-setup.o | 2 | obj-$(CONFIG_MACH_DB88F5281) += db88f5281-setup.o |
3 | obj-$(CONFIG_MACH_RD88F5182) += rd88f5182-setup.o | 3 | obj-$(CONFIG_MACH_RD88F5182) += rd88f5182-setup.o |
4 | obj-$(CONFIG_MACH_KUROBOX_PRO) += kurobox_pro-setup.o | 4 | obj-$(CONFIG_MACH_KUROBOX_PRO) += kurobox_pro-setup.o |
diff --git a/arch/arm/mach-orion/common.c b/arch/arm/mach-orion/common.c index a32fe8e108bc..86d7f7ccfae0 100644 --- a/arch/arm/mach-orion/common.c +++ b/arch/arm/mach-orion/common.c | |||
@@ -23,8 +23,11 @@ | |||
23 | #include <asm/timex.h> | 23 | #include <asm/timex.h> |
24 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
25 | #include <asm/mach/map.h> | 25 | #include <asm/mach/map.h> |
26 | #include <asm/mach/time.h> | ||
26 | #include <asm/arch/hardware.h> | 27 | #include <asm/arch/hardware.h> |
28 | #include <asm/arch/orion.h> | ||
27 | #include <asm/arch/platform.h> | 29 | #include <asm/arch/platform.h> |
30 | #include <asm/plat-orion/time.h> | ||
28 | #include "common.h" | 31 | #include "common.h" |
29 | 32 | ||
30 | /***************************************************************************** | 33 | /***************************************************************************** |
@@ -296,6 +299,19 @@ void __init orion_sata_init(struct mv_sata_platform_data *sata_data) | |||
296 | } | 299 | } |
297 | 300 | ||
298 | /***************************************************************************** | 301 | /***************************************************************************** |
302 | * Time handling | ||
303 | ****************************************************************************/ | ||
304 | |||
305 | static void orion_timer_init(void) | ||
306 | { | ||
307 | orion_time_init(IRQ_ORION_BRIDGE, ORION_TCLK); | ||
308 | } | ||
309 | |||
310 | struct sys_timer orion_timer = { | ||
311 | .init = orion_timer_init, | ||
312 | }; | ||
313 | |||
314 | /***************************************************************************** | ||
299 | * General | 315 | * General |
300 | ****************************************************************************/ | 316 | ****************************************************************************/ |
301 | 317 | ||
diff --git a/arch/arm/mach-orion/common.h b/arch/arm/mach-orion/common.h index 9a5afefac4dc..3898e1b78ee4 100644 --- a/arch/arm/mach-orion/common.h +++ b/arch/arm/mach-orion/common.h | |||
@@ -8,6 +8,7 @@ | |||
8 | void __init orion_map_io(void); | 8 | void __init orion_map_io(void); |
9 | void __init orion_init_irq(void); | 9 | void __init orion_init_irq(void); |
10 | void __init orion_init(void); | 10 | void __init orion_init(void); |
11 | extern struct sys_timer orion_timer; | ||
11 | 12 | ||
12 | /* | 13 | /* |
13 | * Enumerations and functions for Orion windows mapping. Used by Orion core | 14 | * Enumerations and functions for Orion windows mapping. Used by Orion core |
@@ -57,11 +58,6 @@ void __init orion_gpio_set_valid_pins(u32 pins); | |||
57 | void gpio_display(void); /* debug */ | 58 | void gpio_display(void); /* debug */ |
58 | 59 | ||
59 | /* | 60 | /* |
60 | * Orion system timer (clocksource + clockevnt, /mach-orion/time.c) | ||
61 | */ | ||
62 | extern struct sys_timer orion_timer; | ||
63 | |||
64 | /* | ||
65 | * Pull in Orion Ethernet platform_data, used by machine-setup | 61 | * Pull in Orion Ethernet platform_data, used by machine-setup |
66 | */ | 62 | */ |
67 | 63 | ||
diff --git a/arch/arm/mach-orion/time.c b/arch/arm/mach-orion/time.c deleted file mode 100644 index bd4262da4f40..000000000000 --- a/arch/arm/mach-orion/time.c +++ /dev/null | |||
@@ -1,181 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-orion/time.c | ||
3 | * | ||
4 | * Core time functions for Marvell Orion System On Chip | ||
5 | * | ||
6 | * Maintainer: Tzachi Perelstein <tzachi@marvell.com> | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/clockchips.h> | ||
15 | #include <linux/interrupt.h> | ||
16 | #include <linux/irq.h> | ||
17 | #include <asm/mach/time.h> | ||
18 | #include <asm/arch/orion.h> | ||
19 | #include "common.h" | ||
20 | |||
21 | /* | ||
22 | * Timer0: clock_event_device, Tick. | ||
23 | * Timer1: clocksource, Free running. | ||
24 | * WatchDog: Not used. | ||
25 | * | ||
26 | * Timers are counting down. | ||
27 | */ | ||
28 | #define CLOCKEVENT 0 | ||
29 | #define CLOCKSOURCE 1 | ||
30 | |||
31 | /* | ||
32 | * Timers bits | ||
33 | */ | ||
34 | #define BRIDGE_INT_TIMER(x) (1 << ((x) + 1)) | ||
35 | #define TIMER_EN(x) (1 << ((x) * 2)) | ||
36 | #define TIMER_RELOAD_EN(x) (1 << (((x) * 2) + 1)) | ||
37 | #define BRIDGE_INT_TIMER_WD (1 << 3) | ||
38 | #define TIMER_WD_EN (1 << 4) | ||
39 | #define TIMER_WD_RELOAD_EN (1 << 5) | ||
40 | |||
41 | static cycle_t orion_clksrc_read(void) | ||
42 | { | ||
43 | return (0xffffffff - orion_read(TIMER_VAL(CLOCKSOURCE))); | ||
44 | } | ||
45 | |||
46 | static struct clocksource orion_clksrc = { | ||
47 | .name = "orion_clocksource", | ||
48 | .shift = 20, | ||
49 | .rating = 300, | ||
50 | .read = orion_clksrc_read, | ||
51 | .mask = CLOCKSOURCE_MASK(32), | ||
52 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
53 | }; | ||
54 | |||
55 | static int | ||
56 | orion_clkevt_next_event(unsigned long delta, struct clock_event_device *dev) | ||
57 | { | ||
58 | unsigned long flags; | ||
59 | |||
60 | if (delta == 0) | ||
61 | return -ETIME; | ||
62 | |||
63 | local_irq_save(flags); | ||
64 | |||
65 | /* | ||
66 | * Clear and enable timer interrupt bit | ||
67 | */ | ||
68 | orion_write(BRIDGE_CAUSE, ~BRIDGE_INT_TIMER(CLOCKEVENT)); | ||
69 | orion_setbits(BRIDGE_MASK, BRIDGE_INT_TIMER(CLOCKEVENT)); | ||
70 | |||
71 | /* | ||
72 | * Setup new timer value | ||
73 | */ | ||
74 | orion_write(TIMER_VAL(CLOCKEVENT), delta); | ||
75 | |||
76 | /* | ||
77 | * Disable auto reload and kickoff the timer | ||
78 | */ | ||
79 | orion_clrbits(TIMER_CTRL, TIMER_RELOAD_EN(CLOCKEVENT)); | ||
80 | orion_setbits(TIMER_CTRL, TIMER_EN(CLOCKEVENT)); | ||
81 | |||
82 | local_irq_restore(flags); | ||
83 | |||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | static void | ||
88 | orion_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) | ||
89 | { | ||
90 | unsigned long flags; | ||
91 | |||
92 | local_irq_save(flags); | ||
93 | |||
94 | if (mode == CLOCK_EVT_MODE_PERIODIC) { | ||
95 | /* | ||
96 | * Setup latch cycles in timer and enable reload interrupt. | ||
97 | */ | ||
98 | orion_write(TIMER_VAL_RELOAD(CLOCKEVENT), LATCH); | ||
99 | orion_write(TIMER_VAL(CLOCKEVENT), LATCH); | ||
100 | orion_setbits(BRIDGE_MASK, BRIDGE_INT_TIMER(CLOCKEVENT)); | ||
101 | orion_setbits(TIMER_CTRL, TIMER_RELOAD_EN(CLOCKEVENT) | | ||
102 | TIMER_EN(CLOCKEVENT)); | ||
103 | } else { | ||
104 | /* | ||
105 | * Disable timer and interrupt | ||
106 | */ | ||
107 | orion_clrbits(BRIDGE_MASK, BRIDGE_INT_TIMER(CLOCKEVENT)); | ||
108 | orion_write(BRIDGE_CAUSE, ~BRIDGE_INT_TIMER(CLOCKEVENT)); | ||
109 | orion_clrbits(TIMER_CTRL, TIMER_RELOAD_EN(CLOCKEVENT) | | ||
110 | TIMER_EN(CLOCKEVENT)); | ||
111 | } | ||
112 | |||
113 | local_irq_restore(flags); | ||
114 | } | ||
115 | |||
116 | static struct clock_event_device orion_clkevt = { | ||
117 | .name = "orion_tick", | ||
118 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | ||
119 | .shift = 32, | ||
120 | .rating = 300, | ||
121 | .cpumask = CPU_MASK_CPU0, | ||
122 | .set_next_event = orion_clkevt_next_event, | ||
123 | .set_mode = orion_clkevt_mode, | ||
124 | }; | ||
125 | |||
126 | static irqreturn_t orion_timer_interrupt(int irq, void *dev_id) | ||
127 | { | ||
128 | /* | ||
129 | * Clear cause bit and do event | ||
130 | */ | ||
131 | orion_write(BRIDGE_CAUSE, ~BRIDGE_INT_TIMER(CLOCKEVENT)); | ||
132 | orion_clkevt.event_handler(&orion_clkevt); | ||
133 | return IRQ_HANDLED; | ||
134 | } | ||
135 | |||
136 | static struct irqaction orion_timer_irq = { | ||
137 | .name = "orion_tick", | ||
138 | .flags = IRQF_DISABLED | IRQF_TIMER, | ||
139 | .handler = orion_timer_interrupt | ||
140 | }; | ||
141 | |||
142 | static void orion_timer_init(void) | ||
143 | { | ||
144 | /* | ||
145 | * Setup clocksource free running timer (no interrupt on reload) | ||
146 | */ | ||
147 | orion_write(TIMER_VAL(CLOCKSOURCE), 0xffffffff); | ||
148 | orion_write(TIMER_VAL_RELOAD(CLOCKSOURCE), 0xffffffff); | ||
149 | orion_clrbits(BRIDGE_MASK, BRIDGE_INT_TIMER(CLOCKSOURCE)); | ||
150 | orion_setbits(TIMER_CTRL, TIMER_RELOAD_EN(CLOCKSOURCE) | | ||
151 | TIMER_EN(CLOCKSOURCE)); | ||
152 | |||
153 | /* | ||
154 | * Register clocksource | ||
155 | */ | ||
156 | orion_clksrc.mult = | ||
157 | clocksource_hz2mult(CLOCK_TICK_RATE, orion_clksrc.shift); | ||
158 | |||
159 | clocksource_register(&orion_clksrc); | ||
160 | |||
161 | /* | ||
162 | * Connect and enable tick handler | ||
163 | */ | ||
164 | setup_irq(IRQ_ORION_BRIDGE, &orion_timer_irq); | ||
165 | |||
166 | /* | ||
167 | * Register clockevent | ||
168 | */ | ||
169 | orion_clkevt.mult = | ||
170 | div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC, orion_clkevt.shift); | ||
171 | orion_clkevt.max_delta_ns = | ||
172 | clockevent_delta2ns(0xfffffffe, &orion_clkevt); | ||
173 | orion_clkevt.min_delta_ns = | ||
174 | clockevent_delta2ns(1, &orion_clkevt); | ||
175 | |||
176 | clockevents_register_device(&orion_clkevt); | ||
177 | } | ||
178 | |||
179 | struct sys_timer orion_timer = { | ||
180 | .init = orion_timer_init, | ||
181 | }; | ||