From: Jonathan Cameron <jic23@kernel.org>
To: Nuno Sa via B4 Relay <devnull+nuno.sa.analog.com@kernel.org>
Cc: nuno.sa@analog.com, linux-iio@vger.kernel.org,
devicetree@vger.kernel.org,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Alexandru Ardelean <alexandru.ardelean@analog.com>,
Lars-Peter Clausen <lars@metafoo.de>,
Michael Hennerich <Michael.Hennerich@analog.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Conor Dooley <conor+dt@kernel.org>,
Olivier Moysan <olivier.moysan@foss.st.com>
Subject: Re: [PATCH 8/8] iio: adc: ad9467: support digital interface calibration
Date: Sat, 20 Apr 2024 16:34:04 +0100 [thread overview]
Message-ID: <20240420163404.0fc01ed5@jic23-huawei> (raw)
In-Reply-To: <20240419-ad9467-new-features-v1-8-3e7628ff6d5e@analog.com>
On Fri, 19 Apr 2024 17:36:51 +0200
Nuno Sa via B4 Relay <devnull+nuno.sa.analog.com@kernel.org> wrote:
> From: Nuno Sa <nuno.sa@analog.com>
>
> To make sure that we have the best timings on the serial data interface
> we should calibrate it. This means going through the device supported
> values and see for which ones we get a successful result. To do that, we
> use a prbs test pattern both in the IIO backend and in the frontend
> devices. Then for each of the test points we see if there are any
> errors. Note that the backend is responsible to look for those errors.
>
> As calibrating the interface also requires that the data format is disabled
> (the one thing being done in ad9467_setup()), ad9467_setup() was removed
> and configuring the data fomat is now part of the calibration process.
>
> Signed-off-by: Nuno Sa <nuno.sa@analog.com>
Trivial comments inline.
Jonathan
> ---
> drivers/iio/adc/ad9467.c | 337 +++++++++++++++++++++++++++++++++++++++++------
> 1 file changed, 296 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/iio/adc/ad9467.c b/drivers/iio/adc/ad9467.c
> index 7db87ccc1ea4..44552dd6f4c6 100644
> --- a/drivers/iio/adc/ad9467.c
> +++ b/drivers/iio/adc/ad9467.c
> @@ -4,6 +4,9 @@
> *
> * Copyright 2012-2020 Analog Devices Inc.
> */
> +
> +#include <linux/bitmap.h>
> +#include <linux/bitops.h>
> #include <linux/cleanup.h>
> #include <linux/module.h>
> #include <linux/mutex.h>
> @@ -100,6 +103,8 @@
> #define AD9467_DEF_OUTPUT_MODE 0x08
> #define AD9467_REG_VREF_MASK 0x0F
>
> +#define AD9647_MAX_TEST_POINTS 32
> +
> struct ad9467_chip_info {
> const char *name;
> unsigned int id;
> @@ -110,6 +115,8 @@ struct ad9467_chip_info {
> unsigned long max_rate;
> unsigned int default_output_mode;
> unsigned int vref_mask;
> + unsigned int num_lanes;
> + bool has_dco;
What is dco? Perhaps a comment, or expand the naming somewhat.
> };
>
> +static void ad9467_dump_table(const unsigned long *err_map, unsigned int size,
> + bool invert)
> +{
> +#ifdef DEBUG
> + unsigned int bit;
> +
> + pr_debug("Dump calibration table:\n");
If it's useful, poke it in debugfs, otherwise, drop this code.
> + for (bit = 0; bit < size; bit++) {
> + if (bit == size / 2) {
> + if (!invert)
> + break;
> + pr_cont("\n");
> + }
> +
> + pr_cont("%c", test_bit(bit, err_map) ? 'x' : 'o');
> + }
> +#endif
> +}
> +
> +static int ad9467_calibrate_apply(const struct ad9467_state *st,
> + unsigned int val)
> +{
> + unsigned int lane;
> + int ret;
> +
> + if (st->info->has_dco) {
> + int ret;
Shadowing ret above.
> +
> + ret = ad9467_spi_write(st->spi, AN877_ADC_REG_OUTPUT_DELAY,
> + val);
> + if (ret)
> + return ret;
> +
> + return ad9467_spi_write(st->spi, AN877_ADC_REG_TRANSFER,
> + AN877_ADC_TRANSFER_SYNC);
> + }
> +
> + for (lane = 0; lane < st->info->num_lanes; lane++) {
> + ret = iio_backend_iodelay_set(st->back, lane, val);
> + if (ret)
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static int ad9467_calibrate(const struct ad9467_state *st)
Some docs on the sequence or a reference would be good.
> +{
> + DECLARE_BITMAP(err_map, AD9647_MAX_TEST_POINTS * 2);
> + unsigned int point, val, inv_val, cnt, inv_cnt = 0;
> + /*
> + * Half of the bitmap is for the inverted signal. The number of test
> + * points is the same though...
> + */
> + unsigned int test_points = AD9647_MAX_TEST_POINTS;
> + unsigned long sample_rate = clk_get_rate(st->clk);
> + struct device *dev = &st->spi->dev;
> + bool invert = false, stat;
> + int ret;
> +
> + ret = ad9647_calibrate_prepare(st);
> + if (ret)
> + return ret;
> +retune:
> + ret = ad9647_calibrate_polarity_set(st, invert);
> + if (ret)
> + return ret;
> +
> + for (point = 0; point < test_points; point++) {
> + ret = ad9467_calibrate_apply(st, point);
> + if (ret)
> + return ret;
> +
> + ret = ad9467_calibrate_status_check(st, &stat);
> + if (ret < 0)
> + return ret;
> +
> + __assign_bit(point + invert * test_points, err_map, stat);
> + }
> +
> + if (!invert) {
> + cnt = ad9467_find_optimal_point(err_map, 0, test_points, &val);
> + /*
> + * We're happy if we find, at least, three good test points in
> + * a row.
> + */
> + if (cnt < 3) {
> + invert = true;
> + goto retune;
> + }
> + } else {
> + inv_cnt = ad9467_find_optimal_point(err_map, test_points,
> + test_points, &inv_val);
> + if (!inv_cnt && !cnt)
> + return -EIO;
> + }
> +
> + ad9467_dump_table(err_map, BITS_PER_TYPE(err_map), invert);
> +
> + if (inv_cnt < cnt) {
> + ret = ad9647_calibrate_polarity_set(st, false);
> + if (ret)
> + return ret;
> + } else {
> + /*
> + * polarity inverted is the last test to run. Hence, there's no
> + * need to re-do any configuration. We just need to "normalize"
> + * the selected value.
> + */
> + val = inv_val - test_points;
> + }
> +
> + if (st->info->has_dco)
> + dev_dbg(dev, "%sDCO 0x%X CLK %lu Hz\n", inv_cnt >= cnt ? "INVERT " : "",
> + val, sample_rate);
> + else
> + dev_dbg(dev, "%sIDELAY 0x%x\n", inv_cnt >= cnt ? "INVERT " : "",
> + val);
> +
> + ret = ad9467_calibrate_apply(st, val);
> + if (ret)
> + return ret;
> +
> + /* finally apply the optimal value */
> + return ad9647_calibrate_stop(st);
> +}
> +
next prev parent reply other threads:[~2024-04-20 15:34 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-19 15:36 [PATCH 0/8] iio: ad9467: support interface tuning Nuno Sa
2024-04-19 15:36 ` Nuno Sa via B4 Relay
2024-04-19 15:36 ` [PATCH 1/8] iio: backend: add API for " Nuno Sa
2024-04-19 15:36 ` Nuno Sa via B4 Relay
2024-04-20 15:00 ` Jonathan Cameron
2024-04-22 15:40 ` Nuno Sá
2024-04-22 17:13 ` Jonathan Cameron
2024-04-23 7:52 ` Nuno Sá
2024-04-28 15:46 ` Jonathan Cameron
2024-04-19 15:36 ` [PATCH 2/8] iio: adc: adi-axi-adc: only error out in major version mismatch Nuno Sa
2024-04-19 15:36 ` Nuno Sa via B4 Relay
2024-04-20 15:02 ` Jonathan Cameron
2024-04-19 15:36 ` [PATCH 3/8] dt-bindings: adc: axi-adc: add clocks property Nuno Sa
2024-04-19 15:36 ` Nuno Sa via B4 Relay
2024-04-19 16:11 ` Krzysztof Kozlowski
2024-04-20 15:04 ` Jonathan Cameron
2024-04-22 15:06 ` Nuno Sá
2024-04-22 17:09 ` Jonathan Cameron
2024-04-19 15:36 ` [PATCH 4/8] iio: adc: axi-adc: make sure AXI clock is enabled Nuno Sa
2024-04-19 15:36 ` Nuno Sa via B4 Relay
2024-04-20 15:04 ` Jonathan Cameron
2024-04-19 15:36 ` [PATCH 5/8] iio: adc: adi-axi-adc: remove regmap max register Nuno Sa
2024-04-19 15:36 ` Nuno Sa via B4 Relay
2024-04-19 15:36 ` [PATCH 6/8] iio: adc: adi-axi-adc: support digital interface calibration Nuno Sa
2024-04-19 15:36 ` Nuno Sa via B4 Relay
2024-04-20 15:13 ` Jonathan Cameron
2024-04-23 7:27 ` Nuno Sá
2024-04-28 15:49 ` Jonathan Cameron
2024-04-19 15:36 ` [PATCH 7/8] iio: adc: ad9467: cache the sample rate Nuno Sa
2024-04-19 15:36 ` Nuno Sa via B4 Relay
2024-04-20 15:19 ` Jonathan Cameron
2024-04-22 15:46 ` Nuno Sá
2024-04-22 17:08 ` Jonathan Cameron
2024-04-19 15:36 ` [PATCH 8/8] iio: adc: ad9467: support digital interface calibration Nuno Sa
2024-04-19 15:36 ` Nuno Sa via B4 Relay
2024-04-20 15:34 ` Jonathan Cameron [this message]
2024-04-23 7:32 ` Nuno Sá
2024-04-20 15:39 ` [PATCH 0/8] iio: ad9467: support interface tuning Jonathan Cameron
-- strict thread matches above, loose matches on Subject: below --
2024-04-20 4:32 [PATCH 8/8] iio: adc: ad9467: support digital interface calibration kernel test robot
2024-04-22 7:24 ` Nuno Sá
2024-04-22 14:09 ` Dan Carpenter
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=20240420163404.0fc01ed5@jic23-huawei \
--to=jic23@kernel.org \
--cc=Jonathan.Cameron@huawei.com \
--cc=Michael.Hennerich@analog.com \
--cc=alexandru.ardelean@analog.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=devnull+nuno.sa.analog.com@kernel.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=nuno.sa@analog.com \
--cc=olivier.moysan@foss.st.com \
--cc=robh@kernel.org \
/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.