diff mbox series

[v5,1/4] staging: iio: resolver: ad2s1210: refactor sample toggle

Message ID 20231010-ad2s1210-mainline-v5-1-35a0f6ffa04a@baylibre.com (mailing list archive)
State Accepted
Headers show
Series iio: resolver: move ad2s1210 out of staging | expand

Commit Message

David Lechner Oct. 10, 2023, 9:12 p.m. UTC
This refactors the sample line toggle in the ad2s1210 resolver driver
to a separate function. The sample has some timing requirements, so
this ensures that it is always done the same way, both in the existing
call sites and any future usage.

Previously, the sample line was kept on for the duration of the read,
but this is not necessary. Data is latched in on the rising edge and
after the specified delay the state of the sample line does not matter.

Signed-off-by: David Lechner <dlechner@baylibre.com>
---

v5 changes: New patch in v5.

 drivers/staging/iio/resolver/ad2s1210.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

Comments

Jonathan Cameron Oct. 12, 2023, 7:58 a.m. UTC | #1
On Tue, 10 Oct 2023 16:12:33 -0500
David Lechner <dlechner@baylibre.com> wrote:

> This refactors the sample line toggle in the ad2s1210 resolver driver
> to a separate function. The sample has some timing requirements, so
> this ensures that it is always done the same way, both in the existing
> call sites and any future usage.
> 
> Previously, the sample line was kept on for the duration of the read,
> but this is not necessary. Data is latched in on the rising edge and
> after the specified delay the state of the sample line does not matter.
> 
> Signed-off-by: David Lechner <dlechner@baylibre.com>
Applied.
diff mbox series

Patch

diff --git a/drivers/staging/iio/resolver/ad2s1210.c b/drivers/staging/iio/resolver/ad2s1210.c
index e0bea3c68664..59c273a4b6a9 100644
--- a/drivers/staging/iio/resolver/ad2s1210.c
+++ b/drivers/staging/iio/resolver/ad2s1210.c
@@ -286,6 +286,26 @@  static int ad2s1210_regmap_reg_read(void *context, unsigned int reg,
 	return 0;
 }
 
+/*
+ * Toggles the SAMPLE line on the AD2S1210 to latch in the current position,
+ * velocity, and faults.
+ *
+ * Must be called with lock held.
+ */
+static void ad2s1210_toggle_sample_line(struct ad2s1210_state *st)
+{
+	/*
+	 * Datasheet specifies minimum hold time t16 = 2 * tck + 20 ns. So the
+	 * longest time needed is when CLKIN is 6.144 MHz, in which case t16
+	 * ~= 350 ns. The same delay is also needed before re-asserting the
+	 * SAMPLE line.
+	 */
+	gpiod_set_value(st->sample_gpio, 1);
+	ndelay(350);
+	gpiod_set_value(st->sample_gpio, 0);
+	ndelay(350);
+}
+
 /*
  * Sets the excitation frequency and performs software reset.
  *
@@ -405,10 +425,8 @@  static int ad2s1210_single_conversion(struct iio_dev *indio_dev,
 	int ret;
 
 	mutex_lock(&st->lock);
-	gpiod_set_value(st->sample_gpio, 1);
+	ad2s1210_toggle_sample_line(st);
 	timestamp = iio_get_time_ns(indio_dev);
-	/* delay (6 * tck + 20) nano seconds */
-	udelay(1);
 
 	switch (chan->type) {
 	case IIO_ANGL:
@@ -444,9 +462,6 @@  static int ad2s1210_single_conversion(struct iio_dev *indio_dev,
 	ad2s1210_push_events(indio_dev, st->sample.fault, timestamp);
 
 error_ret:
-	gpiod_set_value(st->sample_gpio, 0);
-	/* delay (2 * tck + 20) nano seconds */
-	udelay(1);
 	mutex_unlock(&st->lock);
 	return ret;
 }
@@ -1268,7 +1283,7 @@  static irqreturn_t ad2s1210_trigger_handler(int irq, void *p)
 	mutex_lock(&st->lock);
 
 	memset(&st->scan, 0, sizeof(st->scan));
-	gpiod_set_value(st->sample_gpio, 1);
+	ad2s1210_toggle_sample_line(st);
 
 	if (test_bit(0, indio_dev->active_scan_mask)) {
 		ret = ad2s1210_set_mode(st, MOD_POS);
@@ -1298,7 +1313,6 @@  static irqreturn_t ad2s1210_trigger_handler(int irq, void *p)
 	iio_push_to_buffers_with_timestamp(indio_dev, &st->scan, pf->timestamp);
 
 error_ret:
-	gpiod_set_value(st->sample_gpio, 0);
 	mutex_unlock(&st->lock);
 	iio_trigger_notify_done(indio_dev->trig);