aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Frysinger <michael.frysinger@analog.com>2007-10-29 06:02:09 -0400
committerBryan Wu <bryan.wu@analog.com>2007-10-29 06:02:09 -0400
commit4ad1ec7154d7e26c1bd82c03c44690ba2b566f2f (patch)
treeb331892da1dc54c5868d574acf03bd525d622364
parent226eb1ef523a33c66193bc319a92c647e47311d4 (diff)
Blackfin arch: add support for checking/clearing overruns in generic purpose Timer API
Signed-off-by: Mike Frysinger <michael.frysinger@analog.com> Signed-off-by: Bryan Wu <bryan.wu@analog.com>
-rw-r--r--arch/blackfin/kernel/gptimers.c47
-rw-r--r--include/asm-blackfin/gptimers.h2
2 files changed, 42 insertions, 7 deletions
diff --git a/arch/blackfin/kernel/gptimers.c b/arch/blackfin/kernel/gptimers.c
index cb7ba9bfc79c..5cf4bdb1df3b 100644
--- a/arch/blackfin/kernel/gptimers.c
+++ b/arch/blackfin/kernel/gptimers.c
@@ -20,8 +20,7 @@
20#else 20#else
21# define tassert(expr) \ 21# define tassert(expr) \
22 if (!(expr)) \ 22 if (!(expr)) \
23 printk(KERN_DEBUG "%s:%s:%i: Assertion failed: " #expr "\n", \ 23 printk(KERN_DEBUG "%s:%s:%i: Assertion failed: " #expr "\n", __FILE__, __func__, __LINE__);
24 __FILE__, __func__, __LINE__);
25#endif 24#endif
26 25
27#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)
@@ -70,7 +69,7 @@ static volatile GPTIMER_group_regs *const group_regs[BFIN_TIMER_NUM_GROUP] =
70#endif 69#endif
71}; 70};
72 71
73static uint32_t const dis_mask[MAX_BLACKFIN_GPTIMERS] = 72static uint32_t const trun_mask[MAX_BLACKFIN_GPTIMERS] =
74{ 73{
75 TIMER_STATUS_TRUN0, 74 TIMER_STATUS_TRUN0,
76 TIMER_STATUS_TRUN1, 75 TIMER_STATUS_TRUN1,
@@ -90,7 +89,27 @@ static uint32_t const dis_mask[MAX_BLACKFIN_GPTIMERS] =
90#endif 89#endif
91}; 90};
92 91
93static uint32_t const irq_mask[MAX_BLACKFIN_GPTIMERS] = 92static uint32_t const tovf_mask[MAX_BLACKFIN_GPTIMERS] =
93{
94 TIMER_STATUS_TOVF0,
95 TIMER_STATUS_TOVF1,
96 TIMER_STATUS_TOVF2,
97#if (MAX_BLACKFIN_GPTIMERS > 3)
98 TIMER_STATUS_TOVF3,
99 TIMER_STATUS_TOVF4,
100 TIMER_STATUS_TOVF5,
101 TIMER_STATUS_TOVF6,
102 TIMER_STATUS_TOVF7,
103#endif
104#if (MAX_BLACKFIN_GPTIMERS > 8)
105 TIMER_STATUS_TOVF8,
106 TIMER_STATUS_TOVF9,
107 TIMER_STATUS_TOVF10,
108 TIMER_STATUS_TOVF11,
109#endif
110};
111
112static uint32_t const timil_mask[MAX_BLACKFIN_GPTIMERS] =
94{ 113{
95 TIMER_STATUS_TIMIL0, 114 TIMER_STATUS_TIMIL0,
96 TIMER_STATUS_TIMIL1, 115 TIMER_STATUS_TIMIL1,
@@ -165,17 +184,31 @@ EXPORT_SYMBOL(set_gptimer_status);
165uint16_t get_gptimer_intr(int timer_id) 184uint16_t get_gptimer_intr(int timer_id)
166{ 185{
167 tassert(timer_id < MAX_BLACKFIN_GPTIMERS); 186 tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
168 return (group_regs[BFIN_TIMER_OCTET(timer_id)]->status & irq_mask[timer_id]) ? 1 : 0; 187 return (group_regs[BFIN_TIMER_OCTET(timer_id)]->status & timil_mask[timer_id]) ? 1 : 0;
169} 188}
170EXPORT_SYMBOL(get_gptimer_intr); 189EXPORT_SYMBOL(get_gptimer_intr);
171 190
172void clear_gptimer_intr(int timer_id) 191void clear_gptimer_intr(int timer_id)
173{ 192{
174 tassert(timer_id < MAX_BLACKFIN_GPTIMERS); 193 tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
175 group_regs[BFIN_TIMER_OCTET(timer_id)]->status = irq_mask[timer_id]; 194 group_regs[BFIN_TIMER_OCTET(timer_id)]->status = timil_mask[timer_id];
176} 195}
177EXPORT_SYMBOL(clear_gptimer_intr); 196EXPORT_SYMBOL(clear_gptimer_intr);
178 197
198uint16_t get_gptimer_over(int timer_id)
199{
200 tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
201 return (group_regs[BFIN_TIMER_OCTET(timer_id)]->status & tovf_mask[timer_id]) ? 1 : 0;
202}
203EXPORT_SYMBOL(get_gptimer_over);
204
205void clear_gptimer_over(int timer_id)
206{
207 tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
208 group_regs[BFIN_TIMER_OCTET(timer_id)]->status = tovf_mask[timer_id];
209}
210EXPORT_SYMBOL(clear_gptimer_over);
211
179void set_gptimer_config(int timer_id, uint16_t config) 212void set_gptimer_config(int timer_id, uint16_t config)
180{ 213{
181 tassert(timer_id < MAX_BLACKFIN_GPTIMERS); 214 tassert(timer_id < MAX_BLACKFIN_GPTIMERS);
@@ -214,7 +247,7 @@ void disable_gptimers(uint16_t mask)
214 } 247 }
215 for (i = 0; i < MAX_BLACKFIN_GPTIMERS; ++i) 248 for (i = 0; i < MAX_BLACKFIN_GPTIMERS; ++i)
216 if (mask & (1 << i)) 249 if (mask & (1 << i))
217 group_regs[BFIN_TIMER_OCTET(i)]->status |= dis_mask[i]; 250 group_regs[BFIN_TIMER_OCTET(i)]->status |= trun_mask[i];
218 SSYNC(); 251 SSYNC();
219} 252}
220EXPORT_SYMBOL(disable_gptimers); 253EXPORT_SYMBOL(disable_gptimers);
diff --git a/include/asm-blackfin/gptimers.h b/include/asm-blackfin/gptimers.h
index c97ab03e43a6..8265ea473d5b 100644
--- a/include/asm-blackfin/gptimers.h
+++ b/include/asm-blackfin/gptimers.h
@@ -197,6 +197,8 @@ uint32_t get_gptimer_period (int timer_id);
197uint32_t get_gptimer_count (int timer_id); 197uint32_t get_gptimer_count (int timer_id);
198uint16_t get_gptimer_intr (int timer_id); 198uint16_t get_gptimer_intr (int timer_id);
199void clear_gptimer_intr (int timer_id); 199void clear_gptimer_intr (int timer_id);
200uint16_t get_gptimer_over (int timer_id);
201void clear_gptimer_over (int timer_id);
200void set_gptimer_config (int timer_id, uint16_t config); 202void set_gptimer_config (int timer_id, uint16_t config);
201uint16_t get_gptimer_config (int timer_id); 203uint16_t get_gptimer_config (int timer_id);
202void set_gptimer_pulse_hi (int timer_id); 204void set_gptimer_pulse_hi (int timer_id);