mbox series

[v2,00/19] iio: resolver: move ad2s1210 out of staging

Message ID 20230921141947.57784-1-dlechner@baylibre.com
Headers show
Series iio: resolver: move ad2s1210 out of staging | expand

Message

David Lechner Sept. 21, 2023, 2:19 p.m. UTC
Changes since v1:
* Address initial device tree patch feedback
* Drop "iio: sysfs: add IIO_DEVICE_ATTR_NAMED_RW macro" (related cleanups
  also dropped for now, will address in a future series if needed)
* Apply improvements as a series as patches to the staging driver. It is not
  quite ready for the move out of staging patch yet.

This series has been tested on actual hardware using a EVAL-AD2S1210 evaluation
board. (Note: not all device tree features have been implemented in the driver
since the eval board doesn't support them out of the box. We plan to add them
later if needed.)

One thing left over from the staging driver that probably needs more attention
still is the fault handling (both the fault threshold attributes and how
userspace gets notified of fault conditions). We considered adding these as
events, but the fault conditions are related to internal measurements in the
chip that aren't available as channels.

Since the chip is designed to read the fault register each time we read the
data registers for one of the two channels it seems like faults should be
associated with channels one way or another. Would it make sense to add extra
channels for the internal signals that only have fault events (mostly with
IIO_EV_TYPE_THRESH)? Or would it make sense to add a new "flags" channel type
where the "raw" value is bit flags? Or something else?

Here is the table of available faults for context. Sine/cosine inputs are
internal signals.

| Bit | Description
+-----+------------
| D7  |  Sine/cosine inputs clipped
| D6  |  Sine/cosine inputs below LOS threshold
| D5  |  Sine/cosine inputs exceed DOS overrange threshold
| D4  |  Sine/cosine inputs exceed DOS mismatch threshold
| D3  |  Tracking error exceeds LOT threshold
| D2  |  Velocity exceeds maximum tracking rate
| D1  |  Phase error exceeds phase lock range
| D0  |  Configuration parity error

David Lechner (19):
  dt-bindings: iio: resolver: add devicetree bindings for ad2s1210
  staging: iio: Documentation: document IIO resolver AD2S1210 sysfs
    attributes
  staging: iio: resolver: ad2s1210: fix ad2s1210_show_fault
  staging: iio: resolver: ad2s1210: fix not restoring sample gpio in
    channel read
  staging: iio: resolver: ad2s1210: fix probe
  staging: iio: resolver: ad2s1210: always use 16-bit value for raw read
  staging: iio: resolver: ad2s1210: implement IIO_CHAN_INFO_SCALE
  staging: iio: resolver: ad2s1210: use devicetree to get fclkin
  staging: iio: resolver: ad2s1210: use regmap for config registers
  staging: iio: resolver: ad2s1210: add debugfs reg access
  staging: iio: resolver: ad2s1210: remove config attribute
  staging: iio: resolver: ad2s1210: rework gpios
  staging: iio: resolver: ad2s1210: implement hysteresis as channel attr
  staging: iio: resolver: ad2s1210: refactor setting excitation
    frequency
  staging: iio: resolver: ad2s1210: read excitation frequency from
    control register
  staging: iio: resolver: ad2s1210: rename fexcit attribute
  staging: iio: resolver: ad2s1210: convert resolution to devicetree
    property
  staging: iio: resolver: ad2s1210: add phase_lock_range attributes
  staging: iio: resolver: ad2s1210: add triggered buffer support

 .../bindings/iio/resolver/adi,ad2s1210.yaml   | 150 +++
 .../sysfs-bus-iio-resolver-ad2s1210           | 109 ++
 drivers/staging/iio/resolver/Kconfig          |   1 +
 drivers/staging/iio/resolver/ad2s1210.c       | 948 +++++++++++-------
 4 files changed, 857 insertions(+), 351 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/iio/resolver/adi,ad2s1210.yaml
 create mode 100644 drivers/staging/iio/Documentation/sysfs-bus-iio-resolver-ad2s1210

Comments

David Lechner Sept. 21, 2023, 2:26 p.m. UTC | #1
Looks like I got some wrong patches in the get-send-email. These two patches
are included in the series "[v2 00/19] iio: resolver: move ad2s1210
out of staging"
so please disregard this copy of the two patches.

