linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] iio: gyro: mpu3050: Fix reported temperature value
@ 2021-04-22  3:38 Dmitry Osipenko
       [not found] ` <CAHp75VdkpTqGyHSdYYwYQ-PY2c=pDWeB_-gYKsrA2iX7POPWmQ@mail.gmail.com>
  0 siblings, 1 reply; 6+ messages in thread
From: Dmitry Osipenko @ 2021-04-22  3:38 UTC (permalink / raw)
  To: Linus Walleij, Jonathan Cameron, Lars-Peter Clausen,
	Andy Shevchenko, Maxim Schwalm, Svyatoslav Ryhel
  Cc: linux-iio, linux-kernel

The raw temperature value is a 16-bit signed integer. The sign casting
is missing in the code, which results in a wrong temperature reported
by userspace tools, fix it.

Cc: stable@vger.kernel.org
Fixes: 3904b28efb2c ("iio: gyro: Add driver for the MPU-3050 gyroscope")
Datasheet: https://www.cdiweb.com/datasheets/invensense/mpu-3000a.pdf
Tested-by: Maxim Schwalm <maxim.schwalm@gmail.com> # Asus TF700T
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # Asus TF201
Reported-by: Svyatoslav Ryhel <clamor95@gmail.com>
Reviewed-by: Andy Shevchenko <Andy.Shevchenko@gmail.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---

Changelog:

v2: - Replaced "signed 16bit integer" wording with "16-bit signed integer",
      replaced "Link" tag with the "Datasheet" and added "Fixes" tag as was
      suggested by Andy Shevchenko.

    - Added r-b from Andy Shevchenko and Linus Walleij.

 drivers/iio/gyro/mpu3050-core.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/gyro/mpu3050-core.c b/drivers/iio/gyro/mpu3050-core.c
index ac90be03332a..ce9d1d3687f5 100644
--- a/drivers/iio/gyro/mpu3050-core.c
+++ b/drivers/iio/gyro/mpu3050-core.c
@@ -272,7 +272,16 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
 	case IIO_CHAN_INFO_OFFSET:
 		switch (chan->type) {
 		case IIO_TEMP:
-			/* The temperature scaling is (x+23000)/280 Celsius */
+			/*
+			 * The temperature scaling is (x+23000)/280 Celsius,
+			 * where 23000 includes room temperature offset of
+			 * +35C, 280 is the precision scale and x is the 16-bit
+			 * signed integer which corresponds to the temperature
+			 * range of -40C..85C.
+			 *
+			 * Temperature value itself represents temperature of
+			 * the sensor die.
+			 */
 			*val = 23000;
 			return IIO_VAL_INT;
 		default:
@@ -329,7 +338,7 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
 				goto out_read_raw_unlock;
 			}
 
-			*val = be16_to_cpu(raw_val);
+			*val = (s16)be16_to_cpu(raw_val);
 			ret = IIO_VAL_INT;
 
 			goto out_read_raw_unlock;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] iio: gyro: mpu3050: Fix reported temperature value
       [not found] ` <CAHp75VdkpTqGyHSdYYwYQ-PY2c=pDWeB_-gYKsrA2iX7POPWmQ@mail.gmail.com>
@ 2021-04-22 17:42   ` Dmitry Osipenko
  0 siblings, 0 replies; 6+ messages in thread
From: Dmitry Osipenko @ 2021-04-22 17:42 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Linus Walleij, Jonathan Cameron, Lars-Peter Clausen,
	Maxim Schwalm, Svyatoslav Ryhel, linux-iio, linux-kernel

22.04.2021 09:46, Andy Shevchenko пишет:
>                     case IIO_TEMP:
>     -                       /* The temperature scaling is (x+23000)/280
>     Celsius */
>     +                       /*
>     +                        * The temperature scaling is (x+23000)/280
>     Celsius,
>     +                        * where 23000 includes room temperature
>     offset of
>     +                        * +35C, 280 is the precision scale and x is
>     the 16-bit
>     +                        * signed integer which corresponds to the
>     temperature
>     +                        * range of -40C..85C.
> 
> 
> 
> Datasheet says typical -30°... also think about the other comment you
> gave, I.e. about temperature of the die itself. Are you suggesting that
> at -40° the die T is also -40°?  Does it have perpetuum mobile ? ;) it
> might dissipate not to much energy, but we don’t know the linearity of
> the curve there.

My understanding that -40C is the minimum temperature which sensor may
report.

Alright, I think the comment could be improved a tad anyways. I'll
prepare v3, thanks.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] iio: gyro: mpu3050: Fix reported temperature value
       [not found] ` <CAHp75VcuU_=OxdFo=9cxDtguCTjQ4jQytFzHUb3WoxJgcwDFxA@mail.gmail.com>
