diff options
Diffstat (limited to 'arch/arm/plat-omap')
-rw-r--r-- | arch/arm/plat-omap/counter_32k.c | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index 8722a136f3a5..ea4644021fb9 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c | |||
@@ -15,8 +15,11 @@ | |||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
18 | #include <linux/io.h> | ||
19 | #include <linux/err.h> | 18 | #include <linux/err.h> |
19 | #include <linux/io.h> | ||
20 | #include <linux/sched.h> | ||
21 | |||
22 | #include <asm/sched_clock.h> | ||
20 | 23 | ||
21 | #include <plat/common.h> | 24 | #include <plat/common.h> |
22 | #include <plat/board.h> | 25 | #include <plat/board.h> |
@@ -45,7 +48,7 @@ | |||
45 | static u32 offset_32k __read_mostly; | 48 | static u32 offset_32k __read_mostly; |
46 | 49 | ||
47 | #ifdef CONFIG_ARCH_OMAP16XX | 50 | #ifdef CONFIG_ARCH_OMAP16XX |
48 | static cycle_t omap16xx_32k_read(struct clocksource *cs) | 51 | static cycle_t notrace omap16xx_32k_read(struct clocksource *cs) |
49 | { | 52 | { |
50 | return omap_readl(OMAP16XX_TIMER_32K_SYNCHRONIZED) - offset_32k; | 53 | return omap_readl(OMAP16XX_TIMER_32K_SYNCHRONIZED) - offset_32k; |
51 | } | 54 | } |
@@ -54,7 +57,7 @@ static cycle_t omap16xx_32k_read(struct clocksource *cs) | |||
54 | #endif | 57 | #endif |
55 | 58 | ||
56 | #ifdef CONFIG_ARCH_OMAP2420 | 59 | #ifdef CONFIG_ARCH_OMAP2420 |
57 | static cycle_t omap2420_32k_read(struct clocksource *cs) | 60 | static cycle_t notrace omap2420_32k_read(struct clocksource *cs) |
58 | { | 61 | { |
59 | return omap_readl(OMAP2420_32KSYNCT_BASE + 0x10) - offset_32k; | 62 | return omap_readl(OMAP2420_32KSYNCT_BASE + 0x10) - offset_32k; |
60 | } | 63 | } |
@@ -63,7 +66,7 @@ static cycle_t omap2420_32k_read(struct clocksource *cs) | |||
63 | #endif | 66 | #endif |
64 | 67 | ||
65 | #ifdef CONFIG_ARCH_OMAP2430 | 68 | #ifdef CONFIG_ARCH_OMAP2430 |
66 | static cycle_t omap2430_32k_read(struct clocksource *cs) | 69 | static cycle_t notrace omap2430_32k_read(struct clocksource *cs) |
67 | { | 70 | { |
68 | return omap_readl(OMAP2430_32KSYNCT_BASE + 0x10) - offset_32k; | 71 | return omap_readl(OMAP2430_32KSYNCT_BASE + 0x10) - offset_32k; |
69 | } | 72 | } |
@@ -72,7 +75,7 @@ static cycle_t omap2430_32k_read(struct clocksource *cs) | |||
72 | #endif | 75 | #endif |
73 | 76 | ||
74 | #ifdef CONFIG_ARCH_OMAP3 | 77 | #ifdef CONFIG_ARCH_OMAP3 |
75 | static cycle_t omap34xx_32k_read(struct clocksource *cs) | 78 | static cycle_t notrace omap34xx_32k_read(struct clocksource *cs) |
76 | { | 79 | { |
77 | return omap_readl(OMAP3430_32KSYNCT_BASE + 0x10) - offset_32k; | 80 | return omap_readl(OMAP3430_32KSYNCT_BASE + 0x10) - offset_32k; |
78 | } | 81 | } |
@@ -81,7 +84,7 @@ static cycle_t omap34xx_32k_read(struct clocksource *cs) | |||
81 | #endif | 84 | #endif |
82 | 85 | ||
83 | #ifdef CONFIG_ARCH_OMAP4 | 86 | #ifdef CONFIG_ARCH_OMAP4 |
84 | static cycle_t omap44xx_32k_read(struct clocksource *cs) | 87 | static cycle_t notrace omap44xx_32k_read(struct clocksource *cs) |
85 | { | 88 | { |
86 | return omap_readl(OMAP4430_32KSYNCT_BASE + 0x10) - offset_32k; | 89 | return omap_readl(OMAP4430_32KSYNCT_BASE + 0x10) - offset_32k; |
87 | } | 90 | } |
@@ -93,7 +96,7 @@ static cycle_t omap44xx_32k_read(struct clocksource *cs) | |||
93 | * Kernel assumes that sched_clock can be called early but may not have | 96 | * Kernel assumes that sched_clock can be called early but may not have |
94 | * things ready yet. | 97 | * things ready yet. |
95 | */ | 98 | */ |
96 | static cycle_t omap_32k_read_dummy(struct clocksource *cs) | 99 | static cycle_t notrace omap_32k_read_dummy(struct clocksource *cs) |
97 | { | 100 | { |
98 | return 0; | 101 | return 0; |
99 | } | 102 | } |
@@ -103,7 +106,6 @@ static struct clocksource clocksource_32k = { | |||
103 | .rating = 250, | 106 | .rating = 250, |
104 | .read = omap_32k_read_dummy, | 107 | .read = omap_32k_read_dummy, |
105 | .mask = CLOCKSOURCE_MASK(32), | 108 | .mask = CLOCKSOURCE_MASK(32), |
106 | .shift = 10, | ||
107 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 109 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
108 | }; | 110 | }; |
109 | 111 | ||
@@ -111,10 +113,25 @@ static struct clocksource clocksource_32k = { | |||
111 | * Returns current time from boot in nsecs. It's OK for this to wrap | 113 | * Returns current time from boot in nsecs. It's OK for this to wrap |
112 | * around for now, as it's just a relative time stamp. | 114 | * around for now, as it's just a relative time stamp. |
113 | */ | 115 | */ |
114 | unsigned long long sched_clock(void) | 116 | static DEFINE_CLOCK_DATA(cd); |
117 | |||
118 | /* | ||
119 | * Constants generated by clocks_calc_mult_shift(m, s, 32768, NSEC_PER_SEC, 60). | ||
120 | * This gives a resolution of about 30us and a wrap period of about 36hrs. | ||
121 | */ | ||
122 | #define SC_MULT 4000000000u | ||
123 | #define SC_SHIFT 17 | ||
124 | |||
125 | unsigned long long notrace sched_clock(void) | ||
126 | { | ||
127 | u32 cyc = clocksource_32k.read(&clocksource_32k); | ||
128 | return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT); | ||
129 | } | ||
130 | |||
131 | static void notrace omap_update_sched_clock(void) | ||
115 | { | 132 | { |
116 | return clocksource_cyc2ns(clocksource_32k.read(&clocksource_32k), | 133 | u32 cyc = clocksource_32k.read(&clocksource_32k); |
117 | clocksource_32k.mult, clocksource_32k.shift); | 134 | update_sched_clock(&cd, cyc, (u32)~0); |
118 | } | 135 | } |
119 | 136 | ||
120 | /** | 137 | /** |
@@ -168,13 +185,13 @@ static int __init omap_init_clocksource_32k(void) | |||
168 | if (!IS_ERR(sync_32k_ick)) | 185 | if (!IS_ERR(sync_32k_ick)) |
169 | clk_enable(sync_32k_ick); | 186 | clk_enable(sync_32k_ick); |
170 | 187 | ||
171 | clocksource_32k.mult = clocksource_hz2mult(32768, | ||
172 | clocksource_32k.shift); | ||
173 | |||
174 | offset_32k = clocksource_32k.read(&clocksource_32k); | 188 | offset_32k = clocksource_32k.read(&clocksource_32k); |
175 | 189 | ||
176 | if (clocksource_register(&clocksource_32k)) | 190 | if (clocksource_register_hz(&clocksource_32k, 32768)) |
177 | printk(err, clocksource_32k.name); | 191 | printk(err, clocksource_32k.name); |
192 | |||
193 | init_fixed_sched_clock(&cd, omap_update_sched_clock, 32, | ||
194 | 32768, SC_MULT, SC_SHIFT); | ||
178 | } | 195 | } |
179 | return 0; | 196 | return 0; |
180 | } | 197 | } |