All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Lechner <david@lechnology.com>
To: linux-iio@vger.kernel.org
Cc: David Lechner <david@lechnology.com>,
	William Breathitt Gray <vilhelm.gray@gmail.com>,
	Robert Nelson <robertcnelson@gmail.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH 2/8] counter/ti-eqep: add support for direction
Date: Sat, 16 Oct 2021 20:33:37 -0500	[thread overview]
Message-ID: <20211017013343.3385923-3-david@lechnology.com> (raw)
In-Reply-To: <20211017013343.3385923-1-david@lechnology.com>

This adds support for direction to the TI eQEP counter driver. It adds
both a direction attribute to sysfs and a direction change event to
the chrdev. The direction change event type is new public API.

Signed-off-by: David Lechner <david@lechnology.com>
---
 drivers/counter/ti-eqep.c    | 33 +++++++++++++++++++++++++++++++++
 include/uapi/linux/counter.h |  2 ++
 2 files changed, 35 insertions(+)

diff --git a/drivers/counter/ti-eqep.c b/drivers/counter/ti-eqep.c
index b7c79435e127..9881e5115da6 100644
--- a/drivers/counter/ti-eqep.c
+++ b/drivers/counter/ti-eqep.c
@@ -106,6 +106,15 @@
 #define QCLR_PCE		BIT(1)
 #define QCLR_INT		BIT(0)
 
+#define QEPSTS_UPEVNT		BIT(7)
+#define QEPSTS_FDF		BIT(6)
+#define QEPSTS_QDF		BIT(5)
+#define QEPSTS_QDLF		BIT(4)
+#define QEPSTS_COEF		BIT(3)
+#define QEPSTS_CDEF		BIT(2)
+#define QEPSTS_FIMF		BIT(1)
+#define QEPSTS_PCEF		BIT(0)
+
 /* EQEP Inputs */
 enum {
 	TI_EQEP_SIGNAL_QEPA,	/* QEPA/XCLK */
@@ -286,6 +295,9 @@ static int ti_eqep_events_configure(struct counter_device *counter)
 		case COUNTER_EVENT_UNDERFLOW:
 			qeint |= QEINT_PCU;
 			break;
+		case COUNTER_EVENT_DIRECTION_CHANGE:
+			qeint |= QEINT_QDC;
+			break;
 		}
 	}
 