@ 2021-04-22  1:20   ` Dmitry Osipenko
  0 siblings, 0 replies; 6+ messages in thread
From: Dmitry Osipenko @ 2021-04-22  1:20 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Linus Walleij, Jonathan Cameron, Lars-Peter Clausen,
	Maxim Schwalm, Svyatoslav Ryhel, linux-iio, linux-kernel

22.04.2021 03:34, Andy Shevchenko пишет:
>     -                       /* The temperature scaling is (x+23000)/280
>     Celsius */
>     +                       /*
>     +                        * The temperature scaling is (x+23000)/280
>     Celsius,
>     +                        * where 23000 includes room temperature
>     offset of
>     +                        * +35C, 280 is the precision scale and x is
>     the signed
>     +                        * 16bit integer which corresponds to the
>     temperature
> 
> 
> “...16-bit signed integer...”
>  
> 
>     +                        * range of -40C..85C.
> 
> 
> 
> Datasheet says -30°C..+85°C.

Datasheet says this for the "Best fit straight line", while the min
value is -40C.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] iio: gyro: mpu3050: Fix reported temperature value
  2021-04-22  0:38 ` Linus Walleij
@ 2021-04-22  1:10   ` Dmitry Osipenko
  0 siblings, 0 replies; 6+ messages in thread
From: Dmitry Osipenko @ 2021-04-22  1:10 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Jonathan Cameron, Lars-Peter Clausen, Andy Shevchenko,
	Maxim Schwalm, Svyatoslav Ryhel, linux-iio, linux-kernel

22.04.2021 03:38, Linus Walleij пишет:
> On Thu, Apr 22, 2021 at 1:49 AM Dmitry Osipenko <digetx@gmail.com> wrote:
> 
>> The raw temperature value is a signed 16bit integer. The sign casting
>> is missed in the code, which results in a wrong temperature reported by
>> userspace tools, fix it.
>>
>> Cc: stable@vger.kernel.org
>> Link: https://www.cdiweb.com/datasheets/invensense/mpu-3000a.pdf
>> Tested-by: Maxim Schwalm <maxim.schwalm@gmail.com> # Asus TF700T
>> Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # Asus TF201
>> Reported-by: Svyatoslav Ryhel <clamor95@gmail.com>
>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> 
> +/- Andy's comments:
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> 
> I never thought this driver would have so many users (3 people signed
> testing it!) but I realize it is more widely deployed than I thought.
> 
> I have totally ignored the MPU3050's ability to act as a "sensor hub"
> and talk to accelerometers and magnetometers directly. I always
> thought it would be better to just route the I2C right through it and
> put Linux in direct control, but I realize this was not Invensese's
> intention. I don't know if it can be actually utilized in some generic
> way, all kernels using that have separate hacky drivers for all the
> sub-sensors duplicating the kernel drivers we already have ...

I don't think that MPU3050 could talk to the sensors behind it directly.
It's has "I2C gate" which allows to route the I2C communication to the
chained sensors, which is done in order to reduce noise on the I2C bus
such that only one sensor is active at a time. Those chained sensors are
working good using upstream kernel drivers, the accelerometer is
particularly useful for display autorotation. Modern DEs like Gnome and
KDE are using iio-sensor-proxy library that knows how to work with the
mainline sensor drivers.

Thank you and Andy for the review, I'll prepare v2.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v1] iio: gyro: mpu3050: Fix reported temperature value
  2021-04-21 23:48 Dmitry Osipenko
@ 2021-04-22  0:38 ` Linus Walleij
  2021-04-22  1:10   ` Dmitry Osipenko
       [not found] ` <CAHp75VcuU_=OxdFo=9cxDtguCTjQ4jQytFzHUb3WoxJgcwDFxA@mail.gmail.com>
  1 sibling, 1 reply; 6+ messages in thread
From: Linus Walleij @ 2021-04-22  0:38 UTC (permalink / raw)
  To: Dmitry Osipenko
  Cc: Jonathan Cameron, Lars-Peter Clausen, Andy Shevchenko,
	Maxim Schwalm, Svyatoslav Ryhel, linux-iio, linux-kernel

