Commit 1adc6240 authored by Bence Csókás's avatar Bence Csókás Committed by William Breathitt Gray
Browse files

counter: microchip-tcb-capture: Add capture extensions for registers RA/RB



TCB hardware is capable of capturing the timer value to registers RA and
RB. Add these registers as capture extensions.

Signed-off-by: default avatarBence Csókás <csokas.bence@prolan.hu>
Link: https://lore.kernel.org/r/20250306134441.582819-3-csokas.bence@prolan.hu


Signed-off-by: default avatarWilliam Breathitt Gray <wbg@kernel.org>
parent e5d58139
Loading
Loading
Loading
Loading
+58 −0
Original line number Diff line number Diff line
@@ -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),
	},
};

+6 −0
Original line number Diff line number Diff line
@@ -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:
 *
@@ -25,6 +27,10 @@
 * - 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