On Thu, Sep 21, 2023 at 4:22 PM David Lechner <dlechner@baylibre.com> wrote:
>
> This adds new phase_lock_range and phase_lock_range_available attributes
> to the ad2s1210 resolver driver. These attributes allow the user to set
> the phase lock range bit in the control register to modify the behavior
> of the resolver to digital converter.
>
> Signed-off-by: David Lechner <dlechner@baylibre.com>
> ---
>  drivers/staging/iio/resolver/ad2s1210.c | 58 +++++++++++++++++++++++++
>  1 file changed, 58 insertions(+)
>
> diff --git a/drivers/staging/iio/resolver/ad2s1210.c b/drivers/staging/iio/resolver/ad2s1210.c
> index 71f0913b7e2e..f5b8b290e860 100644
> --- a/drivers/staging/iio/resolver/ad2s1210.c
> +++ b/drivers/staging/iio/resolver/ad2s1210.c
> @@ -259,6 +259,60 @@ static ssize_t excitation_frequency_store(struct device *dev,
>         return ret;
>  }
>
> +static ssize_t phase_lock_range_show(struct device *dev,
> +                                    struct device_attribute *attr,
> +                                    char *buf)
> +{
> +       struct ad2s1210_state *st = iio_priv(dev_to_iio_dev(dev));
> +       int ret;
> +
> +       mutex_lock(&st->lock);
> +       ret = regmap_test_bits(st->regmap, AD2S1210_REG_CONTROL,
> +                              AD2S1210_PHASE_LOCK_RANGE_44);
> +       if (ret < 0)
> +               goto error_ret;
> +
> +       ret = sprintf(buf, "%d\n", ret ? 44 : 360);
> +
> +error_ret:
> +       mutex_unlock(&st->lock);
> +       return ret;
> +}
> +
> +static ssize_t phase_lock_range_store(struct device *dev,
> +                                     struct device_attribute *attr,
> +                                     const char *buf, size_t len)
> +{
> +       struct ad2s1210_state *st = iio_priv(dev_to_iio_dev(dev));
> +       u16 udata;
> +       int ret;
> +
> +       ret = kstrtou16(buf, 10, &udata);
> +       if (ret < 0 || (udata != 44 && udata != 360))
> +               return -EINVAL;
> +
> +       mutex_lock(&st->lock);
> +
> +       ret = regmap_update_bits(st->regmap, AD2S1210_REG_CONTROL,
> +                                AD2S1210_PHASE_LOCK_RANGE_44,
> +                                udata == 44 ? AD2S1210_PHASE_LOCK_RANGE_44 : 0);
> +       if (ret < 0)
> +               goto error_ret;
> +
> +       ret = len;
> +
> +error_ret:
> +       mutex_unlock(&st->lock);
> +       return ret;
> +}
> +
> +static ssize_t phase_lock_range_available_show(struct device *dev,
> +                                              struct device_attribute *attr,
> +                                              char *buf)
> +{
> +       return sprintf(buf, "44 360\n");
> +}
> +
>  /* read the fault register since last sample */
>  static ssize_t ad2s1210_show_fault(struct device *dev,
>                                    struct device_attribute *attr, char *buf)
> @@ -506,6 +560,8 @@ static int ad2s1210_write_raw(struct iio_dev *indio_dev,
>  }
>
>  static IIO_DEVICE_ATTR_RW(excitation_frequency, 0);
> +static IIO_DEVICE_ATTR_RW(phase_lock_range, 0);
> +static IIO_DEVICE_ATTR_RO(phase_lock_range_available, 0);
>  static IIO_DEVICE_ATTR(fault, 0644,
>                        ad2s1210_show_fault, ad2s1210_clear_fault, 0);
>
> @@ -552,6 +608,8 @@ static const struct iio_chan_spec ad2s1210_channels[] = {
>
>  static struct attribute *ad2s1210_attributes[] = {
>         &iio_dev_attr_excitation_frequency.dev_attr.attr,
> +       &iio_dev_attr_phase_lock_range.dev_attr.attr,
> +       &iio_dev_attr_phase_lock_range_available.dev_attr.attr,
>         &iio_dev_attr_fault.dev_attr.attr,
>         &iio_dev_attr_los_thrd.dev_attr.attr,
>         &iio_dev_attr_dos_ovr_thrd.dev_attr.attr,
> --
> 2.34.1
>