* [PATCH] iio: addac: ad74413r: update channel function set
@ 2023-09-11 14:29 Antoniu Miclaus
2023-09-13 19:09 ` Jonathan Cameron
0 siblings, 1 reply; 2+ messages in thread
From: Antoniu Miclaus @ 2023-09-11 14:29 UTC (permalink / raw)
To: jic23, linux-iio, linux-kernel; +Cc: Antoniu Miclaus
According to the datasheet switching to a new channel function implies
multiple steps.
All functions must be selected for a minimum of 130 μs before changing
to another function.
The DAC_CODEx registers are not reset by changing channel functions.
Prior to changing channel functions, it is recommended to set the DAC
code to 0x0000 via the DAC_CODEx registers. Set the channel function
to high impedance via the CH_FUNC_SETUPx registers before transitioning
to the new channel function. After the new channel function is configured,
it is recommended to wait 150 μs before updating the DAC code.
Even though the channel switch is done at only at probe, where a device
reset is performed, that does not guarantee that the steps prior
changing to new channel function should be neglected.
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
drivers/iio/addac/ad74413r.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/drivers/iio/addac/ad74413r.c b/drivers/iio/addac/ad74413r.c
index 6b0e8218f150..7b9ebb481815 100644
--- a/drivers/iio/addac/ad74413r.c
+++ b/drivers/iio/addac/ad74413r.c
@@ -441,12 +441,30 @@ static int ad74413r_set_channel_function(struct ad74413r_state *st,
{
int ret;
+ ret = regmap_update_bits(st->regmap,
+ AD74413R_REG_CH_FUNC_SETUP_X(channel),
+ AD74413R_CH_FUNC_SETUP_MASK,
+ CH_FUNC_HIGH_IMPEDANCE);
+ if (ret)
+ return ret;
+
+ /* Set DAC code to 0 prior to changing channel function */
+ ret = ad74413r_set_channel_dac_code(st, channel, 0);
+ if (ret)
+ return ret;
+
+ /* Delay required before transition to new desired mode */
+ usleep_range(130, 150);
+
ret = regmap_update_bits(st->regmap,
AD74413R_REG_CH_FUNC_SETUP_X(channel),
AD74413R_CH_FUNC_SETUP_MASK, func);
if (ret)
return ret;
+ /* Delay required before updating the new DAC code */
+ usleep_range(150, 170);
+
if (func == CH_FUNC_CURRENT_INPUT_LOOP_POWER)
ret = regmap_set_bits(st->regmap,
AD74413R_REG_ADC_CONFIG_X(channel),
--
2.42.0
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] iio: addac: ad74413r: update channel function set
2023-09-11 14:29 [PATCH] iio: addac: ad74413r: update channel function set Antoniu Miclaus
@ 2023-09-13 19:09 ` Jonathan Cameron
0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Cameron @ 2023-09-13 19:09 UTC (permalink / raw)
To: Antoniu Miclaus; +Cc: linux-iio, linux-kernel
On Mon, 11 Sep 2023 17:29:50 +0300
Antoniu Miclaus <antoniu.miclaus@analog.com> wrote:
> According to the datasheet switching to a new channel function implies
> multiple steps.
>
> All functions must be selected for a minimum of 130 μs before changing
> to another function.
> The DAC_CODEx registers are not reset by changing channel functions.
> Prior to changing channel functions, it is recommended to set the DAC
> code to 0x0000 via the DAC_CODEx registers. Set the channel function
> to high impedance via the CH_FUNC_SETUPx registers before transitioning
> to the new channel function. After the new channel function is configured,
> it is recommended to wait 150 μs before updating the DAC code.
>
> Even though the channel switch is done at only at probe, where a device
> reset is performed, that does not guarantee that the steps prior
> changing to new channel function should be neglected.
>
> Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
Given description and lack of fixes tag, I'm not treating this as a fix.
Let me know if I should and provide a fixes tag in reply to this therad.
Applied to the togreg branch of iio.git and pushed out as testing.
Thanks,
Jonathan
> ---
> drivers/iio/addac/ad74413r.c | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
>
> diff --git a/drivers/iio/addac/ad74413r.c b/drivers/iio/addac/ad74413r.c
> index 6b0e8218f150..7b9ebb481815 100644
> --- a/drivers/iio/addac/ad74413r.c
> +++ b/drivers/iio/addac/ad74413r.c
> @@ -441,12 +441,30 @@ static int ad74413r_set_channel_function(struct ad74413r_state *st,
> {
> int ret;
>
> + ret = regmap_update_bits(st->regmap,
> + AD74413R_REG_CH_FUNC_SETUP_X(channel),
> + AD74413R_CH_FUNC_SETUP_MASK,
> + CH_FUNC_HIGH_IMPEDANCE);
> + if (ret)
> + return ret;
> +
> + /* Set DAC code to 0 prior to changing channel function */
> + ret = ad74413r_set_channel_dac_code(st, channel, 0);
> + if (ret)
> + return ret;
> +
> + /* Delay required before transition to new desired mode */
> + usleep_range(130, 150);
> +
> ret = regmap_update_bits(st->regmap,
> AD74413R_REG_CH_FUNC_SETUP_X(channel),
> AD74413R_CH_FUNC_SETUP_MASK, func);
> if (ret)
> return ret;
>
> + /* Delay required before updating the new DAC code */
> + usleep_range(150, 170);
> +
> if (func == CH_FUNC_CURRENT_INPUT_LOOP_POWER)
> ret = regmap_set_bits(st->regmap,
> AD74413R_REG_ADC_CONFIG_X(channel),
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-09-13 19:09 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-11 14:29 [PATCH] iio: addac: ad74413r: update channel function set Antoniu Miclaus
2023-09-13 19:09 ` Jonathan Cameron
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox