diff options
Diffstat (limited to 'arch/blackfin/kernel/gptimers.c')
-rw-r--r-- | arch/blackfin/kernel/gptimers.c | 93 |
1 files changed, 41 insertions, 52 deletions
diff --git a/arch/blackfin/kernel/gptimers.c b/arch/blackfin/kernel/gptimers.c index 8b81dc04488..06459f4bf43 100644 --- a/arch/blackfin/kernel/gptimers.c +++ b/arch/blackfin/kernel/gptimers.c | |||
@@ -25,49 +25,33 @@ | |||
25 | 25 | ||
26 | #define BFIN_TIMER_NUM_GROUP (BFIN_TIMER_OCTET(MAX_BLACKFIN_GPTIMERS - 1) + 1) | 26 | #define BFIN_TIMER_NUM_GROUP (BFIN_TIMER_OCTET(MAX_BLACKFIN_GPTIMERS - 1) + 1) |
27 | 27 | ||
28 | typedef struct { | 28 | static struct bfin_gptimer_regs * const timer_regs[MAX_BLACKFIN_GPTIMERS] = |
29 | uint16_t config; | ||
30 | uint16_t __pad; | ||
31 | uint32_t counter; | ||
32 | uint32_t period; | ||
33 | uint32_t width; | ||
34 | } GPTIMER_timer_regs; | ||
35 | |||
36 | typedef struct { | ||
37 | uint16_t enable; | ||
38 | uint16_t __pad0; | ||
39 | uint16_t disable; | ||
40 | uint16_t __pad1; | ||
41 | uint32_t status; | ||
42 | } GPTIMER_group_regs; | ||
43 | |||
44 | static volatile GPTIMER_timer_regs *const timer_regs[MAX_BLACKFIN_GPTIMERS] = | ||
45 | { | 29 | { |
46 | (GPTIMER_timer_regs *)TIMER0_CONFIG, | 30 | (void *)TIMER0_CONFIG, |
47 | (GPTIMER_timer_regs *)TIMER1_CONFIG, | 31 | (void *)TIMER1_CONFIG, |
48 | (GPTIMER_timer_regs *)TIMER2_CONFIG, | 32 | (void *)TIMER2_CONFIG, |
49 | #if (MAX_BLACKFIN_GPTIMERS > 3) | 33 | #if (MAX_BLACKFIN_GPTIMERS > 3) |
50 | (GPTIMER_timer_regs *)TIMER3_CONFIG, | 34 | (void *)TIMER3_CONFIG, |
51 | (GPTIMER_timer_regs *)TIMER4_CONFIG, | 35 | (void *)TIMER4_CONFIG, |
52 | (GPTIMER_timer_regs *)TIMER5_CONFIG, | 36 | (void *)TIMER5_CONFIG, |
53 | (GPTIMER_timer_regs *)TIMER6_CONFIG, | 37 | (void *)TIMER6_CONFIG, |
54 | (GPTIMER_timer_regs *)TIMER7_CONFIG, | 38 | (void *)TIMER7_CONFIG, |
55 | # if (MAX_BLACKFIN_GPTIMERS > 8) | 39 | # if (MAX_BLACKFIN_GPTIMERS > 8) |
56 | (GPTIMER_timer_regs *)TIMER8_CONFIG, | 40 | (void *)TIMER8_CONFIG, |
57 | (GPTIMER_timer_regs *)TIMER9_CONFIG, | 41 | (void *)TIMER9_CONFIG, |
58 | (GPTIMER_timer_regs *)TIMER10_CONFIG, | 42 | (void *)TIMER10_CONFIG, |
59 | # if (MAX_BLACKFIN_GPTIMERS > 11) | 43 | # if (MAX_BLACKFIN_GPTIMERS > 11) |
60 | (GPTIMER_timer_regs *)TIMER11_CONFIG, | 44 | (void *)TIMER11_CONFIG, |
61 | # endif | 45 | # endif |
62 | # endif | 46 | # endif |
63 | #endif | 47 | #endif |
64 | }; | 48 | }; |
65 | 49 | ||
66 | static volatile GPTIMER_group_regs *const group_regs[BFIN_TIMER_NUM_GROUP] = | 50 | static struct bfin_gptimer_group_regs * const group_regs[BFIN_TIMER_NUM_GROUP] = |
67 | { | 51 | { |
68 | (GPTIMER_group_regs *)TIMER0_GROUP_REG, | 52 | (void *)TIMER0_GROUP_REG, |
69 | #if (MAX_BLACKFIN_GPTIMERS > 8) | 53 | #if (MAX_BLACKFIN_GPTIMERS > 8) |
70 | (GPTIMER_group_regs *)TIMER8_GROUP_REG, | 54 | (void *)TIMER8_GROUP_REG, |
71 | #endif | 55 | #endif |
72 | }; | 56 | }; |
73 | 57 | ||
@@ -140,7 +124,7 @@ static uint32_t const timil_mask[MAX_BLACKFIN_GPTIMERS] = | |||
140 | void set_gptimer_pwidth(unsigned int timer_id, uint32_t value) | 124 | void set_gptimer_pwidth(unsigned int timer_id, uint32_t value) |
141 | { | 125 | { |
142 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 126 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
143 | timer_regs[timer_id]->width = value; | 127 | bfin_write(&timer_regs[timer_id]->width, value); |
144 | SSYNC(); | 128 | SSYNC(); |
145 | } | 129 | } |
146 | EXPORT_SYMBOL(set_gptimer_pwidth); | 130 | EXPORT_SYMBOL(set_gptimer_pwidth); |
@@ -148,14 +132,14 @@ EXPORT_SYMBOL(set_gptimer_pwidth); | |||
148 | uint32_t get_gptimer_pwidth(unsigned int timer_id) | 132 | uint32_t get_gptimer_pwidth(unsigned int timer_id) |
149 | { | 133 | { |
150 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 134 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
151 | return timer_regs[timer_id]->width; | 135 | return bfin_read(&timer_regs[timer_id]->width); |
152 | } | 136 | } |
153 | EXPORT_SYMBOL(get_gptimer_pwidth); | 137 | EXPORT_SYMBOL(get_gptimer_pwidth); |
154 | 138 | ||
155 | void set_gptimer_period(unsigned int timer_id, uint32_t period) | 139 | void set_gptimer_period(unsigned int timer_id, uint32_t period) |
156 | { | 140 | { |
157 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 141 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
158 | timer_regs[timer_id]->period = period; | 142 | bfin_write(&timer_regs[timer_id]->period, period); |
159 | SSYNC(); | 143 | SSYNC(); |
160 | } | 144 | } |
161 | EXPORT_SYMBOL(set_gptimer_period); | 145 | EXPORT_SYMBOL(set_gptimer_period); |
@@ -163,71 +147,76 @@ EXPORT_SYMBOL(set_gptimer_period); | |||
163 | uint32_t get_gptimer_period(unsigned int timer_id) | 147 | uint32_t get_gptimer_period(unsigned int timer_id) |
164 | { | 148 | { |
165 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 149 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
166 | return timer_regs[timer_id]->period; | 150 | return bfin_read(&timer_regs[timer_id]->period); |
167 | } | 151 | } |
168 | EXPORT_SYMBOL(get_gptimer_period); | 152 | EXPORT_SYMBOL(get_gptimer_period); |
169 | 153 | ||
170 | uint32_t get_gptimer_count(unsigned int timer_id) | 154 | uint32_t get_gptimer_count(unsigned int timer_id) |
171 | { | 155 | { |
172 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 156 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
173 | return timer_regs[timer_id]->counter; | 157 | return bfin_read(&timer_regs[timer_id]->counter); |
174 | } | 158 | } |
175 | EXPORT_SYMBOL(get_gptimer_count); | 159 | EXPORT_SYMBOL(get_gptimer_count); |
176 | 160 | ||
177 | uint32_t get_gptimer_status(unsigned int group) | 161 | uint32_t get_gptimer_status(unsigned int group) |
178 | { | 162 | { |
179 | tassert(group < BFIN_TIMER_NUM_GROUP); | 163 | tassert(group < BFIN_TIMER_NUM_GROUP); |
180 | return group_regs[group]->status; | 164 | return bfin_read(&group_regs[group]->status); |
181 | } | 165 | } |
182 | EXPORT_SYMBOL(get_gptimer_status); | 166 | EXPORT_SYMBOL(get_gptimer_status); |
183 | 167 | ||
184 | void set_gptimer_status(unsigned int group, uint32_t value) | 168 | void set_gptimer_status(unsigned int group, uint32_t value) |
185 | { | 169 | { |
186 | tassert(group < BFIN_TIMER_NUM_GROUP); | 170 | tassert(group < BFIN_TIMER_NUM_GROUP); |
187 | group_regs[group]->status = value; | 171 | bfin_write(&group_regs[group]->status, value); |
188 | SSYNC(); | 172 | SSYNC(); |
189 | } | 173 | } |
190 | EXPORT_SYMBOL(set_gptimer_status); | 174 | EXPORT_SYMBOL(set_gptimer_status); |
191 | 175 | ||
176 | static uint32_t read_gptimer_status(unsigned int timer_id) | ||
177 | { | ||
178 | return bfin_read(&group_regs[BFIN_TIMER_OCTET(timer_id)]->status); | ||
179 | } | ||
180 | |||
192 | int get_gptimer_intr(unsigned int timer_id) | 181 | int get_gptimer_intr(unsigned int timer_id) |
193 | { | 182 | { |
194 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 183 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
195 | return !!(group_regs[BFIN_TIMER_OCTET(timer_id)]->status & timil_mask[timer_id]); | 184 | return !!(read_gptimer_status(timer_id) & timil_mask[timer_id]); |
196 | } | 185 | } |
197 | EXPORT_SYMBOL(get_gptimer_intr); | 186 | EXPORT_SYMBOL(get_gptimer_intr); |
198 | 187 | ||
199 | void clear_gptimer_intr(unsigned int timer_id) | 188 | void clear_gptimer_intr(unsigned int timer_id) |
200 | { | 189 | { |
201 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 190 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
202 | group_regs[BFIN_TIMER_OCTET(timer_id)]->status = timil_mask[timer_id]; | 191 | bfin_write(&group_regs[BFIN_TIMER_OCTET(timer_id)]->status, timil_mask[timer_id]); |
203 | } | 192 | } |
204 | EXPORT_SYMBOL(clear_gptimer_intr); | 193 | EXPORT_SYMBOL(clear_gptimer_intr); |
205 | 194 | ||
206 | int get_gptimer_over(unsigned int timer_id) | 195 | int get_gptimer_over(unsigned int timer_id) |
207 | { | 196 | { |
208 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 197 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
209 | return !!(group_regs[BFIN_TIMER_OCTET(timer_id)]->status & tovf_mask[timer_id]); | 198 | return !!(read_gptimer_status(timer_id) & tovf_mask[timer_id]); |
210 | } | 199 | } |
211 | EXPORT_SYMBOL(get_gptimer_over); | 200 | EXPORT_SYMBOL(get_gptimer_over); |
212 | 201 | ||
213 | void clear_gptimer_over(unsigned int timer_id) | 202 | void clear_gptimer_over(unsigned int timer_id) |
214 | { | 203 | { |
215 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 204 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
216 | group_regs[BFIN_TIMER_OCTET(timer_id)]->status = tovf_mask[timer_id]; | 205 | bfin_write(&group_regs[BFIN_TIMER_OCTET(timer_id)]->status, tovf_mask[timer_id]); |
217 | } | 206 | } |
218 | EXPORT_SYMBOL(clear_gptimer_over); | 207 | EXPORT_SYMBOL(clear_gptimer_over); |
219 | 208 | ||
220 | int get_gptimer_run(unsigned int timer_id) | 209 | int get_gptimer_run(unsigned int timer_id) |
221 | { | 210 | { |
222 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 211 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
223 | return !!(group_regs[BFIN_TIMER_OCTET(timer_id)]->status & trun_mask[timer_id]); | 212 | return !!(read_gptimer_status(timer_id) & trun_mask[timer_id]); |
224 | } | 213 | } |
225 | EXPORT_SYMBOL(get_gptimer_run); | 214 | EXPORT_SYMBOL(get_gptimer_run); |
226 | 215 | ||
227 | void set_gptimer_config(unsigned int timer_id, uint16_t config) | 216 | void set_gptimer_config(unsigned int timer_id, uint16_t config) |
228 | { | 217 | { |
229 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 218 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
230 | timer_regs[timer_id]->config = config; | 219 | bfin_write(&timer_regs[timer_id]->config, config); |
231 | SSYNC(); | 220 | SSYNC(); |
232 | } | 221 | } |
233 | EXPORT_SYMBOL(set_gptimer_config); | 222 | EXPORT_SYMBOL(set_gptimer_config); |
@@ -235,7 +224,7 @@ EXPORT_SYMBOL(set_gptimer_config); | |||
235 | uint16_t get_gptimer_config(unsigned int timer_id) | 224 | uint16_t get_gptimer_config(unsigned int timer_id) |
236 | { | 225 | { |
237 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 226 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
238 | return timer_regs[timer_id]->config; | 227 | return bfin_read(&timer_regs[timer_id]->config); |
239 | } | 228 | } |
240 | EXPORT_SYMBOL(get_gptimer_config); | 229 | EXPORT_SYMBOL(get_gptimer_config); |
241 | 230 | ||
@@ -244,7 +233,7 @@ void enable_gptimers(uint16_t mask) | |||
244 | int i; | 233 | int i; |
245 | tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0); | 234 | tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0); |
246 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) { | 235 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) { |
247 | group_regs[i]->enable = mask & 0xFF; | 236 | bfin_write(&group_regs[i]->enable, mask & 0xFF); |
248 | mask >>= 8; | 237 | mask >>= 8; |
249 | } | 238 | } |
250 | SSYNC(); | 239 | SSYNC(); |
@@ -257,7 +246,7 @@ static void _disable_gptimers(uint16_t mask) | |||
257 | uint16_t m = mask; | 246 | uint16_t m = mask; |
258 | tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0); | 247 | tassert((mask & ~BLACKFIN_GPTIMER_IDMASK) == 0); |
259 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) { | 248 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) { |
260 | group_regs[i]->disable = m & 0xFF; | 249 | bfin_write(&group_regs[i]->disable, m & 0xFF); |
261 | m >>= 8; | 250 | m >>= 8; |
262 | } | 251 | } |
263 | } | 252 | } |
@@ -268,7 +257,7 @@ void disable_gptimers(uint16_t mask) | |||
268 | _disable_gptimers(mask); | 257 | _disable_gptimers(mask); |
269 | for (i = 0; i < MAX_BLACKFIN_GPTIMERS; ++i) | 258 | for (i = 0; i < MAX_BLACKFIN_GPTIMERS; ++i) |
270 | if (mask & (1 << i)) | 259 | if (mask & (1 << i)) |
271 | group_regs[BFIN_TIMER_OCTET(i)]->status = trun_mask[i]; | 260 | bfin_write(&group_regs[BFIN_TIMER_OCTET(i)]->status, trun_mask[i]); |
272 | SSYNC(); | 261 | SSYNC(); |
273 | } | 262 | } |
274 | EXPORT_SYMBOL(disable_gptimers); | 263 | EXPORT_SYMBOL(disable_gptimers); |
@@ -283,7 +272,7 @@ EXPORT_SYMBOL(disable_gptimers_sync); | |||
283 | void set_gptimer_pulse_hi(unsigned int timer_id) | 272 | void set_gptimer_pulse_hi(unsigned int timer_id) |
284 | { | 273 | { |
285 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 274 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
286 | timer_regs[timer_id]->config |= TIMER_PULSE_HI; | 275 | bfin_write_or(&timer_regs[timer_id]->config, TIMER_PULSE_HI); |
287 | SSYNC(); | 276 | SSYNC(); |
288 | } | 277 | } |
289 | EXPORT_SYMBOL(set_gptimer_pulse_hi); | 278 | EXPORT_SYMBOL(set_gptimer_pulse_hi); |
@@ -291,7 +280,7 @@ EXPORT_SYMBOL(set_gptimer_pulse_hi); | |||
291 | void clear_gptimer_pulse_hi(unsigned int timer_id) | 280 | void clear_gptimer_pulse_hi(unsigned int timer_id) |
292 | { | 281 | { |
293 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); | 282 | tassert(timer_id < MAX_BLACKFIN_GPTIMERS); |
294 | timer_regs[timer_id]->config &= ~TIMER_PULSE_HI; | 283 | bfin_write_and(&timer_regs[timer_id]->config, ~TIMER_PULSE_HI); |
295 | SSYNC(); | 284 | SSYNC(); |
296 | } | 285 | } |
297 | EXPORT_SYMBOL(clear_gptimer_pulse_hi); | 286 | EXPORT_SYMBOL(clear_gptimer_pulse_hi); |
@@ -301,7 +290,7 @@ uint16_t get_enabled_gptimers(void) | |||
301 | int i; | 290 | int i; |
302 | uint16_t result = 0; | 291 | uint16_t result = 0; |
303 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) | 292 | for (i = 0; i < BFIN_TIMER_NUM_GROUP; ++i) |
304 | result |= (group_regs[i]->enable << (i << 3)); | 293 | result |= (bfin_read(&group_regs[i]->enable) << (i << 3)); |
305 | return result; | 294 | return result; |
306 | } | 295 | } |
307 | EXPORT_SYMBOL(get_enabled_gptimers); | 296 | EXPORT_SYMBOL(get_enabled_gptimers); |