Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/counter/stm32-timer-cnt.c
26278 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* STM32 Timer Encoder and Counter driver
4
*
5
* Copyright (C) STMicroelectronics 2018
6
*
7
* Author: Benjamin Gaignard <[email protected]>
8
*
9
*/
10
#include <linux/counter.h>
11
#include <linux/interrupt.h>
12
#include <linux/mfd/stm32-timers.h>
13
#include <linux/mod_devicetable.h>
14
#include <linux/module.h>
15
#include <linux/of.h>
16
#include <linux/pinctrl/consumer.h>
17
#include <linux/platform_device.h>
18
#include <linux/types.h>
19
20
#define TIM_CCMR_CCXS (BIT(8) | BIT(0))
21
#define TIM_CCMR_MASK (TIM_CCMR_CC1S | TIM_CCMR_CC2S | \
22
TIM_CCMR_IC1F | TIM_CCMR_IC2F)
23
#define TIM_CCER_MASK (TIM_CCER_CC1P | TIM_CCER_CC1NP | \
24
TIM_CCER_CC2P | TIM_CCER_CC2NP)
25
26
#define STM32_CH1_SIG 0
27
#define STM32_CH2_SIG 1
28
#define STM32_CLOCK_SIG 2
29
#define STM32_CH3_SIG 3
30
#define STM32_CH4_SIG 4
31
32
struct stm32_timer_regs {
33
u32 cr1;
34
u32 cnt;
35
u32 smcr;
36
u32 arr;
37
};
38
39
struct stm32_timer_cnt {
40
struct regmap *regmap;
41
struct clk *clk;
42
u32 max_arr;
43
bool enabled;
44
struct stm32_timer_regs bak;
45
bool has_encoder;
46
unsigned int nchannels;
47
unsigned int nr_irqs;
48
spinlock_t lock; /* protects nb_ovf */
49
u64 nb_ovf;
50
};
51
52
static const enum counter_function stm32_count_functions[] = {
53
COUNTER_FUNCTION_INCREASE,
54
COUNTER_FUNCTION_QUADRATURE_X2_A,
55
COUNTER_FUNCTION_QUADRATURE_X2_B,
56
COUNTER_FUNCTION_QUADRATURE_X4,
57
};
58
59
static int stm32_count_read(struct counter_device *counter,
60
struct counter_count *count, u64 *val)
61
{
62
struct stm32_timer_cnt *const priv = counter_priv(counter);
63
u32 cnt;
64
65
regmap_read(priv->regmap, TIM_CNT, &cnt);
66
*val = cnt;
67
68
return 0;
69
}
70
71
static int stm32_count_write(struct counter_device *counter,
72
struct counter_count *count, const u64 val)
73
{
74
struct stm32_timer_cnt *const priv = counter_priv(counter);
75
u32 ceiling;
76
77
regmap_read(priv->regmap, TIM_ARR, &ceiling);
78
if (val > ceiling)
79
return -EINVAL;
80
81
return regmap_write(priv->regmap, TIM_CNT, val);
82
}
83
84
static int stm32_count_function_read(struct counter_device *counter,
85
struct counter_count *count,
86
enum counter_function *function)
87
{
88
struct stm32_timer_cnt *const priv = counter_priv(counter);
89
u32 smcr;
90
91
regmap_read(priv->regmap, TIM_SMCR, &smcr);
92
93
switch (smcr & TIM_SMCR_SMS) {
94
case TIM_SMCR_SMS_SLAVE_MODE_DISABLED:
95
*function = COUNTER_FUNCTION_INCREASE;
96
return 0;
97
case TIM_SMCR_SMS_ENCODER_MODE_1:
98
*function = COUNTER_FUNCTION_QUADRATURE_X2_A;
99
return 0;
100
case TIM_SMCR_SMS_ENCODER_MODE_2:
101
*function = COUNTER_FUNCTION_QUADRATURE_X2_B;
102
return 0;
103
case TIM_SMCR_SMS_ENCODER_MODE_3:
104
*function = COUNTER_FUNCTION_QUADRATURE_X4;
105
return 0;
106
default:
107
return -EINVAL;
108
}
109
}
110
111
static int stm32_count_function_write(struct counter_device *counter,
112
struct counter_count *count,
113
enum counter_function function)
114
{
115
struct stm32_timer_cnt *const priv = counter_priv(counter);
116
u32 cr1, sms;
117
118
switch (function) {
119
case COUNTER_FUNCTION_INCREASE:
120
sms = TIM_SMCR_SMS_SLAVE_MODE_DISABLED;
121
break;
122
case COUNTER_FUNCTION_QUADRATURE_X2_A:
123
if (!priv->has_encoder)
124
return -EOPNOTSUPP;
125
sms = TIM_SMCR_SMS_ENCODER_MODE_1;
126
break;
127
case COUNTER_FUNCTION_QUADRATURE_X2_B:
128
if (!priv->has_encoder)
129
return -EOPNOTSUPP;
130
sms = TIM_SMCR_SMS_ENCODER_MODE_2;
131
break;
132
case COUNTER_FUNCTION_QUADRATURE_X4:
133
if (!priv->has_encoder)
134
return -EOPNOTSUPP;
135
sms = TIM_SMCR_SMS_ENCODER_MODE_3;
136
break;
137
default:
138
return -EINVAL;
139
}
140
141
/* Store enable status */
142
regmap_read(priv->regmap, TIM_CR1, &cr1);
143
144
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
145
146
regmap_update_bits(priv->regmap, TIM_SMCR, TIM_SMCR_SMS, sms);
147
148
/* Make sure that registers are updated */
149
regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG);
150
151
/* Restore the enable status */
152
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, cr1);
153
154
return 0;
155
}
156
157
static int stm32_count_direction_read(struct counter_device *counter,
158
struct counter_count *count,
159
enum counter_count_direction *direction)
160
{
161
struct stm32_timer_cnt *const priv = counter_priv(counter);
162
u32 cr1;
163
164
regmap_read(priv->regmap, TIM_CR1, &cr1);
165
*direction = (cr1 & TIM_CR1_DIR) ? COUNTER_COUNT_DIRECTION_BACKWARD :
166
COUNTER_COUNT_DIRECTION_FORWARD;
167
168
return 0;
169
}
170
171
static int stm32_count_ceiling_read(struct counter_device *counter,
172
struct counter_count *count, u64 *ceiling)
173
{
174
struct stm32_timer_cnt *const priv = counter_priv(counter);
175
u32 arr;
176
177
regmap_read(priv->regmap, TIM_ARR, &arr);
178
179
*ceiling = arr;
180
181
return 0;
182
}
183
184
static int stm32_count_ceiling_write(struct counter_device *counter,
185
struct counter_count *count, u64 ceiling)
186
{
187
struct stm32_timer_cnt *const priv = counter_priv(counter);
188
189
if (ceiling > priv->max_arr)
190
return -ERANGE;
191
192
/* TIMx_ARR register shouldn't be buffered (ARPE=0) */
193
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0);
194
regmap_write(priv->regmap, TIM_ARR, ceiling);
195
196
return 0;
197
}
198
199
static int stm32_count_enable_read(struct counter_device *counter,
200
struct counter_count *count, u8 *enable)
201
{
202
struct stm32_timer_cnt *const priv = counter_priv(counter);
203
u32 cr1;
204
205
regmap_read(priv->regmap, TIM_CR1, &cr1);
206
207
*enable = cr1 & TIM_CR1_CEN;
208
209
return 0;
210
}
211
212
static int stm32_count_enable_write(struct counter_device *counter,
213
struct counter_count *count, u8 enable)
214
{
215
struct stm32_timer_cnt *const priv = counter_priv(counter);
216
u32 cr1;
217
int ret;
218
219
if (enable) {
220
regmap_read(priv->regmap, TIM_CR1, &cr1);
221
if (!(cr1 & TIM_CR1_CEN)) {
222
ret = clk_enable(priv->clk);
223
if (ret) {
224
dev_err(counter->parent, "Cannot enable clock %d\n", ret);
225
return ret;
226
}
227
}
228
229
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN,
230
TIM_CR1_CEN);
231
} else {
232
regmap_read(priv->regmap, TIM_CR1, &cr1);
233
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
234
if (cr1 & TIM_CR1_CEN)
235
clk_disable(priv->clk);
236
}
237
238
/* Keep enabled state to properly handle low power states */
239
priv->enabled = enable;
240
241
return 0;
242
}
243
244
static int stm32_count_prescaler_read(struct counter_device *counter,
245
struct counter_count *count, u64 *prescaler)
246
{
247
struct stm32_timer_cnt *const priv = counter_priv(counter);
248
u32 psc;
249
250
regmap_read(priv->regmap, TIM_PSC, &psc);
251
252
*prescaler = psc + 1;
253
254
return 0;
255
}
256
257
static int stm32_count_prescaler_write(struct counter_device *counter,
258
struct counter_count *count, u64 prescaler)
259
{
260
struct stm32_timer_cnt *const priv = counter_priv(counter);
261
u32 psc;
262
263
if (!prescaler || prescaler > MAX_TIM_PSC + 1)
264
return -ERANGE;
265
266
psc = prescaler - 1;
267
268
return regmap_write(priv->regmap, TIM_PSC, psc);
269
}
270
271
static int stm32_count_cap_read(struct counter_device *counter,
272
struct counter_count *count,
273
size_t ch, u64 *cap)
274
{
275
struct stm32_timer_cnt *const priv = counter_priv(counter);
276
u32 ccrx;
277
278
if (ch >= priv->nchannels)
279
return -EOPNOTSUPP;
280
281
switch (ch) {
282
case 0:
283
regmap_read(priv->regmap, TIM_CCR1, &ccrx);
284
break;
285
case 1:
286
regmap_read(priv->regmap, TIM_CCR2, &ccrx);
287
break;
288
case 2:
289
regmap_read(priv->regmap, TIM_CCR3, &ccrx);
290
break;
291
case 3:
292
regmap_read(priv->regmap, TIM_CCR4, &ccrx);
293
break;
294
default:
295
return -EINVAL;
296
}
297
298
dev_dbg(counter->parent, "CCR%zu: 0x%08x\n", ch + 1, ccrx);
299
300
*cap = ccrx;
301
302
return 0;
303
}
304
305
static int stm32_count_nb_ovf_read(struct counter_device *counter,
306
struct counter_count *count, u64 *val)
307
{
308
struct stm32_timer_cnt *const priv = counter_priv(counter);
309
unsigned long irqflags;
310
311
spin_lock_irqsave(&priv->lock, irqflags);
312
*val = priv->nb_ovf;
313
spin_unlock_irqrestore(&priv->lock, irqflags);
314
315
return 0;
316
}
317
318
static int stm32_count_nb_ovf_write(struct counter_device *counter,
319
struct counter_count *count, u64 val)
320
{
321
struct stm32_timer_cnt *const priv = counter_priv(counter);
322
unsigned long irqflags;
323
324
spin_lock_irqsave(&priv->lock, irqflags);
325
priv->nb_ovf = val;
326
spin_unlock_irqrestore(&priv->lock, irqflags);
327
328
return 0;
329
}
330
331
static DEFINE_COUNTER_ARRAY_CAPTURE(stm32_count_cap_array, 4);
332
333
static struct counter_comp stm32_count_ext[] = {
334
COUNTER_COMP_DIRECTION(stm32_count_direction_read),
335
COUNTER_COMP_ENABLE(stm32_count_enable_read, stm32_count_enable_write),
336
COUNTER_COMP_CEILING(stm32_count_ceiling_read,
337
stm32_count_ceiling_write),
338
COUNTER_COMP_COUNT_U64("prescaler", stm32_count_prescaler_read,
339
stm32_count_prescaler_write),
340
COUNTER_COMP_ARRAY_CAPTURE(stm32_count_cap_read, NULL, stm32_count_cap_array),
341
COUNTER_COMP_COUNT_U64("num_overflows", stm32_count_nb_ovf_read, stm32_count_nb_ovf_write),
342
};
343
344
static const enum counter_synapse_action stm32_clock_synapse_actions[] = {
345
COUNTER_SYNAPSE_ACTION_RISING_EDGE,
346
};
347
348
static const enum counter_synapse_action stm32_synapse_actions[] = {
349
COUNTER_SYNAPSE_ACTION_NONE,
350
COUNTER_SYNAPSE_ACTION_BOTH_EDGES
351
};
352
353
static int stm32_action_read(struct counter_device *counter,
354
struct counter_count *count,
355
struct counter_synapse *synapse,
356
enum counter_synapse_action *action)
357
{
358
enum counter_function function;
359
int err;
360
361
err = stm32_count_function_read(counter, count, &function);
362
if (err)
363
return err;
364
365
switch (function) {
366
case COUNTER_FUNCTION_INCREASE:
367
/* counts on internal clock when CEN=1 */
368
if (synapse->signal->id == STM32_CLOCK_SIG)
369
*action = COUNTER_SYNAPSE_ACTION_RISING_EDGE;
370
else
371
*action = COUNTER_SYNAPSE_ACTION_NONE;
372
return 0;
373
case COUNTER_FUNCTION_QUADRATURE_X2_A:
374
/* counts up/down on TI1FP1 edge depending on TI2FP2 level */
375
if (synapse->signal->id == STM32_CH1_SIG)
376
*action = COUNTER_SYNAPSE_ACTION_BOTH_EDGES;
377
else
378
*action = COUNTER_SYNAPSE_ACTION_NONE;
379
return 0;
380
case COUNTER_FUNCTION_QUADRATURE_X2_B:
381
/* counts up/down on TI2FP2 edge depending on TI1FP1 level */
382
if (synapse->signal->id == STM32_CH2_SIG)
383
*action = COUNTER_SYNAPSE_ACTION_BOTH_EDGES;
384
else
385
*action = COUNTER_SYNAPSE_ACTION_NONE;
386
return 0;
387
case COUNTER_FUNCTION_QUADRATURE_X4:
388
/* counts up/down on both TI1FP1 and TI2FP2 edges */
389
if (synapse->signal->id == STM32_CH1_SIG || synapse->signal->id == STM32_CH2_SIG)
390
*action = COUNTER_SYNAPSE_ACTION_BOTH_EDGES;
391
else
392
*action = COUNTER_SYNAPSE_ACTION_NONE;
393
return 0;
394
default:
395
return -EINVAL;
396
}
397
}
398
399
struct stm32_count_cc_regs {
400
u32 ccmr_reg;
401
u32 ccmr_mask;
402
u32 ccmr_bits;
403
u32 ccer_bits;
404
};
405
406
static const struct stm32_count_cc_regs stm32_cc[] = {
407
{ TIM_CCMR1, TIM_CCMR_CC1S, TIM_CCMR_CC1S_TI1,
408
TIM_CCER_CC1E | TIM_CCER_CC1P | TIM_CCER_CC1NP },
409
{ TIM_CCMR1, TIM_CCMR_CC2S, TIM_CCMR_CC2S_TI2,
410
TIM_CCER_CC2E | TIM_CCER_CC2P | TIM_CCER_CC2NP },
411
{ TIM_CCMR2, TIM_CCMR_CC3S, TIM_CCMR_CC3S_TI3,
412
TIM_CCER_CC3E | TIM_CCER_CC3P | TIM_CCER_CC3NP },
413
{ TIM_CCMR2, TIM_CCMR_CC4S, TIM_CCMR_CC4S_TI4,
414
TIM_CCER_CC4E | TIM_CCER_CC4P | TIM_CCER_CC4NP },
415
};
416
417
static int stm32_count_capture_configure(struct counter_device *counter, unsigned int ch,
418
bool enable)
419
{
420
struct stm32_timer_cnt *const priv = counter_priv(counter);
421
const struct stm32_count_cc_regs *cc;
422
u32 ccmr, ccer;
423
424
if (ch >= ARRAY_SIZE(stm32_cc) || ch >= priv->nchannels) {
425
dev_err(counter->parent, "invalid ch: %d\n", ch);
426
return -EINVAL;
427
}
428
429
cc = &stm32_cc[ch];
430
431
/*
432
* configure channel in input capture mode, map channel 1 on TI1, channel2 on TI2...
433
* Select both edges / non-inverted to trigger a capture.
434
*/
435
if (enable) {
436
/* first clear possibly latched capture flag upon enabling */
437
if (!regmap_test_bits(priv->regmap, TIM_CCER, cc->ccer_bits))
438
regmap_write(priv->regmap, TIM_SR, ~TIM_SR_CC_IF(ch));
439
regmap_update_bits(priv->regmap, cc->ccmr_reg, cc->ccmr_mask,
440
cc->ccmr_bits);
441
regmap_set_bits(priv->regmap, TIM_CCER, cc->ccer_bits);
442
} else {
443
regmap_clear_bits(priv->regmap, TIM_CCER, cc->ccer_bits);
444
regmap_clear_bits(priv->regmap, cc->ccmr_reg, cc->ccmr_mask);
445
}
446
447
regmap_read(priv->regmap, cc->ccmr_reg, &ccmr);
448
regmap_read(priv->regmap, TIM_CCER, &ccer);
449
dev_dbg(counter->parent, "%s(%s) ch%d 0x%08x 0x%08x\n", __func__, enable ? "ena" : "dis",
450
ch, ccmr, ccer);
451
452
return 0;
453
}
454
455
static int stm32_count_events_configure(struct counter_device *counter)
456
{
457
struct stm32_timer_cnt *const priv = counter_priv(counter);
458
struct counter_event_node *event_node;
459
u32 dier = 0;
460
int i, ret;
461
462
list_for_each_entry(event_node, &counter->events_list, l) {
463
switch (event_node->event) {
464
case COUNTER_EVENT_OVERFLOW_UNDERFLOW:
465
/* first clear possibly latched UIF before enabling */
466
if (!regmap_test_bits(priv->regmap, TIM_DIER, TIM_DIER_UIE))
467
regmap_write(priv->regmap, TIM_SR, (u32)~TIM_SR_UIF);
468
dier |= TIM_DIER_UIE;
469
break;
470
case COUNTER_EVENT_CAPTURE:
471
ret = stm32_count_capture_configure(counter, event_node->channel, true);
472
if (ret)
473
return ret;
474
dier |= TIM_DIER_CCxIE(event_node->channel + 1);
475
break;
476
default:
477
/* should never reach this path */
478
return -EINVAL;
479
}
480
}
481
482
/* Enable / disable all events at once, from events_list, so write all DIER bits */
483
regmap_write(priv->regmap, TIM_DIER, dier);
484
485
/* check for disabled capture events */
486
for (i = 0 ; i < priv->nchannels; i++) {
487
if (!(dier & TIM_DIER_CCxIE(i + 1))) {
488
ret = stm32_count_capture_configure(counter, i, false);
489
if (ret)
490
return ret;
491
}
492
}
493
494
return 0;
495
}
496
497
static int stm32_count_watch_validate(struct counter_device *counter,
498
const struct counter_watch *watch)
499
{
500
struct stm32_timer_cnt *const priv = counter_priv(counter);
501
502
/* Interrupts are optional */
503
if (!priv->nr_irqs)
504
return -EOPNOTSUPP;
505
506
switch (watch->event) {
507
case COUNTER_EVENT_CAPTURE:
508
if (watch->channel >= priv->nchannels) {
509
dev_err(counter->parent, "Invalid channel %d\n", watch->channel);
510
return -EINVAL;
511
}
512
return 0;
513
case COUNTER_EVENT_OVERFLOW_UNDERFLOW:
514
return 0;
515
default:
516
return -EINVAL;
517
}
518
}
519
520
static const struct counter_ops stm32_timer_cnt_ops = {
521
.count_read = stm32_count_read,
522
.count_write = stm32_count_write,
523
.function_read = stm32_count_function_read,
524
.function_write = stm32_count_function_write,
525
.action_read = stm32_action_read,
526
.events_configure = stm32_count_events_configure,
527
.watch_validate = stm32_count_watch_validate,
528
};
529
530
static int stm32_count_clk_get_freq(struct counter_device *counter,
531
struct counter_signal *signal, u64 *freq)
532
{
533
struct stm32_timer_cnt *const priv = counter_priv(counter);
534
535
*freq = clk_get_rate(priv->clk);
536
537
return 0;
538
}
539
540
static struct counter_comp stm32_count_clock_ext[] = {
541
COUNTER_COMP_FREQUENCY(stm32_count_clk_get_freq),
542
};
543
544
static struct counter_signal stm32_signals[] = {
545
/*
546
* Need to declare all the signals as a static array, and keep the signals order here,
547
* even if they're unused or unexisting on some timer instances. It's an abstraction,
548
* e.g. high level view of the counter features.
549
*
550
* Userspace programs may rely on signal0 to be "Channel 1", signal1 to be "Channel 2",
551
* and so on. When a signal is unexisting, the COUNTER_SYNAPSE_ACTION_NONE can be used,
552
* to indicate that a signal doesn't affect the counter.
553
*/
554
{
555
.id = STM32_CH1_SIG,
556
.name = "Channel 1"
557
},
558
{
559
.id = STM32_CH2_SIG,
560
.name = "Channel 2"
561
},
562
{
563
.id = STM32_CLOCK_SIG,
564
.name = "Clock",
565
.ext = stm32_count_clock_ext,
566
.num_ext = ARRAY_SIZE(stm32_count_clock_ext),
567
},
568
{
569
.id = STM32_CH3_SIG,
570
.name = "Channel 3"
571
},
572
{
573
.id = STM32_CH4_SIG,
574
.name = "Channel 4"
575
},
576
};
577
578
static struct counter_synapse stm32_count_synapses[] = {
579
{
580
.actions_list = stm32_synapse_actions,
581
.num_actions = ARRAY_SIZE(stm32_synapse_actions),
582
.signal = &stm32_signals[STM32_CH1_SIG]
583
},
584
{
585
.actions_list = stm32_synapse_actions,
586
.num_actions = ARRAY_SIZE(stm32_synapse_actions),
587
.signal = &stm32_signals[STM32_CH2_SIG]
588
},
589
{
590
.actions_list = stm32_clock_synapse_actions,
591
.num_actions = ARRAY_SIZE(stm32_clock_synapse_actions),
592
.signal = &stm32_signals[STM32_CLOCK_SIG]
593
},
594
{
595
.actions_list = stm32_synapse_actions,
596
.num_actions = ARRAY_SIZE(stm32_synapse_actions),
597
.signal = &stm32_signals[STM32_CH3_SIG]
598
},
599
{
600
.actions_list = stm32_synapse_actions,
601
.num_actions = ARRAY_SIZE(stm32_synapse_actions),
602
.signal = &stm32_signals[STM32_CH4_SIG]
603
},
604
};
605
606
static struct counter_count stm32_counts = {
607
.id = 0,
608
.name = "STM32 Timer Counter",
609
.functions_list = stm32_count_functions,
610
.num_functions = ARRAY_SIZE(stm32_count_functions),
611
.synapses = stm32_count_synapses,
612
.num_synapses = ARRAY_SIZE(stm32_count_synapses),
613
.ext = stm32_count_ext,
614
.num_ext = ARRAY_SIZE(stm32_count_ext)
615
};
616
617
static irqreturn_t stm32_timer_cnt_isr(int irq, void *ptr)
618
{
619
struct counter_device *counter = ptr;
620
struct stm32_timer_cnt *const priv = counter_priv(counter);
621
u32 clr = GENMASK(31, 0); /* SR flags can be cleared by writing 0 (wr 1 has no effect) */
622
u32 sr, dier;
623
int i;
624
625
regmap_read(priv->regmap, TIM_SR, &sr);
626
regmap_read(priv->regmap, TIM_DIER, &dier);
627
/*
628
* Some status bits in SR don't match with the enable bits in DIER. Only take care of
629
* the possibly enabled bits in DIER (that matches in between SR and DIER).
630
*/
631
dier &= (TIM_DIER_UIE | TIM_DIER_CC1IE | TIM_DIER_CC2IE | TIM_DIER_CC3IE | TIM_DIER_CC4IE);
632
sr &= dier;
633
634
if (sr & TIM_SR_UIF) {
635
spin_lock(&priv->lock);
636
priv->nb_ovf++;
637
spin_unlock(&priv->lock);
638
counter_push_event(counter, COUNTER_EVENT_OVERFLOW_UNDERFLOW, 0);
639
dev_dbg(counter->parent, "COUNTER_EVENT_OVERFLOW_UNDERFLOW\n");
640
/* SR flags can be cleared by writing 0, only clear relevant flag */
641
clr &= ~TIM_SR_UIF;
642
}
643
644
/* Check capture events */
645
for (i = 0 ; i < priv->nchannels; i++) {
646
if (sr & TIM_SR_CC_IF(i)) {
647
counter_push_event(counter, COUNTER_EVENT_CAPTURE, i);
648
clr &= ~TIM_SR_CC_IF(i);
649
dev_dbg(counter->parent, "COUNTER_EVENT_CAPTURE, %d\n", i);
650
}
651
}
652
653
regmap_write(priv->regmap, TIM_SR, clr);
654
655
return IRQ_HANDLED;
656
};
657
658
static void stm32_timer_cnt_detect_channels(struct device *dev,
659
struct stm32_timer_cnt *priv)
660
{
661
u32 ccer, ccer_backup;
662
663
regmap_read(priv->regmap, TIM_CCER, &ccer_backup);
664
regmap_set_bits(priv->regmap, TIM_CCER, TIM_CCER_CCXE);
665
regmap_read(priv->regmap, TIM_CCER, &ccer);
666
regmap_write(priv->regmap, TIM_CCER, ccer_backup);
667
priv->nchannels = hweight32(ccer & TIM_CCER_CCXE);
668
669
dev_dbg(dev, "has %d cc channels\n", priv->nchannels);
670
}
671
672
/* encoder supported on TIM1 TIM2 TIM3 TIM4 TIM5 TIM8 TIM20 */
673
#define STM32_TIM_ENCODER_SUPPORTED (BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(7) | \
674
BIT(19))
675
676
static const char * const stm32_timer_trigger_compat[] = {
677
"st,stm32-timer-trigger",
678
"st,stm32h7-timer-trigger",
679
"st,stm32mp25-timer-trigger",
680
};
681
682
static int stm32_timer_cnt_probe_encoder(struct device *dev,
683
struct stm32_timer_cnt *priv)
684
{
685
struct device *parent = dev->parent;
686
struct device_node *tnode = NULL, *pnode = parent->of_node;
687
int i, ret;
688
u32 idx;
689
690
/*
691
* Need to retrieve the trigger node index from DT, to be able
692
* to determine if the counter supports encoder mode. It also
693
* enforce backward compatibility, and allow to support other
694
* counter modes in this driver (when the timer doesn't support
695
* encoder).
696
*/
697
for (i = 0; i < ARRAY_SIZE(stm32_timer_trigger_compat) && !tnode; i++)
698
tnode = of_get_compatible_child(pnode, stm32_timer_trigger_compat[i]);
699
if (!tnode) {
700
dev_err(dev, "Can't find trigger node\n");
701
return -ENODATA;
702
}
703
704
ret = of_property_read_u32(tnode, "reg", &idx);
705
of_node_put(tnode);
706
if (ret) {
707
dev_err(dev, "Can't get index (%d)\n", ret);
708
return ret;
709
}
710
711
priv->has_encoder = !!(STM32_TIM_ENCODER_SUPPORTED & BIT(idx));
712
713
dev_dbg(dev, "encoder support: %s\n", priv->has_encoder ? "yes" : "no");
714
715
return 0;
716
}
717
718
static int stm32_timer_cnt_probe(struct platform_device *pdev)
719
{
720
struct stm32_timers *ddata = dev_get_drvdata(pdev->dev.parent);
721
struct device *dev = &pdev->dev;
722
struct stm32_timer_cnt *priv;
723
struct counter_device *counter;
724
int i, ret;
725
726
if (IS_ERR_OR_NULL(ddata))
727
return -EINVAL;
728
729
counter = devm_counter_alloc(dev, sizeof(*priv));
730
if (!counter)
731
return -ENOMEM;
732
733
priv = counter_priv(counter);
734
735
priv->regmap = ddata->regmap;
736
priv->clk = ddata->clk;
737
priv->max_arr = ddata->max_arr;
738
priv->nr_irqs = ddata->nr_irqs;
739
740
ret = stm32_timer_cnt_probe_encoder(dev, priv);
741
if (ret)
742
return ret;
743
744
stm32_timer_cnt_detect_channels(dev, priv);
745
746
counter->name = dev_name(dev);
747
counter->parent = dev;
748
counter->ops = &stm32_timer_cnt_ops;
749
counter->counts = &stm32_counts;
750
counter->num_counts = 1;
751
counter->signals = stm32_signals;
752
counter->num_signals = ARRAY_SIZE(stm32_signals);
753
754
spin_lock_init(&priv->lock);
755
756
platform_set_drvdata(pdev, priv);
757
758
/* STM32 Timers can have either 1 global, or 4 dedicated interrupts (optional) */
759
if (priv->nr_irqs == 1) {
760
/* All events reported through the global interrupt */
761
ret = devm_request_irq(&pdev->dev, ddata->irq[0], stm32_timer_cnt_isr,
762
0, dev_name(dev), counter);
763
if (ret) {
764
dev_err(dev, "Failed to request irq %d (err %d)\n",
765
ddata->irq[0], ret);
766
return ret;
767
}
768
} else {
769
for (i = 0; i < priv->nr_irqs; i++) {
770
/*
771
* Only take care of update IRQ for overflow events, and cc for
772
* capture events.
773
*/
774
if (i != STM32_TIMERS_IRQ_UP && i != STM32_TIMERS_IRQ_CC)
775
continue;
776
777
ret = devm_request_irq(&pdev->dev, ddata->irq[i], stm32_timer_cnt_isr,
778
0, dev_name(dev), counter);
779
if (ret) {
780
dev_err(dev, "Failed to request irq %d (err %d)\n",
781
ddata->irq[i], ret);
782
return ret;
783
}
784
}
785
}
786
787
/* Reset input selector to its default input */
788
regmap_write(priv->regmap, TIM_TISEL, 0x0);
789
790
/* Register Counter device */
791
ret = devm_counter_add(dev, counter);
792
if (ret < 0)
793
dev_err_probe(dev, ret, "Failed to add counter\n");
794
795
return ret;
796
}
797
798
static int __maybe_unused stm32_timer_cnt_suspend(struct device *dev)
799
{
800
struct stm32_timer_cnt *priv = dev_get_drvdata(dev);
801
802
/* Only take care of enabled counter: don't disturb other MFD child */
803
if (priv->enabled) {
804
/* Backup registers that may get lost in low power mode */
805
regmap_read(priv->regmap, TIM_SMCR, &priv->bak.smcr);
806
regmap_read(priv->regmap, TIM_ARR, &priv->bak.arr);
807
regmap_read(priv->regmap, TIM_CNT, &priv->bak.cnt);
808
regmap_read(priv->regmap, TIM_CR1, &priv->bak.cr1);
809
810
/* Disable the counter */
811
regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0);
812
clk_disable(priv->clk);
813
}
814
815
return pinctrl_pm_select_sleep_state(dev);
816
}
817
818
static int __maybe_unused stm32_timer_cnt_resume(struct device *dev)
819
{
820
struct stm32_timer_cnt *priv = dev_get_drvdata(dev);
821
int ret;
822
823
ret = pinctrl_pm_select_default_state(dev);
824
if (ret)
825
return ret;
826
827
if (priv->enabled) {
828
ret = clk_enable(priv->clk);
829
if (ret) {
830
dev_err(dev, "Cannot enable clock %d\n", ret);
831
return ret;
832
}
833
834
/* Restore registers that may have been lost */
835
regmap_write(priv->regmap, TIM_SMCR, priv->bak.smcr);
836
regmap_write(priv->regmap, TIM_ARR, priv->bak.arr);
837
regmap_write(priv->regmap, TIM_CNT, priv->bak.cnt);
838
839
/* Also re-enables the counter */
840
regmap_write(priv->regmap, TIM_CR1, priv->bak.cr1);
841
}
842
843
return 0;
844
}
845
846
static SIMPLE_DEV_PM_OPS(stm32_timer_cnt_pm_ops, stm32_timer_cnt_suspend,
847
stm32_timer_cnt_resume);
848
849
static const struct of_device_id stm32_timer_cnt_of_match[] = {
850
{ .compatible = "st,stm32-timer-counter", },
851
{ .compatible = "st,stm32mp25-timer-counter", },
852
{},
853
};
854
MODULE_DEVICE_TABLE(of, stm32_timer_cnt_of_match);
855
856
static struct platform_driver stm32_timer_cnt_driver = {
857
.probe = stm32_timer_cnt_probe,
858
.driver = {
859
.name = "stm32-timer-counter",
860
.of_match_table = stm32_timer_cnt_of_match,
861
.pm = &stm32_timer_cnt_pm_ops,
862
},
863
};
864
module_platform_driver(stm32_timer_cnt_driver);
865
866
MODULE_AUTHOR("Benjamin Gaignard <[email protected]>");
867
MODULE_ALIAS("platform:stm32-timer-counter");
868
MODULE_DESCRIPTION("STMicroelectronics STM32 TIMER counter driver");
869
MODULE_LICENSE("GPL v2");
870
MODULE_IMPORT_NS("COUNTER");
871
872