On Thu, Apr 22, 2021 at 1:49 AM Dmitry Osipenko <digetx@gmail.com> wrote:

> The raw temperature value is a signed 16bit integer. The sign casting
> is missed in the code, which results in a wrong temperature reported by
> userspace tools, fix it.
>
> Cc: stable@vger.kernel.org
> Link: https://www.cdiweb.com/datasheets/invensense/mpu-3000a.pdf
> Tested-by: Maxim Schwalm <maxim.schwalm@gmail.com> # Asus TF700T
> Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # Asus TF201
> Reported-by: Svyatoslav Ryhel <clamor95@gmail.com>
> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>

+/- Andy's comments:
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>

I never thought this driver would have so many users (3 people signed
testing it!) but I realize it is more widely deployed than I thought.

I have totally ignored the MPU3050's ability to act as a "sensor hub"
and talk to accelerometers and magnetometers directly. I always
thought it would be better to just route the I2C right through it and
put Linux in direct control, but I realize this was not Invensese's
intention. I don't know if it can be actually utilized in some generic
way, all kernels using that have separate hacky drivers for all the
sub-sensors duplicating the kernel drivers we already have ...

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v1] iio: gyro: mpu3050: Fix reported temperature value
@ 2021-04-21 23:48 Dmitry Osipenko
  2021-04-22  0:38 ` Linus Walleij
       [not found] ` <CAHp75VcuU_=OxdFo=9cxDtguCTjQ4jQytFzHUb3WoxJgcwDFxA@mail.gmail.com>
  0 siblings, 2 replies; 6+ messages in thread
From: Dmitry Osipenko @ 2021-04-21 23:48 UTC (permalink / raw)
  To: Linus Walleij, Jonathan Cameron, Lars-Peter Clausen,
	Andy Shevchenko, Maxim Schwalm, Svyatoslav Ryhel
  Cc: linux-iio, linux-kernel

The raw temperature value is a signed 16bit integer. The sign casting
is missed in the code, which results in a wrong temperature reported by
userspace tools, fix it.

Cc: stable@vger.kernel.org
Link: https://www.cdiweb.com/datasheets/invensense/mpu-3000a.pdf
Tested-by: Maxim Schwalm <maxim.schwalm@gmail.com> # Asus TF700T
Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # Asus TF201
Reported-by: Svyatoslav Ryhel <clamor95@gmail.com>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
 drivers/iio/gyro/mpu3050-core.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/gyro/mpu3050-core.c b/drivers/iio/gyro/mpu3050-core.c
index ac90be03332a..9885428ca12e 100644
--- a/drivers/iio/gyro/mpu3050-core.c
+++ b/drivers/iio/gyro/mpu3050-core.c
@@ -272,7 +272,16 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
 	case IIO_CHAN_INFO_OFFSET:
 		switch (chan->type) {
 		case IIO_TEMP:
-			/* The temperature scaling is (x+23000)/280 Celsius */
+			/*
+			 * The temperature scaling is (x+23000)/280 Celsius,
+			 * where 23000 includes room temperature offset of
+			 * +35C, 280 is the precision scale and x is the signed
+			 * 16bit integer which corresponds to the temperature
+			 * range of -40C..85C.
+			 *
+			 * Temperature value itself represents temperature of
+			 * the sensor die.
+			 */
 			*val = 23000;
 			return IIO_VAL_INT;
 		default:
@@ -329,7 +338,7 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
 				goto out_read_raw_unlock;
 			}
 
-			*val = be16_to_cpu(raw_val);
+			*val = (s16)be16_to_cpu(raw_val);
 			ret = IIO_VAL_INT;
 
 			goto out_read_raw_unlock;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-04-22 17:43 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-22  3:38 [PATCH v2] iio: gyro: mpu3050: Fix reported temperature value Dmitry Osipenko
     [not found] ` <CAHp75VdkpTqGyHSdYYwYQ-PY2c=pDWeB_-gYKsrA2iX7POPWmQ@mail.gmail.com>
2021-04-22 17:42   ` [PATCH v1] " Dmitry Osipenko
  -- strict thread matches above, loose matches on Subject: below --
2021-04-21 23:48 Dmitry Osipenko
2021-04-22  0:38 ` Linus Walleij
2021-04-22  1:10   ` Dmitry Osipenko
     [not found] ` <CAHp75VcuU_=OxdFo=9cxDtguCTjQ4jQytFzHUb3WoxJgcwDFxA@mail.gmail.com>
2021-04-22  1:20   ` Dmitry Osipenko

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).