Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/counter/rz-mtu3-cnt.c
26278 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* Renesas RZ/G2L MTU3a Counter driver
4
*
5
* Copyright (C) 2022 Renesas Electronics Corporation
6
*/
7
8
#include <linux/clk.h>
9
#include <linux/counter.h>
10
#include <linux/mfd/rz-mtu3.h>
11
#include <linux/module.h>
12
#include <linux/platform_device.h>
13
#include <linux/pm_runtime.h>
14
#include <linux/types.h>
15
16
/*
17
* Register descriptions
18
* TSR: Timer Status Register
19
* TMDR1: Timer Mode Register 1
20
* TMDR3: Timer Mode Register 3
21
* TIOR: Timer I/O Control Register
22
* TCR: Timer Control Register
23
* TCNT: Timer Counter
24
* TGRA: Timer general register A
25
* TCNTLW: Timer Longword Counter
26
* TGRALW: Timer longword general register A
27
*/
28
29
#define RZ_MTU3_TSR_TCFD BIT(7) /* Count Direction Flag */
30
31
#define RZ_MTU3_TMDR1_PH_CNT_MODE_1 (4) /* Phase counting mode 1 */
32
#define RZ_MTU3_TMDR1_PH_CNT_MODE_2 (5) /* Phase counting mode 2 */
33
#define RZ_MTU3_TMDR1_PH_CNT_MODE_3 (6) /* Phase counting mode 3 */
34
#define RZ_MTU3_TMDR1_PH_CNT_MODE_4 (7) /* Phase counting mode 4 */
35
#define RZ_MTU3_TMDR1_PH_CNT_MODE_5 (9) /* Phase counting mode 5 */
36
#define RZ_MTU3_TMDR1_PH_CNT_MODE_MASK (0xf)
37
38
/*
39
* LWA: MTU1/MTU2 Combination Longword Access Control
40
* 0: 16-bit, 1: 32-bit
41
*/
42
#define RZ_MTU3_TMDR3_LWA (0)
43
44
/*
45
* PHCKSEL: External Input Phase Clock Select
46
* 0: MTCLKA and MTCLKB, 1: MTCLKC and MTCLKD
47
*/
48
#define RZ_MTU3_TMDR3_PHCKSEL (1)
49
50
#define RZ_MTU3_16_BIT_MTU1_CH (0)
51
#define RZ_MTU3_16_BIT_MTU2_CH (1)
52
#define RZ_MTU3_32_BIT_CH (2)
53
54
#define RZ_MTU3_TIOR_NO_OUTPUT (0) /* Output prohibited */
55
#define RZ_MTU3_TIOR_IC_BOTH (10) /* Input capture at both edges */
56
57
#define SIGNAL_A_ID (0)
58
#define SIGNAL_B_ID (1)
59
#define SIGNAL_C_ID (2)
60
#define SIGNAL_D_ID (3)
61
62
#define RZ_MTU3_MAX_HW_CNTR_CHANNELS (2)
63
#define RZ_MTU3_MAX_LOGICAL_CNTR_CHANNELS (3)
64
65
/**
66
* struct rz_mtu3_cnt - MTU3 counter private data
67
*
68
* @clk: MTU3 module clock
69
* @lock: Lock to prevent concurrent access for ceiling and count
70
* @ch: HW channels for the counters
71
* @count_is_enabled: Enabled state of Counter value channel
72
* @mtu_16bit_max: Cache for 16-bit counters
73
* @mtu_32bit_max: Cache for 32-bit counters
74
*/
75
struct rz_mtu3_cnt {
76
struct clk *clk;
77
struct mutex lock;
78
struct rz_mtu3_channel *ch;
79
bool count_is_enabled[RZ_MTU3_MAX_LOGICAL_CNTR_CHANNELS];
80
union {
81
u16 mtu_16bit_max[RZ_MTU3_MAX_HW_CNTR_CHANNELS];
82
u32 mtu_32bit_max;
83
};
84
};
85
86
static const enum counter_function rz_mtu3_count_functions[] = {
87
COUNTER_FUNCTION_QUADRATURE_X4,
88
COUNTER_FUNCTION_PULSE_DIRECTION,
89
COUNTER_FUNCTION_QUADRATURE_X2_B,
90
};
91
92
static inline size_t rz_mtu3_get_hw_ch(const size_t id)
93
{
94
return (id == RZ_MTU3_32_BIT_CH) ? 0 : id;
95
}
96
97
static inline struct rz_mtu3_channel *rz_mtu3_get_ch(struct counter_device *counter, int id)
98
{
99
struct rz_mtu3_cnt *const priv = counter_priv(counter);
100
const size_t ch_id = rz_mtu3_get_hw_ch(id);
101
102
return &priv->ch[ch_id];
103
}
104
105
static bool rz_mtu3_is_counter_invalid(struct counter_device *counter, int id)
106
{
107
struct rz_mtu3_cnt *const priv = counter_priv(counter);
108
unsigned long tmdr;
109
110
pm_runtime_get_sync(priv->ch->dev);
111
tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3);
112
pm_runtime_put(priv->ch->dev);
113
114
if (id == RZ_MTU3_32_BIT_CH && test_bit(RZ_MTU3_TMDR3_LWA, &tmdr))
115
return false;
116
117
if (id != RZ_MTU3_32_BIT_CH && !test_bit(RZ_MTU3_TMDR3_LWA, &tmdr))
118
return false;
119
120
return true;
121
}
122
123
static int rz_mtu3_lock_if_counter_is_valid(struct counter_device *counter,
124
struct rz_mtu3_channel *const ch,
125
struct rz_mtu3_cnt *const priv,
126
int id)
127
{
128
mutex_lock(&priv->lock);
129
130
if (ch->is_busy && !priv->count_is_enabled[id]) {
131
mutex_unlock(&priv->lock);
132
return -EINVAL;
133
}
134
135
if (rz_mtu3_is_counter_invalid(counter, id)) {
136
mutex_unlock(&priv->lock);
137
return -EBUSY;
138
}
139
140
return 0;
141
}
142
143
static int rz_mtu3_lock_if_count_is_enabled(struct rz_mtu3_channel *const ch,
144
struct rz_mtu3_cnt *const priv,
145
int id)
146
{
147
mutex_lock(&priv->lock);
148
149
if (ch->is_busy && !priv->count_is_enabled[id]) {
150
mutex_unlock(&priv->lock);
151
return -EINVAL;
152
}
153
154
return 0;
155
}
156
157
static int rz_mtu3_count_read(struct counter_device *counter,
158
struct counter_count *count, u64 *val)
159
{
160
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
161
struct rz_mtu3_cnt *const priv = counter_priv(counter);
162
int ret;
163
164
ret = rz_mtu3_lock_if_counter_is_valid(counter, ch, priv, count->id);
165
if (ret)
166
return ret;
167
168
pm_runtime_get_sync(ch->dev);
169
if (count->id == RZ_MTU3_32_BIT_CH)
170
*val = rz_mtu3_32bit_ch_read(ch, RZ_MTU3_TCNTLW);
171
else
172
*val = rz_mtu3_16bit_ch_read(ch, RZ_MTU3_TCNT);
173
pm_runtime_put(ch->dev);
174
mutex_unlock(&priv->lock);
175
176
return 0;
177
}
178
179
static int rz_mtu3_count_write(struct counter_device *counter,
180
struct counter_count *count, const u64 val)
181
{
182
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
183
struct rz_mtu3_cnt *const priv = counter_priv(counter);
184
int ret;
185
186
ret = rz_mtu3_lock_if_counter_is_valid(counter, ch, priv, count->id);
187
if (ret)
188
return ret;
189
190
pm_runtime_get_sync(ch->dev);
191
if (count->id == RZ_MTU3_32_BIT_CH)
192
rz_mtu3_32bit_ch_write(ch, RZ_MTU3_TCNTLW, val);
193
else
194
rz_mtu3_16bit_ch_write(ch, RZ_MTU3_TCNT, val);
195
pm_runtime_put(ch->dev);
196
mutex_unlock(&priv->lock);
197
198
return 0;
199
}
200
201
static int rz_mtu3_count_function_read_helper(struct rz_mtu3_channel *const ch,
202
struct rz_mtu3_cnt *const priv,
203
enum counter_function *function)
204
{
205
u8 timer_mode;
206
207
pm_runtime_get_sync(ch->dev);
208
timer_mode = rz_mtu3_8bit_ch_read(ch, RZ_MTU3_TMDR1);
209
pm_runtime_put(ch->dev);
210
211
switch (timer_mode & RZ_MTU3_TMDR1_PH_CNT_MODE_MASK) {
212
case RZ_MTU3_TMDR1_PH_CNT_MODE_1:
213
*function = COUNTER_FUNCTION_QUADRATURE_X4;
214
return 0;
215
case RZ_MTU3_TMDR1_PH_CNT_MODE_2:
216
*function = COUNTER_FUNCTION_PULSE_DIRECTION;
217
return 0;
218
case RZ_MTU3_TMDR1_PH_CNT_MODE_4:
219
*function = COUNTER_FUNCTION_QUADRATURE_X2_B;
220
return 0;
221
default:
222
/*
223
* TODO:
224
* - need to add RZ_MTU3_TMDR1_PH_CNT_MODE_3
225
* - need to add RZ_MTU3_TMDR1_PH_CNT_MODE_5
226
*/
227
return -EINVAL;
228
}
229
}
230
231
static int rz_mtu3_count_function_read(struct counter_device *counter,
232
struct counter_count *count,
233
enum counter_function *function)
234
{
235
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
236
struct rz_mtu3_cnt *const priv = counter_priv(counter);
237
int ret;
238
239
ret = rz_mtu3_lock_if_count_is_enabled(ch, priv, count->id);
240
if (ret)
241
return ret;
242
243
ret = rz_mtu3_count_function_read_helper(ch, priv, function);
244
mutex_unlock(&priv->lock);
245
246
return ret;
247
}
248
249
static int rz_mtu3_count_function_write(struct counter_device *counter,
250
struct counter_count *count,
251
enum counter_function function)
252
{
253
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
254
struct rz_mtu3_cnt *const priv = counter_priv(counter);
255
u8 timer_mode;
256
int ret;
257
258
ret = rz_mtu3_lock_if_count_is_enabled(ch, priv, count->id);
259
if (ret)
260
return ret;
261
262
switch (function) {
263
case COUNTER_FUNCTION_QUADRATURE_X4:
264
timer_mode = RZ_MTU3_TMDR1_PH_CNT_MODE_1;
265
break;
266
case COUNTER_FUNCTION_PULSE_DIRECTION:
267
timer_mode = RZ_MTU3_TMDR1_PH_CNT_MODE_2;
268
break;
269
case COUNTER_FUNCTION_QUADRATURE_X2_B:
270
timer_mode = RZ_MTU3_TMDR1_PH_CNT_MODE_4;
271
break;
272
default:
273
/*
274
* TODO:
275
* - need to add RZ_MTU3_TMDR1_PH_CNT_MODE_3
276
* - need to add RZ_MTU3_TMDR1_PH_CNT_MODE_5
277
*/
278
mutex_unlock(&priv->lock);
279
return -EINVAL;
280
}
281
282
pm_runtime_get_sync(ch->dev);
283
rz_mtu3_8bit_ch_write(ch, RZ_MTU3_TMDR1, timer_mode);
284
pm_runtime_put(ch->dev);
285
mutex_unlock(&priv->lock);
286
287
return 0;
288
}
289
290
static int rz_mtu3_count_direction_read(struct counter_device *counter,
291
struct counter_count *count,
292
enum counter_count_direction *direction)
293
{
294
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
295
struct rz_mtu3_cnt *const priv = counter_priv(counter);
296
int ret;
297
u8 tsr;
298
299
ret = rz_mtu3_lock_if_count_is_enabled(ch, priv, count->id);
300
if (ret)
301
return ret;
302
303
pm_runtime_get_sync(ch->dev);
304
tsr = rz_mtu3_8bit_ch_read(ch, RZ_MTU3_TSR);
305
pm_runtime_put(ch->dev);
306
307
*direction = (tsr & RZ_MTU3_TSR_TCFD) ?
308
COUNTER_COUNT_DIRECTION_FORWARD : COUNTER_COUNT_DIRECTION_BACKWARD;
309
mutex_unlock(&priv->lock);
310
311
return 0;
312
}
313
314
static int rz_mtu3_count_ceiling_read(struct counter_device *counter,
315
struct counter_count *count,
316
u64 *ceiling)
317
{
318
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
319
struct rz_mtu3_cnt *const priv = counter_priv(counter);
320
const size_t ch_id = rz_mtu3_get_hw_ch(count->id);
321
int ret;
322
323
ret = rz_mtu3_lock_if_counter_is_valid(counter, ch, priv, count->id);
324
if (ret)
325
return ret;
326
327
switch (count->id) {
328
case RZ_MTU3_16_BIT_MTU1_CH:
329
case RZ_MTU3_16_BIT_MTU2_CH:
330
*ceiling = priv->mtu_16bit_max[ch_id];
331
break;
332
case RZ_MTU3_32_BIT_CH:
333
*ceiling = priv->mtu_32bit_max;
334
break;
335
default:
336
/* should never reach this path */
337
mutex_unlock(&priv->lock);
338
return -EINVAL;
339
}
340
341
mutex_unlock(&priv->lock);
342
return 0;
343
}
344
345
static int rz_mtu3_count_ceiling_write(struct counter_device *counter,
346
struct counter_count *count,
347
u64 ceiling)
348
{
349
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
350
struct rz_mtu3_cnt *const priv = counter_priv(counter);
351
const size_t ch_id = rz_mtu3_get_hw_ch(count->id);
352
int ret;
353
354
ret = rz_mtu3_lock_if_counter_is_valid(counter, ch, priv, count->id);
355
if (ret)
356
return ret;
357
358
switch (count->id) {
359
case RZ_MTU3_16_BIT_MTU1_CH:
360
case RZ_MTU3_16_BIT_MTU2_CH:
361
if (ceiling > U16_MAX) {
362
mutex_unlock(&priv->lock);
363
return -ERANGE;
364
}
365
priv->mtu_16bit_max[ch_id] = ceiling;
366
break;
367
case RZ_MTU3_32_BIT_CH:
368
if (ceiling > U32_MAX) {
369
mutex_unlock(&priv->lock);
370
return -ERANGE;
371
}
372
priv->mtu_32bit_max = ceiling;
373
break;
374
default:
375
/* should never reach this path */
376
mutex_unlock(&priv->lock);
377
return -EINVAL;
378
}
379
380
pm_runtime_get_sync(ch->dev);
381
if (count->id == RZ_MTU3_32_BIT_CH)
382
rz_mtu3_32bit_ch_write(ch, RZ_MTU3_TGRALW, ceiling);
383
else
384
rz_mtu3_16bit_ch_write(ch, RZ_MTU3_TGRA, ceiling);
385
386
rz_mtu3_8bit_ch_write(ch, RZ_MTU3_TCR, RZ_MTU3_TCR_CCLR_TGRA);
387
pm_runtime_put(ch->dev);
388
mutex_unlock(&priv->lock);
389
390
return 0;
391
}
392
393
static void rz_mtu3_32bit_cnt_setting(struct counter_device *counter)
394
{
395
struct rz_mtu3_channel *const ch1 = rz_mtu3_get_ch(counter, 0);
396
struct rz_mtu3_channel *const ch2 = rz_mtu3_get_ch(counter, 1);
397
398
/* Phase counting mode 1 is used as default in initialization. */
399
rz_mtu3_8bit_ch_write(ch1, RZ_MTU3_TMDR1, RZ_MTU3_TMDR1_PH_CNT_MODE_1);
400
401
rz_mtu3_8bit_ch_write(ch1, RZ_MTU3_TCR, RZ_MTU3_TCR_CCLR_TGRA);
402
rz_mtu3_8bit_ch_write(ch1, RZ_MTU3_TIOR, RZ_MTU3_TIOR_IC_BOTH);
403
404
rz_mtu3_enable(ch1);
405
rz_mtu3_enable(ch2);
406
}
407
408
static void rz_mtu3_16bit_cnt_setting(struct counter_device *counter, int id)
409
{
410
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, id);
411
412
/* Phase counting mode 1 is used as default in initialization. */
413
rz_mtu3_8bit_ch_write(ch, RZ_MTU3_TMDR1, RZ_MTU3_TMDR1_PH_CNT_MODE_1);
414
415
rz_mtu3_8bit_ch_write(ch, RZ_MTU3_TCR, RZ_MTU3_TCR_CCLR_TGRA);
416
rz_mtu3_8bit_ch_write(ch, RZ_MTU3_TIOR, RZ_MTU3_TIOR_NO_OUTPUT);
417
rz_mtu3_enable(ch);
418
}
419
420
static int rz_mtu3_initialize_counter(struct counter_device *counter, int id)
421
{
422
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, id);
423
struct rz_mtu3_channel *const ch1 = rz_mtu3_get_ch(counter, 0);
424
struct rz_mtu3_channel *const ch2 = rz_mtu3_get_ch(counter, 1);
425
426
switch (id) {
427
case RZ_MTU3_16_BIT_MTU1_CH:
428
case RZ_MTU3_16_BIT_MTU2_CH:
429
if (!rz_mtu3_request_channel(ch))
430
return -EBUSY;
431
432
rz_mtu3_16bit_cnt_setting(counter, id);
433
return 0;
434
case RZ_MTU3_32_BIT_CH:
435
/*
436
* 32-bit phase counting need MTU1 and MTU2 to create 32-bit
437
* cascade counter.
438
*/
439
if (!rz_mtu3_request_channel(ch1))
440
return -EBUSY;
441
442
if (!rz_mtu3_request_channel(ch2)) {
443
rz_mtu3_release_channel(ch1);
444
return -EBUSY;
445
}
446
447
rz_mtu3_32bit_cnt_setting(counter);
448
return 0;
449
default:
450
/* should never reach this path */
451
return -EINVAL;
452
}
453
}
454
455
static void rz_mtu3_terminate_counter(struct counter_device *counter, int id)
456
{
457
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, id);
458
struct rz_mtu3_channel *const ch1 = rz_mtu3_get_ch(counter, 0);
459
struct rz_mtu3_channel *const ch2 = rz_mtu3_get_ch(counter, 1);
460
461
if (id == RZ_MTU3_32_BIT_CH) {
462
rz_mtu3_release_channel(ch2);
463
rz_mtu3_release_channel(ch1);
464
rz_mtu3_disable(ch2);
465
rz_mtu3_disable(ch1);
466
} else {
467
rz_mtu3_release_channel(ch);
468
rz_mtu3_disable(ch);
469
}
470
}
471
472
static int rz_mtu3_count_enable_read(struct counter_device *counter,
473
struct counter_count *count, u8 *enable)
474
{
475
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
476
struct rz_mtu3_channel *const ch1 = rz_mtu3_get_ch(counter, 0);
477
struct rz_mtu3_channel *const ch2 = rz_mtu3_get_ch(counter, 1);
478
struct rz_mtu3_cnt *const priv = counter_priv(counter);
479
int ret;
480
481
ret = rz_mtu3_lock_if_count_is_enabled(ch, priv, count->id);
482
if (ret)
483
return ret;
484
485
if (count->id == RZ_MTU3_32_BIT_CH)
486
*enable = rz_mtu3_is_enabled(ch1) && rz_mtu3_is_enabled(ch2);
487
else
488
*enable = rz_mtu3_is_enabled(ch);
489
490
mutex_unlock(&priv->lock);
491
492
return 0;
493
}
494
495
static int rz_mtu3_count_enable_write(struct counter_device *counter,
496
struct counter_count *count, u8 enable)
497
{
498
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
499
struct rz_mtu3_cnt *const priv = counter_priv(counter);
500
int ret = 0;
501
502
if (enable) {
503
mutex_lock(&priv->lock);
504
pm_runtime_get_sync(ch->dev);
505
ret = rz_mtu3_initialize_counter(counter, count->id);
506
if (ret == 0)
507
priv->count_is_enabled[count->id] = true;
508
mutex_unlock(&priv->lock);
509
} else {
510
mutex_lock(&priv->lock);
511
rz_mtu3_terminate_counter(counter, count->id);
512
priv->count_is_enabled[count->id] = false;
513
pm_runtime_put(ch->dev);
514
mutex_unlock(&priv->lock);
515
}
516
517
return ret;
518
}
519
520
static int rz_mtu3_lock_if_ch0_is_enabled(struct rz_mtu3_cnt *const priv)
521
{
522
mutex_lock(&priv->lock);
523
if (priv->ch->is_busy && !(priv->count_is_enabled[RZ_MTU3_16_BIT_MTU1_CH] ||
524
priv->count_is_enabled[RZ_MTU3_32_BIT_CH])) {
525
mutex_unlock(&priv->lock);
526
return -EINVAL;
527
}
528
529
return 0;
530
}
531
532
static int rz_mtu3_cascade_counts_enable_get(struct counter_device *counter,
533
u8 *cascade_enable)
534
{
535
struct rz_mtu3_cnt *const priv = counter_priv(counter);
536
unsigned long tmdr;
537
int ret;
538
539
ret = rz_mtu3_lock_if_ch0_is_enabled(priv);
540
if (ret)
541
return ret;
542
543
pm_runtime_get_sync(priv->ch->dev);
544
tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3);
545
pm_runtime_put(priv->ch->dev);
546
*cascade_enable = test_bit(RZ_MTU3_TMDR3_LWA, &tmdr);
547
mutex_unlock(&priv->lock);
548
549
return 0;
550
}
551
552
static int rz_mtu3_cascade_counts_enable_set(struct counter_device *counter,
553
u8 cascade_enable)
554
{
555
struct rz_mtu3_cnt *const priv = counter_priv(counter);
556
int ret;
557
558
ret = rz_mtu3_lock_if_ch0_is_enabled(priv);
559
if (ret)
560
return ret;
561
562
pm_runtime_get_sync(priv->ch->dev);
563
rz_mtu3_shared_reg_update_bit(priv->ch, RZ_MTU3_TMDR3,
564
RZ_MTU3_TMDR3_LWA, cascade_enable);
565
pm_runtime_put(priv->ch->dev);
566
mutex_unlock(&priv->lock);
567
568
return 0;
569
}
570
571
static int rz_mtu3_ext_input_phase_clock_select_get(struct counter_device *counter,
572
u32 *ext_input_phase_clock_select)
573
{
574
struct rz_mtu3_cnt *const priv = counter_priv(counter);
575
unsigned long tmdr;
576
int ret;
577
578
ret = rz_mtu3_lock_if_ch0_is_enabled(priv);
579
if (ret)
580
return ret;
581
582
pm_runtime_get_sync(priv->ch->dev);
583
tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3);
584
pm_runtime_put(priv->ch->dev);
585
*ext_input_phase_clock_select = test_bit(RZ_MTU3_TMDR3_PHCKSEL, &tmdr);
586
mutex_unlock(&priv->lock);
587
588
return 0;
589
}
590
591
static int rz_mtu3_ext_input_phase_clock_select_set(struct counter_device *counter,
592
u32 ext_input_phase_clock_select)
593
{
594
struct rz_mtu3_cnt *const priv = counter_priv(counter);
595
int ret;
596
597
ret = rz_mtu3_lock_if_ch0_is_enabled(priv);
598
if (ret)
599
return ret;
600
601
pm_runtime_get_sync(priv->ch->dev);
602
rz_mtu3_shared_reg_update_bit(priv->ch, RZ_MTU3_TMDR3,
603
RZ_MTU3_TMDR3_PHCKSEL,
604
ext_input_phase_clock_select);
605
pm_runtime_put(priv->ch->dev);
606
mutex_unlock(&priv->lock);
607
608
return 0;
609
}
610
611
static struct counter_comp rz_mtu3_count_ext[] = {
612
COUNTER_COMP_DIRECTION(rz_mtu3_count_direction_read),
613
COUNTER_COMP_ENABLE(rz_mtu3_count_enable_read,
614
rz_mtu3_count_enable_write),
615
COUNTER_COMP_CEILING(rz_mtu3_count_ceiling_read,
616
rz_mtu3_count_ceiling_write),
617
};
618
619
static const enum counter_synapse_action rz_mtu3_synapse_actions[] = {
620
COUNTER_SYNAPSE_ACTION_BOTH_EDGES,
621
COUNTER_SYNAPSE_ACTION_RISING_EDGE,
622
COUNTER_SYNAPSE_ACTION_NONE,
623
};
624
625
static int rz_mtu3_action_read(struct counter_device *counter,
626
struct counter_count *count,
627
struct counter_synapse *synapse,
628
enum counter_synapse_action *action)
629
{
630
const bool is_signal_ab = (synapse->signal->id == SIGNAL_A_ID) ||
631
(synapse->signal->id == SIGNAL_B_ID);
632
struct rz_mtu3_channel *const ch = rz_mtu3_get_ch(counter, count->id);
633
struct rz_mtu3_cnt *const priv = counter_priv(counter);
634
enum counter_function function;
635
bool mtclkc_mtclkd;
636
unsigned long tmdr;
637
int ret;
638
639
ret = rz_mtu3_lock_if_count_is_enabled(ch, priv, count->id);
640
if (ret)
641
return ret;
642
643
ret = rz_mtu3_count_function_read_helper(ch, priv, &function);
644
if (ret) {
645
mutex_unlock(&priv->lock);
646
return ret;
647
}
648
649
/* Default action mode */
650
*action = COUNTER_SYNAPSE_ACTION_NONE;
651
652
if (count->id != RZ_MTU3_16_BIT_MTU1_CH) {
653
tmdr = rz_mtu3_shared_reg_read(priv->ch, RZ_MTU3_TMDR3);
654
mtclkc_mtclkd = test_bit(RZ_MTU3_TMDR3_PHCKSEL, &tmdr);
655
if ((mtclkc_mtclkd && is_signal_ab) ||
656
(!mtclkc_mtclkd && !is_signal_ab)) {
657
mutex_unlock(&priv->lock);
658
return 0;
659
}
660
}
661
662
switch (function) {
663
case COUNTER_FUNCTION_PULSE_DIRECTION:
664
/*
665
* Rising edges on signal A (signal C) updates the respective
666
* count. The input level of signal B (signal D) determines
667
* direction.
668
*/
669
if (synapse->signal->id == SIGNAL_A_ID ||
670
synapse->signal->id == SIGNAL_C_ID)
671
*action = COUNTER_SYNAPSE_ACTION_RISING_EDGE;
672
break;
673
case COUNTER_FUNCTION_QUADRATURE_X2_B:
674
/*
675
* Any state transition on quadrature pair signal B (signal D)
676
* updates the respective count.
677
*/
678
if (synapse->signal->id == SIGNAL_B_ID ||
679
synapse->signal->id == SIGNAL_D_ID)
680
*action = COUNTER_SYNAPSE_ACTION_BOTH_EDGES;
681
break;
682
case COUNTER_FUNCTION_QUADRATURE_X4:
683
/* counts up/down on both edges of A (C) and B (D) signal */
684
*action = COUNTER_SYNAPSE_ACTION_BOTH_EDGES;
685
break;
686
default:
687
/* should never reach this path */
688
mutex_unlock(&priv->lock);
689
return -EINVAL;
690
}
691
692
mutex_unlock(&priv->lock);
693
694
return 0;
695
}
696
697
static const struct counter_ops rz_mtu3_cnt_ops = {
698
.count_read = rz_mtu3_count_read,
699
.count_write = rz_mtu3_count_write,
700
.function_read = rz_mtu3_count_function_read,
701
.function_write = rz_mtu3_count_function_write,
702
.action_read = rz_mtu3_action_read,
703
};
704
705
#define RZ_MTU3_PHASE_SIGNAL(_id, _name) { \
706
.id = (_id), \
707
.name = (_name), \
708
}
709
710
static struct counter_signal rz_mtu3_signals[] = {
711
RZ_MTU3_PHASE_SIGNAL(SIGNAL_A_ID, "MTU1 MTCLKA"),
712
RZ_MTU3_PHASE_SIGNAL(SIGNAL_B_ID, "MTU1 MTCLKB"),
713
RZ_MTU3_PHASE_SIGNAL(SIGNAL_C_ID, "MTU2 MTCLKC"),
714
RZ_MTU3_PHASE_SIGNAL(SIGNAL_D_ID, "MTU2 MTCLKD"),
715
};
716
717
static struct counter_synapse rz_mtu3_mtu1_count_synapses[] = {
718
{
719
.actions_list = rz_mtu3_synapse_actions,
720
.num_actions = ARRAY_SIZE(rz_mtu3_synapse_actions),
721
.signal = rz_mtu3_signals,
722
},
723
{
724
.actions_list = rz_mtu3_synapse_actions,
725
.num_actions = ARRAY_SIZE(rz_mtu3_synapse_actions),
726
.signal = rz_mtu3_signals + 1,
727
}
728
};
729
730
static struct counter_synapse rz_mtu3_mtu2_count_synapses[] = {
731
{
732
.actions_list = rz_mtu3_synapse_actions,
733
.num_actions = ARRAY_SIZE(rz_mtu3_synapse_actions),
734
.signal = rz_mtu3_signals,
735
},
736
{
737
.actions_list = rz_mtu3_synapse_actions,
738
.num_actions = ARRAY_SIZE(rz_mtu3_synapse_actions),
739
.signal = rz_mtu3_signals + 1,
740
},
741
{
742
.actions_list = rz_mtu3_synapse_actions,
743
.num_actions = ARRAY_SIZE(rz_mtu3_synapse_actions),
744
.signal = rz_mtu3_signals + 2,
745
},
746
{
747
.actions_list = rz_mtu3_synapse_actions,
748
.num_actions = ARRAY_SIZE(rz_mtu3_synapse_actions),
749
.signal = rz_mtu3_signals + 3,
750
}
751
};
752
753
static struct counter_count rz_mtu3_counts[] = {
754
{
755
.id = RZ_MTU3_16_BIT_MTU1_CH,
756
.name = "Channel 1 Count",
757
.functions_list = rz_mtu3_count_functions,
758
.num_functions = ARRAY_SIZE(rz_mtu3_count_functions),
759
.synapses = rz_mtu3_mtu1_count_synapses,
760
.num_synapses = ARRAY_SIZE(rz_mtu3_mtu1_count_synapses),
761
.ext = rz_mtu3_count_ext,
762
.num_ext = ARRAY_SIZE(rz_mtu3_count_ext),
763
},
764
{
765
.id = RZ_MTU3_16_BIT_MTU2_CH,
766
.name = "Channel 2 Count",
767
.functions_list = rz_mtu3_count_functions,
768
.num_functions = ARRAY_SIZE(rz_mtu3_count_functions),
769
.synapses = rz_mtu3_mtu2_count_synapses,
770
.num_synapses = ARRAY_SIZE(rz_mtu3_mtu2_count_synapses),
771
.ext = rz_mtu3_count_ext,
772
.num_ext = ARRAY_SIZE(rz_mtu3_count_ext),
773
},
774
{
775
.id = RZ_MTU3_32_BIT_CH,
776
.name = "Channel 1 and 2 (cascaded) Count",
777
.functions_list = rz_mtu3_count_functions,
778
.num_functions = ARRAY_SIZE(rz_mtu3_count_functions),
779
.synapses = rz_mtu3_mtu2_count_synapses,
780
.num_synapses = ARRAY_SIZE(rz_mtu3_mtu2_count_synapses),
781
.ext = rz_mtu3_count_ext,
782
.num_ext = ARRAY_SIZE(rz_mtu3_count_ext),
783
}
784
};
785
786
static const char *const rz_mtu3_ext_input_phase_clock_select[] = {
787
"MTCLKA-MTCLKB",
788
"MTCLKC-MTCLKD",
789
};
790
791
static DEFINE_COUNTER_ENUM(rz_mtu3_ext_input_phase_clock_select_enum,
792
rz_mtu3_ext_input_phase_clock_select);
793
794
static struct counter_comp rz_mtu3_device_ext[] = {
795
COUNTER_COMP_DEVICE_BOOL("cascade_counts_enable",
796
rz_mtu3_cascade_counts_enable_get,
797
rz_mtu3_cascade_counts_enable_set),
798
COUNTER_COMP_DEVICE_ENUM("external_input_phase_clock_select",
799
rz_mtu3_ext_input_phase_clock_select_get,
800
rz_mtu3_ext_input_phase_clock_select_set,
801
rz_mtu3_ext_input_phase_clock_select_enum),
802
};
803
804
static int rz_mtu3_cnt_pm_runtime_suspend(struct device *dev)
805
{
806
struct clk *const clk = dev_get_drvdata(dev);
807
808
clk_disable_unprepare(clk);
809
810
return 0;
811
}
812
813
static int rz_mtu3_cnt_pm_runtime_resume(struct device *dev)
814
{
815
struct clk *const clk = dev_get_drvdata(dev);
816
817
clk_prepare_enable(clk);
818
819
return 0;
820
}
821
822
static DEFINE_RUNTIME_DEV_PM_OPS(rz_mtu3_cnt_pm_ops,
823
rz_mtu3_cnt_pm_runtime_suspend,
824
rz_mtu3_cnt_pm_runtime_resume, NULL);
825
826
static void rz_mtu3_cnt_pm_disable(void *data)
827
{
828
struct device *dev = data;
829
830
pm_runtime_disable(dev);
831
pm_runtime_set_suspended(dev);
832
}
833
834
static int rz_mtu3_cnt_probe(struct platform_device *pdev)
835
{
836
struct rz_mtu3 *ddata = dev_get_drvdata(pdev->dev.parent);
837
struct device *dev = &pdev->dev;
838
struct counter_device *counter;
839
struct rz_mtu3_channel *ch;
840
struct rz_mtu3_cnt *priv;
841
unsigned int i;
842
int ret;
843
844
counter = devm_counter_alloc(dev, sizeof(*priv));
845
if (!counter)
846
return -ENOMEM;
847
848
priv = counter_priv(counter);
849
priv->clk = ddata->clk;
850
priv->mtu_32bit_max = U32_MAX;
851
priv->ch = &ddata->channels[RZ_MTU3_CHAN_1];
852
ch = &priv->ch[0];
853
for (i = 0; i < RZ_MTU3_MAX_HW_CNTR_CHANNELS; i++) {
854
ch->dev = dev;
855
priv->mtu_16bit_max[i] = U16_MAX;
856
ch++;
857
}
858
859
mutex_init(&priv->lock);
860
platform_set_drvdata(pdev, priv->clk);
861
clk_prepare_enable(priv->clk);
862
pm_runtime_set_active(&pdev->dev);
863
pm_runtime_enable(&pdev->dev);
864
ret = devm_add_action_or_reset(&pdev->dev, rz_mtu3_cnt_pm_disable, dev);
865
if (ret < 0)
866
goto disable_clock;
867
868
counter->name = dev_name(dev);
869
counter->parent = dev;
870
counter->ops = &rz_mtu3_cnt_ops;
871
counter->counts = rz_mtu3_counts;
872
counter->num_counts = ARRAY_SIZE(rz_mtu3_counts);
873
counter->signals = rz_mtu3_signals;
874
counter->num_signals = ARRAY_SIZE(rz_mtu3_signals);
875
counter->ext = rz_mtu3_device_ext;
876
counter->num_ext = ARRAY_SIZE(rz_mtu3_device_ext);
877
878
/* Register Counter device */
879
ret = devm_counter_add(dev, counter);
880
if (ret < 0) {
881
dev_err_probe(dev, ret, "Failed to add counter\n");
882
goto disable_clock;
883
}
884
885
return 0;
886
887
disable_clock:
888
clk_disable_unprepare(priv->clk);
889
890
return ret;
891
}
892
893
static struct platform_driver rz_mtu3_cnt_driver = {
894
.probe = rz_mtu3_cnt_probe,
895
.driver = {
896
.name = "rz-mtu3-counter",
897
.pm = pm_ptr(&rz_mtu3_cnt_pm_ops),
898
},
899
};
900
module_platform_driver(rz_mtu3_cnt_driver);
901
902
MODULE_AUTHOR("Biju Das <[email protected]>");
903
MODULE_ALIAS("platform:rz-mtu3-counter");
904
MODULE_DESCRIPTION("Renesas RZ/G2L MTU3a counter driver");
905
MODULE_LICENSE("GPL");
906
MODULE_IMPORT_NS("COUNTER");
907
908