1 // SPDX-License-Identifier: GPL-2.0
3 * STM32 Low-Power Timer Encoder and Counter driver
5 * Copyright (C) STMicroelectronics 2017
7 * Author: Fabrice Gasnier <fabrice.gasnier@st.com>
9 * Inspired by 104-quad-8 and stm32-timer-trigger drivers.
13 #include <linux/bitfield.h>
14 #include <linux/counter.h>
15 #include <linux/iio/iio.h>
16 #include <linux/mfd/stm32-lptimer.h>
17 #include <linux/module.h>
18 #include <linux/pinctrl/consumer.h>
19 #include <linux/platform_device.h>
21 struct stm32_lptim_cnt
{
22 struct counter_device counter
;
24 struct regmap
*regmap
;
32 static int stm32_lptim_is_enabled(struct stm32_lptim_cnt
*priv
)
37 ret
= regmap_read(priv
->regmap
, STM32_LPTIM_CR
, &val
);
41 return FIELD_GET(STM32_LPTIM_ENABLE
, val
);
44 static int stm32_lptim_set_enable_state(struct stm32_lptim_cnt
*priv
,
50 val
= FIELD_PREP(STM32_LPTIM_ENABLE
, enable
);
51 ret
= regmap_write(priv
->regmap
, STM32_LPTIM_CR
, val
);
56 clk_disable(priv
->clk
);
57 priv
->enabled
= false;
61 /* LP timer must be enabled before writing CMP & ARR */
62 ret
= regmap_write(priv
->regmap
, STM32_LPTIM_ARR
, priv
->ceiling
);
66 ret
= regmap_write(priv
->regmap
, STM32_LPTIM_CMP
, 0);
70 /* ensure CMP & ARR registers are properly written */
71 ret
= regmap_read_poll_timeout(priv
->regmap
, STM32_LPTIM_ISR
, val
,
72 (val
& STM32_LPTIM_CMPOK_ARROK
),
77 ret
= regmap_write(priv
->regmap
, STM32_LPTIM_ICR
,
78 STM32_LPTIM_CMPOKCF_ARROKCF
);
82 ret
= clk_enable(priv
->clk
);
84 regmap_write(priv
->regmap
, STM32_LPTIM_CR
, 0);
89 /* Start LP timer in continuous mode */
90 return regmap_update_bits(priv
->regmap
, STM32_LPTIM_CR
,
91 STM32_LPTIM_CNTSTRT
, STM32_LPTIM_CNTSTRT
);
94 static int stm32_lptim_setup(struct stm32_lptim_cnt
*priv
, int enable
)
96 u32 mask
= STM32_LPTIM_ENC
| STM32_LPTIM_COUNTMODE
|
97 STM32_LPTIM_CKPOL
| STM32_LPTIM_PRESC
;
100 /* Setup LP timer encoder/counter and polarity, without prescaler */
101 if (priv
->quadrature_mode
)
102 val
= enable
? STM32_LPTIM_ENC
: 0;
104 val
= enable
? STM32_LPTIM_COUNTMODE
: 0;
105 val
|= FIELD_PREP(STM32_LPTIM_CKPOL
, enable
? priv
->polarity
: 0);
107 return regmap_update_bits(priv
->regmap
, STM32_LPTIM_CFGR
, mask
, val
);
110 static int stm32_lptim_write_raw(struct iio_dev
*indio_dev
,
111 struct iio_chan_spec
const *chan
,
112 int val
, int val2
, long mask
)
114 struct stm32_lptim_cnt
*priv
= iio_priv(indio_dev
);
118 case IIO_CHAN_INFO_ENABLE
:
119 if (val
< 0 || val
> 1)
122 /* Check nobody uses the timer, or already disabled/enabled */
123 ret
= stm32_lptim_is_enabled(priv
);
124 if ((ret
< 0) || (!ret
&& !val
))
129 ret
= stm32_lptim_setup(priv
, val
);
132 return stm32_lptim_set_enable_state(priv
, val
);
139 static int stm32_lptim_read_raw(struct iio_dev
*indio_dev
,
140 struct iio_chan_spec
const *chan
,
141 int *val
, int *val2
, long mask
)
143 struct stm32_lptim_cnt
*priv
= iio_priv(indio_dev
);
148 case IIO_CHAN_INFO_RAW
:
149 ret
= regmap_read(priv
->regmap
, STM32_LPTIM_CNT
, &dat
);
155 case IIO_CHAN_INFO_ENABLE
:
156 ret
= stm32_lptim_is_enabled(priv
);
162 case IIO_CHAN_INFO_SCALE
:
163 /* Non-quadrature mode: scale = 1 */
166 if (priv
->quadrature_mode
) {
168 * Quadrature encoder mode:
169 * - both edges, quarter cycle, scale is 0.25
170 * - either rising/falling edge scale is 0.5
172 if (priv
->polarity
> 1)
177 return IIO_VAL_FRACTIONAL_LOG2
;
184 static const struct iio_info stm32_lptim_cnt_iio_info
= {
185 .read_raw
= stm32_lptim_read_raw
,
186 .write_raw
= stm32_lptim_write_raw
,
189 static const char *const stm32_lptim_quadrature_modes
[] = {
194 static int stm32_lptim_get_quadrature_mode(struct iio_dev
*indio_dev
,
195 const struct iio_chan_spec
*chan
)
197 struct stm32_lptim_cnt
*priv
= iio_priv(indio_dev
);
199 return priv
->quadrature_mode
;
202 static int stm32_lptim_set_quadrature_mode(struct iio_dev
*indio_dev
,
203 const struct iio_chan_spec
*chan
,
206 struct stm32_lptim_cnt
*priv
= iio_priv(indio_dev
);
208 if (stm32_lptim_is_enabled(priv
))
211 priv
->quadrature_mode
= type
;
216 static const struct iio_enum stm32_lptim_quadrature_mode_en
= {
217 .items
= stm32_lptim_quadrature_modes
,
218 .num_items
= ARRAY_SIZE(stm32_lptim_quadrature_modes
),
219 .get
= stm32_lptim_get_quadrature_mode
,
220 .set
= stm32_lptim_set_quadrature_mode
,
223 static const char * const stm32_lptim_cnt_polarity
[] = {
224 "rising-edge", "falling-edge", "both-edges",
227 static int stm32_lptim_cnt_get_polarity(struct iio_dev
*indio_dev
,
228 const struct iio_chan_spec
*chan
)
230 struct stm32_lptim_cnt
*priv
= iio_priv(indio_dev
);
232 return priv
->polarity
;
235 static int stm32_lptim_cnt_set_polarity(struct iio_dev
*indio_dev
,
236 const struct iio_chan_spec
*chan
,
239 struct stm32_lptim_cnt
*priv
= iio_priv(indio_dev
);
241 if (stm32_lptim_is_enabled(priv
))
244 priv
->polarity
= type
;
249 static const struct iio_enum stm32_lptim_cnt_polarity_en
= {
250 .items
= stm32_lptim_cnt_polarity
,
251 .num_items
= ARRAY_SIZE(stm32_lptim_cnt_polarity
),
252 .get
= stm32_lptim_cnt_get_polarity
,
253 .set
= stm32_lptim_cnt_set_polarity
,
256 static ssize_t
stm32_lptim_cnt_get_ceiling(struct stm32_lptim_cnt
*priv
,
259 return snprintf(buf
, PAGE_SIZE
, "%u\n", priv
->ceiling
);
262 static ssize_t
stm32_lptim_cnt_set_ceiling(struct stm32_lptim_cnt
*priv
,
263 const char *buf
, size_t len
)
267 if (stm32_lptim_is_enabled(priv
))
270 ret
= kstrtouint(buf
, 0, &priv
->ceiling
);
274 if (priv
->ceiling
> STM32_LPTIM_MAX_ARR
)
280 static ssize_t
stm32_lptim_cnt_get_preset_iio(struct iio_dev
*indio_dev
,
282 const struct iio_chan_spec
*chan
,
285 struct stm32_lptim_cnt
*priv
= iio_priv(indio_dev
);
287 return stm32_lptim_cnt_get_ceiling(priv
, buf
);
290 static ssize_t
stm32_lptim_cnt_set_preset_iio(struct iio_dev
*indio_dev
,
292 const struct iio_chan_spec
*chan
,
293 const char *buf
, size_t len
)
295 struct stm32_lptim_cnt
*priv
= iio_priv(indio_dev
);
297 return stm32_lptim_cnt_set_ceiling(priv
, buf
, len
);
300 /* LP timer with encoder */
301 static const struct iio_chan_spec_ext_info stm32_lptim_enc_ext_info
[] = {
304 .shared
= IIO_SEPARATE
,
305 .read
= stm32_lptim_cnt_get_preset_iio
,
306 .write
= stm32_lptim_cnt_set_preset_iio
,
308 IIO_ENUM("polarity", IIO_SEPARATE
, &stm32_lptim_cnt_polarity_en
),
309 IIO_ENUM_AVAILABLE("polarity", &stm32_lptim_cnt_polarity_en
),
310 IIO_ENUM("quadrature_mode", IIO_SEPARATE
,
311 &stm32_lptim_quadrature_mode_en
),
312 IIO_ENUM_AVAILABLE("quadrature_mode", &stm32_lptim_quadrature_mode_en
),
316 static const struct iio_chan_spec stm32_lptim_enc_channels
= {
319 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
) |
320 BIT(IIO_CHAN_INFO_ENABLE
) |
321 BIT(IIO_CHAN_INFO_SCALE
),
322 .ext_info
= stm32_lptim_enc_ext_info
,
326 /* LP timer without encoder (counter only) */
327 static const struct iio_chan_spec_ext_info stm32_lptim_cnt_ext_info
[] = {
330 .shared
= IIO_SEPARATE
,
331 .read
= stm32_lptim_cnt_get_preset_iio
,
332 .write
= stm32_lptim_cnt_set_preset_iio
,
334 IIO_ENUM("polarity", IIO_SEPARATE
, &stm32_lptim_cnt_polarity_en
),
335 IIO_ENUM_AVAILABLE("polarity", &stm32_lptim_cnt_polarity_en
),
339 static const struct iio_chan_spec stm32_lptim_cnt_channels
= {
342 .info_mask_separate
= BIT(IIO_CHAN_INFO_RAW
) |
343 BIT(IIO_CHAN_INFO_ENABLE
) |
344 BIT(IIO_CHAN_INFO_SCALE
),
345 .ext_info
= stm32_lptim_cnt_ext_info
,
350 * stm32_lptim_cnt_function - enumerates stm32 LPTimer counter & encoder modes
351 * @STM32_LPTIM_COUNTER_INCREASE: up count on IN1 rising, falling or both edges
352 * @STM32_LPTIM_ENCODER_BOTH_EDGE: count on both edges (IN1 & IN2 quadrature)
354 enum stm32_lptim_cnt_function
{
355 STM32_LPTIM_COUNTER_INCREASE
,
356 STM32_LPTIM_ENCODER_BOTH_EDGE
,
359 static enum counter_count_function stm32_lptim_cnt_functions
[] = {
360 [STM32_LPTIM_COUNTER_INCREASE
] = COUNTER_COUNT_FUNCTION_INCREASE
,
361 [STM32_LPTIM_ENCODER_BOTH_EDGE
] = COUNTER_COUNT_FUNCTION_QUADRATURE_X4
,
364 enum stm32_lptim_synapse_action
{
365 STM32_LPTIM_SYNAPSE_ACTION_RISING_EDGE
,
366 STM32_LPTIM_SYNAPSE_ACTION_FALLING_EDGE
,
367 STM32_LPTIM_SYNAPSE_ACTION_BOTH_EDGES
,
368 STM32_LPTIM_SYNAPSE_ACTION_NONE
,
371 static enum counter_synapse_action stm32_lptim_cnt_synapse_actions
[] = {
372 /* Index must match with stm32_lptim_cnt_polarity[] (priv->polarity) */
373 [STM32_LPTIM_SYNAPSE_ACTION_RISING_EDGE
] = COUNTER_SYNAPSE_ACTION_RISING_EDGE
,
374 [STM32_LPTIM_SYNAPSE_ACTION_FALLING_EDGE
] = COUNTER_SYNAPSE_ACTION_FALLING_EDGE
,
375 [STM32_LPTIM_SYNAPSE_ACTION_BOTH_EDGES
] = COUNTER_SYNAPSE_ACTION_BOTH_EDGES
,
376 [STM32_LPTIM_SYNAPSE_ACTION_NONE
] = COUNTER_SYNAPSE_ACTION_NONE
,
379 static int stm32_lptim_cnt_read(struct counter_device
*counter
,
380 struct counter_count
*count
,
381 struct counter_count_read_value
*val
)
383 struct stm32_lptim_cnt
*const priv
= counter
->priv
;
387 ret
= regmap_read(priv
->regmap
, STM32_LPTIM_CNT
, &cnt
);
391 counter_count_read_value_set(val
, COUNTER_COUNT_POSITION
, &cnt
);
396 static int stm32_lptim_cnt_function_get(struct counter_device
*counter
,
397 struct counter_count
*count
,
400 struct stm32_lptim_cnt
*const priv
= counter
->priv
;
402 if (!priv
->quadrature_mode
) {
403 *function
= STM32_LPTIM_COUNTER_INCREASE
;
407 if (priv
->polarity
== STM32_LPTIM_SYNAPSE_ACTION_BOTH_EDGES
) {
408 *function
= STM32_LPTIM_ENCODER_BOTH_EDGE
;
415 static int stm32_lptim_cnt_function_set(struct counter_device
*counter
,
416 struct counter_count
*count
,
419 struct stm32_lptim_cnt
*const priv
= counter
->priv
;
421 if (stm32_lptim_is_enabled(priv
))
425 case STM32_LPTIM_COUNTER_INCREASE
:
426 priv
->quadrature_mode
= 0;
428 case STM32_LPTIM_ENCODER_BOTH_EDGE
:
429 priv
->quadrature_mode
= 1;
430 priv
->polarity
= STM32_LPTIM_SYNAPSE_ACTION_BOTH_EDGES
;
437 static ssize_t
stm32_lptim_cnt_enable_read(struct counter_device
*counter
,
438 struct counter_count
*count
,
439 void *private, char *buf
)
441 struct stm32_lptim_cnt
*const priv
= counter
->priv
;
444 ret
= stm32_lptim_is_enabled(priv
);
448 return scnprintf(buf
, PAGE_SIZE
, "%u\n", ret
);
451 static ssize_t
stm32_lptim_cnt_enable_write(struct counter_device
*counter
,
452 struct counter_count
*count
,
454 const char *buf
, size_t len
)
456 struct stm32_lptim_cnt
*const priv
= counter
->priv
;
460 ret
= kstrtobool(buf
, &enable
);
464 /* Check nobody uses the timer, or already disabled/enabled */
465 ret
= stm32_lptim_is_enabled(priv
);
466 if ((ret
< 0) || (!ret
&& !enable
))
471 ret
= stm32_lptim_setup(priv
, enable
);
475 ret
= stm32_lptim_set_enable_state(priv
, enable
);
482 static ssize_t
stm32_lptim_cnt_ceiling_read(struct counter_device
*counter
,
483 struct counter_count
*count
,
484 void *private, char *buf
)
486 struct stm32_lptim_cnt
*const priv
= counter
->priv
;
488 return stm32_lptim_cnt_get_ceiling(priv
, buf
);
491 static ssize_t
stm32_lptim_cnt_ceiling_write(struct counter_device
*counter
,
492 struct counter_count
*count
,
494 const char *buf
, size_t len
)
496 struct stm32_lptim_cnt
*const priv
= counter
->priv
;
498 return stm32_lptim_cnt_set_ceiling(priv
, buf
, len
);
501 static const struct counter_count_ext stm32_lptim_cnt_ext
[] = {
504 .read
= stm32_lptim_cnt_enable_read
,
505 .write
= stm32_lptim_cnt_enable_write
509 .read
= stm32_lptim_cnt_ceiling_read
,
510 .write
= stm32_lptim_cnt_ceiling_write
514 static int stm32_lptim_cnt_action_get(struct counter_device
*counter
,
515 struct counter_count
*count
,
516 struct counter_synapse
*synapse
,
519 struct stm32_lptim_cnt
*const priv
= counter
->priv
;
523 err
= stm32_lptim_cnt_function_get(counter
, count
, &function
);
528 case STM32_LPTIM_COUNTER_INCREASE
:
529 /* LP Timer acts as up-counter on input 1 */
530 if (synapse
->signal
->id
== count
->synapses
[0].signal
->id
)
531 *action
= priv
->polarity
;
533 *action
= STM32_LPTIM_SYNAPSE_ACTION_NONE
;
535 case STM32_LPTIM_ENCODER_BOTH_EDGE
:
536 *action
= priv
->polarity
;
543 static int stm32_lptim_cnt_action_set(struct counter_device
*counter
,
544 struct counter_count
*count
,
545 struct counter_synapse
*synapse
,
548 struct stm32_lptim_cnt
*const priv
= counter
->priv
;
552 if (stm32_lptim_is_enabled(priv
))
555 err
= stm32_lptim_cnt_function_get(counter
, count
, &function
);
559 /* only set polarity when in counter mode (on input 1) */
560 if (function
== STM32_LPTIM_COUNTER_INCREASE
561 && synapse
->signal
->id
== count
->synapses
[0].signal
->id
) {
563 case STM32_LPTIM_SYNAPSE_ACTION_RISING_EDGE
:
564 case STM32_LPTIM_SYNAPSE_ACTION_FALLING_EDGE
:
565 case STM32_LPTIM_SYNAPSE_ACTION_BOTH_EDGES
:
566 priv
->polarity
= action
;
574 static const struct counter_ops stm32_lptim_cnt_ops
= {
575 .count_read
= stm32_lptim_cnt_read
,
576 .function_get
= stm32_lptim_cnt_function_get
,
577 .function_set
= stm32_lptim_cnt_function_set
,
578 .action_get
= stm32_lptim_cnt_action_get
,
579 .action_set
= stm32_lptim_cnt_action_set
,
582 static struct counter_signal stm32_lptim_cnt_signals
[] = {
585 .name
= "Channel 1 Quadrature A"
589 .name
= "Channel 1 Quadrature B"
593 static struct counter_synapse stm32_lptim_cnt_synapses
[] = {
595 .actions_list
= stm32_lptim_cnt_synapse_actions
,
596 .num_actions
= ARRAY_SIZE(stm32_lptim_cnt_synapse_actions
),
597 .signal
= &stm32_lptim_cnt_signals
[0]
600 .actions_list
= stm32_lptim_cnt_synapse_actions
,
601 .num_actions
= ARRAY_SIZE(stm32_lptim_cnt_synapse_actions
),
602 .signal
= &stm32_lptim_cnt_signals
[1]
606 /* LP timer with encoder */
607 static struct counter_count stm32_lptim_enc_counts
= {
609 .name
= "LPTimer Count",
610 .functions_list
= stm32_lptim_cnt_functions
,
611 .num_functions
= ARRAY_SIZE(stm32_lptim_cnt_functions
),
612 .synapses
= stm32_lptim_cnt_synapses
,
613 .num_synapses
= ARRAY_SIZE(stm32_lptim_cnt_synapses
),
614 .ext
= stm32_lptim_cnt_ext
,
615 .num_ext
= ARRAY_SIZE(stm32_lptim_cnt_ext
)
618 /* LP timer without encoder (counter only) */
619 static struct counter_count stm32_lptim_in1_counts
= {
621 .name
= "LPTimer Count",
622 .functions_list
= stm32_lptim_cnt_functions
,
624 .synapses
= stm32_lptim_cnt_synapses
,
626 .ext
= stm32_lptim_cnt_ext
,
627 .num_ext
= ARRAY_SIZE(stm32_lptim_cnt_ext
)
630 static int stm32_lptim_cnt_probe(struct platform_device
*pdev
)
632 struct stm32_lptimer
*ddata
= dev_get_drvdata(pdev
->dev
.parent
);
633 struct stm32_lptim_cnt
*priv
;
634 struct iio_dev
*indio_dev
;
637 if (IS_ERR_OR_NULL(ddata
))
640 indio_dev
= devm_iio_device_alloc(&pdev
->dev
, sizeof(*priv
));
644 priv
= iio_priv(indio_dev
);
645 priv
->dev
= &pdev
->dev
;
646 priv
->regmap
= ddata
->regmap
;
647 priv
->clk
= ddata
->clk
;
648 priv
->ceiling
= STM32_LPTIM_MAX_ARR
;
650 /* Initialize IIO device */
651 indio_dev
->name
= dev_name(&pdev
->dev
);
652 indio_dev
->dev
.parent
= &pdev
->dev
;
653 indio_dev
->dev
.of_node
= pdev
->dev
.of_node
;
654 indio_dev
->info
= &stm32_lptim_cnt_iio_info
;
655 if (ddata
->has_encoder
)
656 indio_dev
->channels
= &stm32_lptim_enc_channels
;
658 indio_dev
->channels
= &stm32_lptim_cnt_channels
;
659 indio_dev
->num_channels
= 1;
661 /* Initialize Counter device */
662 priv
->counter
.name
= dev_name(&pdev
->dev
);
663 priv
->counter
.parent
= &pdev
->dev
;
664 priv
->counter
.ops
= &stm32_lptim_cnt_ops
;
665 if (ddata
->has_encoder
) {
666 priv
->counter
.counts
= &stm32_lptim_enc_counts
;
667 priv
->counter
.num_signals
= ARRAY_SIZE(stm32_lptim_cnt_signals
);
669 priv
->counter
.counts
= &stm32_lptim_in1_counts
;
670 priv
->counter
.num_signals
= 1;
672 priv
->counter
.num_counts
= 1;
673 priv
->counter
.signals
= stm32_lptim_cnt_signals
;
674 priv
->counter
.priv
= priv
;
676 platform_set_drvdata(pdev
, priv
);
678 ret
= devm_iio_device_register(&pdev
->dev
, indio_dev
);
682 return devm_counter_register(&pdev
->dev
, &priv
->counter
);
685 #ifdef CONFIG_PM_SLEEP
686 static int stm32_lptim_cnt_suspend(struct device
*dev
)
688 struct stm32_lptim_cnt
*priv
= dev_get_drvdata(dev
);
691 /* Only take care of enabled counter: don't disturb other MFD child */
693 ret
= stm32_lptim_setup(priv
, 0);
697 ret
= stm32_lptim_set_enable_state(priv
, 0);
701 /* Force enable state for later resume */
702 priv
->enabled
= true;
705 return pinctrl_pm_select_sleep_state(dev
);
708 static int stm32_lptim_cnt_resume(struct device
*dev
)
710 struct stm32_lptim_cnt
*priv
= dev_get_drvdata(dev
);
713 ret
= pinctrl_pm_select_default_state(dev
);
718 priv
->enabled
= false;
719 ret
= stm32_lptim_setup(priv
, 1);
723 ret
= stm32_lptim_set_enable_state(priv
, 1);
732 static SIMPLE_DEV_PM_OPS(stm32_lptim_cnt_pm_ops
, stm32_lptim_cnt_suspend
,
733 stm32_lptim_cnt_resume
);
735 static const struct of_device_id stm32_lptim_cnt_of_match
[] = {
736 { .compatible
= "st,stm32-lptimer-counter", },
739 MODULE_DEVICE_TABLE(of
, stm32_lptim_cnt_of_match
);
741 static struct platform_driver stm32_lptim_cnt_driver
= {
742 .probe
= stm32_lptim_cnt_probe
,
744 .name
= "stm32-lptimer-counter",
745 .of_match_table
= stm32_lptim_cnt_of_match
,
746 .pm
= &stm32_lptim_cnt_pm_ops
,
749 module_platform_driver(stm32_lptim_cnt_driver
);
751 MODULE_AUTHOR("Fabrice Gasnier <fabrice.gasnier@st.com>");
752 MODULE_ALIAS("platform:stm32-lptimer-counter");
753 MODULE_DESCRIPTION("STMicroelectronics STM32 LPTIM counter driver");
754 MODULE_LICENSE("GPL v2");