Re: [PATCH v3 21/27] staging: iio: resolver: ad2s1210: convert LOT threshold attrs to event attrs

From: Jonathan Cameron
Date: Sat Sep 30 2023 - 11:29:28 EST


On Fri, 29 Sep 2023 12:23:26 -0500
David Lechner <dlechner@xxxxxxxxxxxx> wrote:

> From: David Lechner <david@xxxxxxxxxxxxxx>
>
> From: David Lechner <dlechner@xxxxxxxxxxxx>
>
> The AD2S1210 monitors the internal error signal (difference between
> estimated angle and measured angle) to determine a loss of position
> tracking (LOT) condition. When the error value exceeds a threshold, a
> fault is triggered. This threshold is user-configurable.
>
> This patch converts the custom lot_high_thrd and lot_low_thrd attributes
> in the ad2s1210 driver to standard event attributes. This will allow
> tooling to be able to expose these in a generic way.
>
> Since the low threshold determines the hysteresis, it requires some
> special handling to expose the difference between the high and low
> register values as the hysteresis instead of exposing the low register
> value directly.
>
> The attributes also return the values in radians now as required by the
> ABI.
>
> Actually emitting the fault event will be done in a later patch.
>
> Signed-off-by: David Lechner <dlechner@xxxxxxxxxxxx>
> ---

A style comment inline. Otherwise this an any patches before it I skipped
commenting on look fine to me.


> +
> +static int ad2s1210_get_lot_low_threshold(struct ad2s1210_state *st,
> + int *val, int *val2)
> +{
> + unsigned int high_reg_val, low_reg_val;
> + int ret;
> +
> + mutex_lock(&st->lock);
> + ret = regmap_read(st->regmap, AD2S1210_REG_LOT_HIGH_THRD, &high_reg_val);
> + if (ret < 0)
> + goto error_ret;
> +
> + ret = regmap_read(st->regmap, AD2S1210_REG_LOT_LOW_THRD, &low_reg_val);
> +
A separate error path is going to be easier to read.

return IIO_VAL_INT_PLUS_MICRO;

error_ret:
mutex_unlock(&st->lock);

return ret;

Of make use of the new stuff in cleanup.h etc. something like.

scoped_guard(mutex)(&st->lock) {
ret = regmap_read(st->regmap, ...)
if (ret)
return ret;

ret = regmap_read(...)
if (ret)
return ret;
}

/* sysfs value is hysteresis rather than actual low value */

In general you could make could use o
guard(mutex)(&st->lock);
in the other functions where you hold the lock to the end of the function.

Could do that as a follow on patch though and as that stuff is all
very new, I'm not going to mind if you don't want to use it at all and
just use the approach above.

> +error_ret:
> + mutex_unlock(&st->lock);
> +
> + if (ret < 0)
> + return ret;
> +
> + /* sysfs value is hysteresis rather than actual low value */
> + *val = 0;
> + *val2 = (high_reg_val - low_reg_val) *
> + ad2s1210_lot_threshold_urad_per_lsb[st->resolution];
> + return IIO_VAL_INT_PLUS_MICRO;
> +}
> +
> +static int ad2s1210_set_lot_low_threshold(struct ad2s1210_state *st,
> + int val, int val2)
> +{
> + unsigned int reg_val, hysteresis;
> + int ret;
> +
> + /* all valid values are between 0 and pi/4 radians */
> + if (val != 0)
> + return -EINVAL;
> +
> + hysteresis = val2 / ad2s1210_lot_threshold_urad_per_lsb[st->resolution];
> +
> + mutex_lock(&st->lock);
> + ret = regmap_read(st->regmap, AD2S1210_REG_LOT_HIGH_THRD, &reg_val);
> + if (ret < 0)
> + goto error_ret;
> +
> + ret = regmap_write(st->regmap, AD2S1210_REG_LOT_LOW_THRD,
> + reg_val - hysteresis);
> +
> +error_ret:
> + mutex_unlock(&st->lock);
> +
> + return ret;
> +}
>