From: Claudiu Beznea <claudiu.beznea@microchip.com> To: <eugen.hristev@microchip.com>, <jic23@kernel.org>, <lars@metafoo.de>, <nicolas.ferre@microchip.com>, <alexandre.belloni@bootlin.com>, <robh+dt@kernel.org>, <krzk+dt@kernel.org>, <ludovic.desroches@atmel.com> Cc: <linux-iio@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>, <devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>, Claudiu Beznea <claudiu.beznea@microchip.com> Subject: [PATCH 02/16] iio: adc: at91-sama5d2_adc: lock around oversampling and sample freq Date: Thu, 9 Jun 2022 11:31:59 +0300 [thread overview] Message-ID: <20220609083213.1795019-3-claudiu.beznea@microchip.com> (raw) In-Reply-To: <20220609083213.1795019-1-claudiu.beznea@microchip.com> .read_raw()/.write_raw() could be called asynchronously from user space or other in kernel drivers. Without locking on st->lock these could be called asynchronously while there is a conversion in progress. Read will be harmless but changing registers while conversion is in progress may lead to inconsistent results. Thus, to avoid this lock st->lock. Fixes: 27e177190891 ("iio:adc:at91_adc8xx: introduce new atmel adc driver") Fixes: 6794e23fa3fe ("iio: adc: at91-sama5d2_adc: add support for oversampling resolution") Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com> --- drivers/iio/adc/at91-sama5d2_adc.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c index 32b6f157b803..a672a520cdc0 100644 --- a/drivers/iio/adc/at91-sama5d2_adc.c +++ b/drivers/iio/adc/at91-sama5d2_adc.c @@ -1542,10 +1542,11 @@ static int at91_adc_read_info_raw(struct iio_dev *indio_dev, ret = at91_adc_read_position(st, chan->channel, &tmp_val); *val = tmp_val; + ret = at91_adc_adjust_val_osr(st, val); mutex_unlock(&st->lock); iio_device_release_direct_mode(indio_dev); - return at91_adc_adjust_val_osr(st, val); + return ret; } if (chan->type == IIO_PRESSURE) { ret = iio_device_claim_direct_mode(indio_dev); @@ -1556,10 +1557,11 @@ static int at91_adc_read_info_raw(struct iio_dev *indio_dev, ret = at91_adc_read_pressure(st, chan->channel, &tmp_val); *val = tmp_val; + ret = at91_adc_adjust_val_osr(st, val); mutex_unlock(&st->lock); iio_device_release_direct_mode(indio_dev); - return at91_adc_adjust_val_osr(st, val); + return ret; } /* in this case we have a voltage channel */ @@ -1620,11 +1622,15 @@ static int at91_adc_read_raw(struct iio_dev *indio_dev, return IIO_VAL_FRACTIONAL_LOG2; case IIO_CHAN_INFO_SAMP_FREQ: + mutex_lock(&st->lock); *val = at91_adc_get_sample_freq(st); + mutex_unlock(&st->lock); return IIO_VAL_INT; case IIO_CHAN_INFO_OVERSAMPLING_RATIO: + mutex_lock(&st->lock); *val = st->oversampling_ratio; + mutex_unlock(&st->lock); return IIO_VAL_INT; default: @@ -1644,18 +1650,23 @@ static int at91_adc_write_raw(struct iio_dev *indio_dev, (val != AT91_OSR_16SAMPLES)) return -EINVAL; /* if no change, optimize out */ + mutex_lock(&st->lock); if (val == st->oversampling_ratio) - return 0; + goto unlock; st->oversampling_ratio = val; /* update ratio */ at91_adc_config_emr(st); +unlock: + mutex_unlock(&st->lock); return 0; case IIO_CHAN_INFO_SAMP_FREQ: if (val < st->soc_info.min_sample_rate || val > st->soc_info.max_sample_rate) return -EINVAL; + mutex_lock(&st->lock); at91_adc_setup_samp_freq(indio_dev, val); + mutex_unlock(&st->lock); return 0; default: return -EINVAL; -- 2.34.1
WARNING: multiple messages have this Message-ID (diff)
From: Claudiu Beznea <claudiu.beznea@microchip.com> To: <eugen.hristev@microchip.com>, <jic23@kernel.org>, <lars@metafoo.de>, <nicolas.ferre@microchip.com>, <alexandre.belloni@bootlin.com>, <robh+dt@kernel.org>, <krzk+dt@kernel.org>, <ludovic.desroches@atmel.com> Cc: <linux-iio@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>, <devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>, Claudiu Beznea <claudiu.beznea@microchip.com> Subject: [PATCH 02/16] iio: adc: at91-sama5d2_adc: lock around oversampling and sample freq Date: Thu, 9 Jun 2022 11:31:59 +0300 [thread overview] Message-ID: <20220609083213.1795019-3-claudiu.beznea@microchip.com> (raw) In-Reply-To: <20220609083213.1795019-1-claudiu.beznea@microchip.com> .read_raw()/.write_raw() could be called asynchronously from user space or other in kernel drivers. Without locking on st->lock these could be called asynchronously while there is a conversion in progress. Read will be harmless but changing registers while conversion is in progress may lead to inconsistent results. Thus, to avoid this lock st->lock. Fixes: 27e177190891 ("iio:adc:at91_adc8xx: introduce new atmel adc driver") Fixes: 6794e23fa3fe ("iio: adc: at91-sama5d2_adc: add support for oversampling resolution") Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com> --- drivers/iio/adc/at91-sama5d2_adc.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c index 32b6f157b803..a672a520cdc0 100644 --- a/drivers/iio/adc/at91-sama5d2_adc.c +++ b/drivers/iio/adc/at91-sama5d2_adc.c @@ -1542,10 +1542,11 @@ static int at91_adc_read_info_raw(struct iio_dev *indio_dev, ret = at91_adc_read_position(st, chan->channel, &tmp_val); *val = tmp_val; + ret = at91_adc_adjust_val_osr(st, val); mutex_unlock(&st->lock); iio_device_release_direct_mode(indio_dev); - return at91_adc_adjust_val_osr(st, val); + return ret; } if (chan->type == IIO_PRESSURE) { ret = iio_device_claim_direct_mode(indio_dev); @@ -1556,10 +1557,11 @@ static int at91_adc_read_info_raw(struct iio_dev *indio_dev, ret = at91_adc_read_pressure(st, chan->channel, &tmp_val); *val = tmp_val; + ret = at91_adc_adjust_val_osr(st, val); mutex_unlock(&st->lock); iio_device_release_direct_mode(indio_dev); - return at91_adc_adjust_val_osr(st, val); + return ret; } /* in this case we have a voltage channel */ @@ -1620,11 +1622,15 @@ static int at91_adc_read_raw(struct iio_dev *indio_dev, return IIO_VAL_FRACTIONAL_LOG2; case IIO_CHAN_INFO_SAMP_FREQ: + mutex_lock(&st->lock); *val = at91_adc_get_sample_freq(st); + mutex_unlock(&st->lock); return IIO_VAL_INT; case IIO_CHAN_INFO_OVERSAMPLING_RATIO: + mutex_lock(&st->lock); *val = st->oversampling_ratio; + mutex_unlock(&st->lock); return IIO_VAL_INT; default: @@ -1644,18 +1650,23 @@ static int at91_adc_write_raw(struct iio_dev *indio_dev, (val != AT91_OSR_16SAMPLES)) return -EINVAL; /* if no change, optimize out */ + mutex_lock(&st->lock); if (val == st->oversampling_ratio) - return 0; + goto unlock; st->oversampling_ratio = val; /* update ratio */ at91_adc_config_emr(st); +unlock: + mutex_unlock(&st->lock); return 0; case IIO_CHAN_INFO_SAMP_FREQ: if (val < st->soc_info.min_sample_rate || val > st->soc_info.max_sample_rate) return -EINVAL; + mutex_lock(&st->lock); at91_adc_setup_samp_freq(indio_dev, val); + mutex_unlock(&st->lock); return 0; default: return -EINVAL; -- 2.34.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-06-09 8:30 UTC|newest] Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-06-09 8:31 [PATCH 00/16] iio: adc: at91-sama5d2_adc: add support for temperature sensor Claudiu Beznea 2022-06-09 8:31 ` Claudiu Beznea 2022-06-09 8:31 ` [PATCH 01/16] iio: adc: at91-sama5d2_adc: fix AT91_SAMA5D2_MR_TRACKTIM_MAX Claudiu Beznea 2022-06-09 8:31 ` Claudiu Beznea 2022-06-09 8:31 ` Claudiu Beznea [this message] 2022-06-09 8:31 ` [PATCH 02/16] iio: adc: at91-sama5d2_adc: lock around oversampling and sample freq Claudiu Beznea 2022-06-11 17:30 ` Jonathan Cameron 2022-06-11 17:30 ` Jonathan Cameron 2022-06-14 8:19 ` Claudiu.Beznea 2022-06-14 8:19 ` Claudiu.Beznea 2022-06-09 8:32 ` [PATCH 03/16] iio: adc: at91-sama5d2_adc: exit from write_raw() when buffers are enabled Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-11 17:33 ` Jonathan Cameron 2022-06-11 17:33 ` Jonathan Cameron 2022-06-14 8:19 ` Claudiu.Beznea 2022-06-14 8:19 ` Claudiu.Beznea 2022-06-09 8:32 ` [PATCH 04/16] iio: adc: at91-sama5d2_adc: handle different EMR.OSR for different hw versions Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-11 17:46 ` Jonathan Cameron 2022-06-11 17:46 ` Jonathan Cameron 2022-06-14 8:20 ` Claudiu.Beznea 2022-06-14 8:20 ` Claudiu.Beznea 2022-06-09 8:32 ` [PATCH 05/16] iio: adc: at91-sama5d2_adc: adjust osr based on specific platform data Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-09 8:32 ` [PATCH 06/16] iio: adc: at91-sama5d2_adc: add 64 and 256 oversampling ratio Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-11 17:47 ` Jonathan Cameron 2022-06-11 17:47 ` Jonathan Cameron 2022-06-14 8:22 ` Claudiu.Beznea 2022-06-14 8:22 ` Claudiu.Beznea 2022-06-09 8:32 ` [PATCH 07/16] iio: adc: at91-sama5d2_adc: simplify the code in at91_adc_read_info_raw() Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-11 17:54 ` Jonathan Cameron 2022-06-11 17:54 ` Jonathan Cameron 2022-06-14 8:49 ` Claudiu.Beznea 2022-06-14 8:49 ` Claudiu.Beznea 2022-06-14 12:00 ` Jonathan Cameron 2022-06-14 12:00 ` Jonathan Cameron 2022-06-09 8:32 ` [PATCH 08/16] iio: adc: at91-sama5d2_adc: move oversampling storage in its function Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-09 8:32 ` [PATCH 09/16] iio: adc: at91-sama5d2_adc: update trackx on emr Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-09 8:32 ` [PATCH 10/16] iio: adc: at91-sama5d2_adc: add startup and tracktim as parameter for at91_adc_setup_samp_freq() Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-09 8:32 ` [PATCH 11/16] iio: adc: at91-sama5d2_adc: add locking parameter to at91_adc_read_info_raw() Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-11 17:58 ` Jonathan Cameron 2022-06-11 17:58 ` Jonathan Cameron 2022-06-14 8:50 ` Claudiu.Beznea 2022-06-14 8:50 ` Claudiu.Beznea 2022-06-14 12:02 ` Jonathan Cameron 2022-06-14 12:02 ` Jonathan Cameron 2022-06-09 8:32 ` [PATCH 12/16] dt-bindings: iio: adc: at91-sama5d2_adc: add id for temperature channel Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-16 16:00 ` Rob Herring 2022-06-16 16:00 ` Rob Herring 2022-06-09 8:32 ` [PATCH 13/16] iio: adc: at91-sama5d2_adc: add support for temperature sensor Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-11 18:15 ` Jonathan Cameron 2022-06-11 18:15 ` Jonathan Cameron 2022-06-14 10:13 ` Claudiu.Beznea 2022-06-14 10:13 ` Claudiu.Beznea 2022-06-14 12:10 ` Jonathan Cameron 2022-06-14 12:10 ` Jonathan Cameron 2022-06-09 8:32 ` [PATCH 14/16] iio: adc: at91-sama5d2_adc: add empty line after functions Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-09 8:32 ` [PATCH 15/16] iio: adc: at91-sama5d2_adc: add runtime pm support Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-11 16:48 ` Jonathan Cameron 2022-06-11 16:48 ` Jonathan Cameron 2022-06-14 10:40 ` Claudiu.Beznea 2022-06-14 10:40 ` Claudiu.Beznea 2022-06-14 12:14 ` Jonathan Cameron 2022-06-14 12:14 ` Jonathan Cameron 2022-06-09 8:32 ` [PATCH 16/16] iio: adc: at91-sama5d2_adc: use pm_ptr() Claudiu Beznea 2022-06-09 8:32 ` Claudiu Beznea 2022-06-11 16:40 ` Jonathan Cameron 2022-06-11 16:40 ` Jonathan Cameron 2022-06-11 18:16 ` [PATCH 00/16] iio: adc: at91-sama5d2_adc: add support for temperature sensor Jonathan Cameron 2022-06-11 18:16 ` Jonathan Cameron 2022-06-14 10:41 ` Claudiu.Beznea 2022-06-14 10:41 ` Claudiu.Beznea
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=20220609083213.1795019-3-claudiu.beznea@microchip.com \ --to=claudiu.beznea@microchip.com \ --cc=alexandre.belloni@bootlin.com \ --cc=devicetree@vger.kernel.org \ --cc=eugen.hristev@microchip.com \ --cc=jic23@kernel.org \ --cc=krzk+dt@kernel.org \ --cc=lars@metafoo.de \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-iio@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=ludovic.desroches@atmel.com \ --cc=nicolas.ferre@microchip.com \ --cc=robh+dt@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: linkBe 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.