counter: stm32-timer-cnt: add counter prescaler extension
authorFabrice Gasnier <fabrice.gasnier@foss.st.com>
Thu, 7 Mar 2024 13:33:01 +0000 (14:33 +0100)
committerWilliam Breathitt Gray <wbg@kernel.org>
Tue, 2 Apr 2024 17:10:34 +0000 (13:10 -0400)
There's a prescaler in between the selected input signal used for
counting (CK_PSC), and the counter input (CK_CNT).
So add the "prescaler" extension to the counter.

Reviewed-by: William Breathitt Gray <william.gray@linaro.org>
Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
Link: https://lore.kernel.org/r/20240307133306.383045-6-fabrice.gasnier@foss.st.com
Signed-off-by: William Breathitt Gray <william.gray@linaro.org>
drivers/counter/stm32-timer-cnt.c

index 65b447b42e75f446c1838bb586e01c9ea407df63..b969d550e90ae1e70bf69200df0a1dc00b313ed4 100644 (file)
@@ -220,11 +220,40 @@ static int stm32_count_enable_write(struct counter_device *counter,
        return 0;
 }
 
+static int stm32_count_prescaler_read(struct counter_device *counter,
+                                     struct counter_count *count, u64 *prescaler)
+{
+       struct stm32_timer_cnt *const priv = counter_priv(counter);
+       u32 psc;
+
+       regmap_read(priv->regmap, TIM_PSC, &psc);
+
+       *prescaler = psc + 1;
+
+       return 0;
+}
+
+static int stm32_count_prescaler_write(struct counter_device *counter,
+                                      struct counter_count *count, u64 prescaler)
+{
+       struct stm32_timer_cnt *const priv = counter_priv(counter);
+       u32 psc;
+
+       if (!prescaler || prescaler > MAX_TIM_PSC + 1)
+               return -ERANGE;
+
+       psc = prescaler - 1;
+
+       return regmap_write(priv->regmap, TIM_PSC, psc);
+}
+
 static struct counter_comp stm32_count_ext[] = {
        COUNTER_COMP_DIRECTION(stm32_count_direction_read),
        COUNTER_COMP_ENABLE(stm32_count_enable_read, stm32_count_enable_write),
        COUNTER_COMP_CEILING(stm32_count_ceiling_read,
                             stm32_count_ceiling_write),
+       COUNTER_COMP_COUNT_U64("prescaler", stm32_count_prescaler_read,
+                              stm32_count_prescaler_write),
 };
 
 static const enum counter_synapse_action stm32_clock_synapse_actions[] = {