]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
counter: microchip-tcb-capture: Add capture extensions for registers RA/RB
authorBence Csókás <csokas.bence@prolan.hu>
Thu, 6 Mar 2025 13:44:37 +0000 (14:44 +0100)
committerWilliam Breathitt Gray <wbg@kernel.org>
Fri, 7 Mar 2025 23:57:18 +0000 (08:57 +0900)
TCB hardware is capable of capturing the timer value to registers RA and
RB. Add these registers as capture extensions.

Signed-off-by: Bence Csókás <csokas.bence@prolan.hu>
Link: https://lore.kernel.org/r/20250306134441.582819-3-csokas.bence@prolan.hu
Signed-off-by: William Breathitt Gray <wbg@kernel.org>
drivers/counter/microchip-tcb-capture.c
include/uapi/linux/counter/microchip-tcb-capture.h

index 16707099bd69c7d6ada2bfa830ce4edc968b7b5b..aeaee6e0245e1e5bbe0974f94cdd44713469bc9a 100644 (file)
@@ -253,6 +253,62 @@ static int mchp_tc_count_read(struct counter_device *counter,
        return 0;
 }
 
+static int mchp_tc_count_cap_read(struct counter_device *counter,
+                                 struct counter_count *count, size_t idx, u64 *val)
+{
+       struct mchp_tc_data *const priv = counter_priv(counter);
+       u32 cnt;
+       int ret;
+
+       switch (idx) {
+       case COUNTER_MCHP_EXCAP_RA:
+               ret = regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], RA), &cnt);
+               break;
+       case COUNTER_MCHP_EXCAP_RB:
+               ret = regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], RB), &cnt);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if (ret < 0)
+               return ret;
+
+       *val = cnt;
+
+       return 0;
+}
+
+static int mchp_tc_count_cap_write(struct counter_device *counter,
+                                  struct counter_count *count, size_t idx, u64 val)
+{
+       struct mchp_tc_data *const priv = counter_priv(counter);
+       int ret;
+
+       if (val > U32_MAX)
+               return -ERANGE;
+
+       switch (idx) {
+       case COUNTER_MCHP_EXCAP_RA:
+               ret = regmap_write(priv->regmap, ATMEL_TC_REG(priv->channel[0], RA), val);
+               break;
+       case COUNTER_MCHP_EXCAP_RB:
+               ret = regmap_write(priv->regmap, ATMEL_TC_REG(priv->channel[0], RB), val);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return ret;
+}
+
+static DEFINE_COUNTER_ARRAY_CAPTURE(mchp_tc_cnt_cap_array, 2);
+
+static struct counter_comp mchp_tc_count_ext[] = {
+       COUNTER_COMP_ARRAY_CAPTURE(mchp_tc_count_cap_read, mchp_tc_count_cap_write,
+                                  mchp_tc_cnt_cap_array),
+};
+
 static struct counter_count mchp_tc_counts[] = {
        {
                .id = 0,
@@ -261,6 +317,8 @@ static struct counter_count mchp_tc_counts[] = {
                .num_functions = ARRAY_SIZE(mchp_tc_count_functions),
                .synapses = mchp_tc_count_synapses,
                .num_synapses = ARRAY_SIZE(mchp_tc_count_synapses),
+               .ext = mchp_tc_count_ext,
+               .num_ext = ARRAY_SIZE(mchp_tc_count_ext),
        },
 };
 
index f3ef315fe9f63f52fa29494fa2a245d536b3f707..136e2faa77309cff2d55641bc8516ebe5ccb6cb6 100644 (file)
@@ -12,6 +12,8 @@
  * Count 0
  * \__  Synapse 0 -- Signal 0 (Channel A, i.e. TIOA)
  * \__  Synapse 1 -- Signal 1 (Channel B, i.e. TIOB)
+ * \__  Extension capture0    (RA register)
+ * \__  Extension capture1    (RB register)
  *
  * It also supports the following events:
  *
  * - RC compare triggered
  */
 
+/* Capture extensions */
+#define COUNTER_MCHP_EXCAP_RA 0
+#define COUNTER_MCHP_EXCAP_RB 1
+
 /* Event channels */
 #define COUNTER_MCHP_EVCHN_CV 0
 #define COUNTER_MCHP_EVCHN_RA 0