From: Jonathan Cameron <jic23@kernel.org>
To: Akinobu Mita <akinobu.mita@gmail.com>
Cc: linux-iio@vger.kernel.org, daniel.baluta@gmail.com
Subject: Re: [PATCH 5/8] iio: adc: ti-ads1015: avoid getting stale result after runtime resume
Date: Sat, 15 Jul 2017 13:25:45 +0100 [thread overview]
Message-ID: <20170715132545.437ede29@kernel.org> (raw)
In-Reply-To: <1499877124-21658-6-git-send-email-akinobu.mita@gmail.com>
On Thu, 13 Jul 2017 01:32:01 +0900
Akinobu Mita <akinobu.mita@gmail.com> wrote:
> This driver assumes that the device is operating in the continuous
> conversion mode which performs the conversion continuously. So this driver
> doesn't insert a wait time before reading the conversion register if the
> configuration is not changed from a previous request.
>
> This assumption is broken if the device is runtime suspended and entered
> a power-down state. The forthcoming request causes reading a stale result
> from the conversion register as the device is runtime resumed just before.
>
> Fix it by adding a flag to detect that condition and insert a necessary
> wait time.
>
> Cc: Daniel Baluta <daniel.baluta@intel.com>
> Cc: Jonathan Cameron <jic23@kernel.org>
> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Another one that wants to be near the head of the series as a fix
that we want to get into stable.
Good catch.
Jonathan
> ---
> drivers/iio/adc/ti-ads1015.c | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
> index 984d4bb..f5f256a 100644
> --- a/drivers/iio/adc/ti-ads1015.c
> +++ b/drivers/iio/adc/ti-ads1015.c
> @@ -177,6 +177,12 @@ struct ads1015_data {
> struct ads1015_channel_data channel_data[ADS1015_CHANNELS];
>
> unsigned int *data_rate;
> + /*
> + * Set to true when the ADC is switched to the continuous-conversion
> + * mode and exits from a power-down state. This flag is used to avoid
> + * getting the stale result from the conversion register.
> + */
> + bool conv_invalid;
> };
>
> static bool ads1015_is_writeable_reg(struct device *dev, unsigned int reg)
> @@ -255,9 +261,10 @@ int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
> if (ret < 0)
> return ret;
>
> - if (change) {
> + if (change || data->conv_invalid) {
> conv_time = DIV_ROUND_UP(USEC_PER_SEC, data->data_rate[dr]);
> usleep_range(conv_time, conv_time + 1);
> + data->conv_invalid = false;
> }
>
> return regmap_read(data->regmap, ADS1015_CONV_REG, val);
> @@ -625,6 +632,8 @@ static int ads1015_probe(struct i2c_client *client,
> if (ret)
> return ret;
>
> + data->conv_invalid = true;
> +
> ret = pm_runtime_set_active(&client->dev);
> if (ret)
> goto err_buffer_cleanup;
> @@ -676,8 +685,13 @@ static int ads1015_runtime_resume(struct device *dev)
> {
> struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
> struct ads1015_data *data = iio_priv(indio_dev);
> + int ret;
>
> - return ads1015_set_conv_mode(data, ADS1015_CONTINUOUS);
> + ret = ads1015_set_conv_mode(data, ADS1015_CONTINUOUS);
> + if (!ret)
> + data->conv_invalid = true;
> +
> + return ret;
> }
> #endif
>
next prev parent reply other threads:[~2017-07-15 12:25 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-12 16:31 [PATCH 0/8] iio: adc: ti-ads1015: fixes, cleanups, and threshold event support Akinobu Mita
2017-07-12 16:31 ` [PATCH 1/8] iio: adc: ti-ads1015: fix incorrect data rate setting update Akinobu Mita
2017-07-15 12:16 ` Jonathan Cameron
2017-07-12 16:31 ` [PATCH 2/8] iio: adc: ti-ads1015: remove unnecessary config register update Akinobu Mita
2017-07-15 12:19 ` Jonathan Cameron
2017-07-12 16:31 ` [PATCH 3/8] iio: adc: ti-ads1015: fix scale information for ADS1115 Akinobu Mita
2017-07-15 12:21 ` Jonathan Cameron
2017-07-12 16:32 ` [PATCH 4/8] iio: adc: ti-ads1015: enable conversion when CONFIG_PM is not set Akinobu Mita
2017-07-15 12:24 ` Jonathan Cameron
2017-07-12 16:32 ` [PATCH 5/8] iio: adc: ti-ads1015: avoid getting stale result after runtime resume Akinobu Mita
2017-07-15 12:25 ` Jonathan Cameron [this message]
2017-07-12 16:32 ` [PATCH 6/8] iio: adc: ti-ads1015: use devm_iio_triggered_buffer_setup Akinobu Mita
2017-07-15 12:28 ` Jonathan Cameron
2017-07-16 16:02 ` Akinobu Mita
2017-07-17 11:52 ` Jonathan Cameron
2017-07-12 16:32 ` [PATCH 7/8] iio: adc: ti-ads1015: use iio_device_claim_direct_mode() Akinobu Mita
2017-07-15 12:30 ` Jonathan Cameron
2017-07-12 16:32 ` [PATCH 8/8] iio: adc: ti-ads1015: add threshold event support Akinobu Mita
2017-07-15 12:45 ` Jonathan Cameron
2017-07-17 16:45 ` Akinobu Mita
2017-07-17 20:35 ` Jonathan Cameron
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=20170715132545.437ede29@kernel.org \
--to=jic23@kernel.org \
--cc=akinobu.mita@gmail.com \
--cc=daniel.baluta@gmail.com \
--cc=linux-iio@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).