diff options
Diffstat (limited to 'arch/arm/plat-mxc/time.c')
| -rw-r--r-- | arch/arm/plat-mxc/time.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/arch/arm/plat-mxc/time.c b/arch/arm/plat-mxc/time.c index 9f0c2610595e..2237ff8b434f 100644 --- a/arch/arm/plat-mxc/time.c +++ b/arch/arm/plat-mxc/time.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/clk.h> | 27 | #include <linux/clk.h> |
| 28 | 28 | ||
| 29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
| 30 | #include <asm/sched_clock.h> | ||
| 30 | #include <asm/mach/time.h> | 31 | #include <asm/mach/time.h> |
| 31 | #include <mach/common.h> | 32 | #include <mach/common.h> |
| 32 | 33 | ||
| @@ -105,6 +106,11 @@ static void gpt_irq_acknowledge(void) | |||
| 105 | __raw_writel(V2_TSTAT_OF1, timer_base + V2_TSTAT); | 106 | __raw_writel(V2_TSTAT_OF1, timer_base + V2_TSTAT); |
| 106 | } | 107 | } |
| 107 | 108 | ||
| 109 | static cycle_t dummy_get_cycles(struct clocksource *cs) | ||
| 110 | { | ||
| 111 | return 0; | ||
| 112 | } | ||
| 113 | |||
| 108 | static cycle_t mx1_2_get_cycles(struct clocksource *cs) | 114 | static cycle_t mx1_2_get_cycles(struct clocksource *cs) |
| 109 | { | 115 | { |
| 110 | return __raw_readl(timer_base + MX1_2_TCN); | 116 | return __raw_readl(timer_base + MX1_2_TCN); |
| @@ -118,18 +124,35 @@ static cycle_t v2_get_cycles(struct clocksource *cs) | |||
| 118 | static struct clocksource clocksource_mxc = { | 124 | static struct clocksource clocksource_mxc = { |
| 119 | .name = "mxc_timer1", | 125 | .name = "mxc_timer1", |
| 120 | .rating = 200, | 126 | .rating = 200, |
| 121 | .read = mx1_2_get_cycles, | 127 | .read = dummy_get_cycles, |
| 122 | .mask = CLOCKSOURCE_MASK(32), | 128 | .mask = CLOCKSOURCE_MASK(32), |
| 123 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 129 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
| 124 | }; | 130 | }; |
| 125 | 131 | ||
| 132 | static DEFINE_CLOCK_DATA(cd); | ||
| 133 | unsigned long long notrace sched_clock(void) | ||
| 134 | { | ||
| 135 | cycle_t cyc = clocksource_mxc.read(&clocksource_mxc); | ||
| 136 | |||
| 137 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
| 138 | } | ||
| 139 | |||
| 140 | static void notrace mxc_update_sched_clock(void) | ||
| 141 | { | ||
| 142 | cycle_t cyc = clocksource_mxc.read(&clocksource_mxc); | ||
| 143 | update_sched_clock(&cd, cyc, (u32)~0); | ||
| 144 | } | ||
| 145 | |||
| 126 | static int __init mxc_clocksource_init(struct clk *timer_clk) | 146 | static int __init mxc_clocksource_init(struct clk *timer_clk) |
| 127 | { | 147 | { |
| 128 | unsigned int c = clk_get_rate(timer_clk); | 148 | unsigned int c = clk_get_rate(timer_clk); |
| 129 | 149 | ||
| 130 | if (timer_is_v2()) | 150 | if (timer_is_v2()) |
| 131 | clocksource_mxc.read = v2_get_cycles; | 151 | clocksource_mxc.read = v2_get_cycles; |
| 152 | else | ||
| 153 | clocksource_mxc.read = mx1_2_get_cycles; | ||
| 132 | 154 | ||
| 155 | init_sched_clock(&cd, mxc_update_sched_clock, 32, c); | ||
| 133 | clocksource_register_hz(&clocksource_mxc, c); | 156 | clocksource_register_hz(&clocksource_mxc, c); |
| 134 | 157 | ||
| 135 | return 0; | 158 | return 0; |