@@ -298,6 +310,7 @@ static int ti_eqep_watch_validate(struct counter_device *counter,
 	switch (watch->event) {
 	case COUNTER_EVENT_OVERFLOW:
 	case COUNTER_EVENT_UNDERFLOW:
+	case COUNTER_EVENT_DIRECTION_CHANGE:
 		return 0;
 	default:
 		return -EINVAL;
@@ -371,11 +384,27 @@ static int ti_eqep_position_enable_write(struct counter_device *counter,
 	return 0;
 }
 
+static int ti_eqep_direction_read(struct counter_device *counter,
+				  struct counter_count *count,
+				  enum counter_count_direction *direction)
+{
+	struct ti_eqep_cnt *priv = counter->priv;
+	u32 qepsts;
+
+	regmap_read(priv->regmap16, QEPSTS, &qepsts);
+
+	*direction = (qepsts & QEPSTS_QDF) ? COUNTER_COUNT_DIRECTION_FORWARD
+					   : COUNTER_COUNT_DIRECTION_BACKWARD;
+
+	return 0;
+}
+
 static struct counter_comp ti_eqep_position_ext[] = {
 	COUNTER_COMP_CEILING(ti_eqep_position_ceiling_read,
 			     ti_eqep_position_ceiling_write),
 	COUNTER_COMP_ENABLE(ti_eqep_position_enable_read,
 			    ti_eqep_position_enable_write),
+	COUNTER_COMP_DIRECTION(ti_eqep_direction_read),
 };
 
 static struct counter_signal ti_eqep_signals[] = {
@@ -442,6 +471,10 @@ static irqreturn_t ti_eqep_irq_handler(int irq, void *dev_id)
 	if (qflg & QFLG_PCU)
 		counter_push_event(counter, COUNTER_EVENT_UNDERFLOW, 0);
 
+	if (qflg & QFLG_QDC)
+		counter_push_event(counter, COUNTER_EVENT_DIRECTION_CHANGE, 0);
+
+
 	regmap_set_bits(priv->regmap16, QCLR, ~0);
 
 	return IRQ_HANDLED;
diff --git a/include/uapi/linux/counter.h b/include/uapi/linux/counter.h
index d0aa95aeff7b..36dd3b474d09 100644
--- a/include/uapi/linux/counter.h
+++ b/include/uapi/linux/counter.h
@@ -61,6 +61,8 @@ enum counter_event_type {
 	COUNTER_EVENT_THRESHOLD,
 	/* Index signal detected */
 	COUNTER_EVENT_INDEX,
+	/* Direction change detected */
+	COUNTER_EVENT_DIRECTION_CHANGE,
 };
 
 /**
-- 
2.25.1


  parent reply	other threads:[~2021-10-17  1:56 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-17  1:33 [PATCH 0/8] counter: ti-eqep: implement features for speed measurement David Lechner
2021-10-17  1:33 ` [PATCH 1/8] counter/ti-eqep: implement over/underflow events David Lechner
2021-10-17 11:10   ` Jonathan Cameron
2021-10-25  7:13   ` William Breathitt Gray
2021-10-27 15:23     ` David Lechner
2021-10-28  6:41       ` William Breathitt Gray
2021-10-17  1:33 ` David Lechner [this message]
2021-10-17 11:11   ` [PATCH 2/8] counter/ti-eqep: add support for direction Jonathan Cameron
2021-10-25  7:29   ` William Breathitt Gray
2021-10-17  1:33 ` [PATCH 3/8] counter/ti-eqep: add support for unit timer David Lechner
2021-10-17 11:20   ` Jonathan Cameron
2021-10-25  8:48   ` William Breathitt Gray
2021-10-27 15:28     ` David Lechner
2021-10-28  7:48       ` William Breathitt Gray
2021-10-28 13:42         ` David Lechner
2021-10-30  8:35           ` William Breathitt Gray
2021-10-17  1:33 ` [PATCH 4/8] docs: counter: add unit timer sysfs attributes David Lechner
2021-10-17 11:23   ` Jonathan Cameron
2021-10-27  6:46   ` William Breathitt Gray
2021-10-27 15:30     ` David Lechner
2021-10-28  7:59       ` William Breathitt Gray
2021-10-30 16:40         ` David Lechner
2021-11-01  4:08           ` William Breathitt Gray
2021-11-01  5:27             ` William Breathitt Gray
2021-10-17  1:33 ` [PATCH 5/8] counter/ti-eqep: add support for latched position David Lechner
2021-10-27  7:44   ` William Breathitt Gray
2021-10-27 15:40     ` David Lechner
2021-10-28  8:12       ` William Breathitt Gray
2021-10-17  1:33 ` [PATCH 6/8] docs: counter: add latch_mode and latched_count sysfs attributes David Lechner
2021-10-17 11:26   ` Jonathan Cameron
2021-10-27  7:54   ` William Breathitt Gray
2021-10-27 17:00     ` David Lechner
2021-10-30  1:32       ` William Breathitt Gray
2021-10-30 14:39         ` Jonathan Cameron
2021-11-01  5:11           ` William Breathitt Gray
2021-10-17  1:33 ` [PATCH 7/8] counter/ti-eqep: add support for edge capture unit David Lechner
2021-10-17 11:29   ` Jonathan Cameron
2021-10-27  8:23   ` William Breathitt Gray
2021-10-27 17:28     ` David Lechner
2021-10-17  1:33 ` [PATCH 8/8] docs: counter: add edge_capture_unit_* attributes David Lechner
2021-10-27  8:26   ` William Breathitt Gray

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211017013343.3385923-3-david@lechnology.com \
    --to=david@lechnology.com \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robertcnelson@gmail.com \
    --cc=vilhelm.gray@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.