[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAHp75Vdr+Uo2uw3mzYP+LMRgp-eyi+YjG=O+wGVqyYx-+MRCaw@mail.gmail.com>
Date: Tue, 21 Jul 2020 22:46:34 +0300
From: Andy Shevchenko <andy.shevchenko@...il.com>
To: Nishant Malpani <nish.malpani25@...il.com>
Cc: Jonathan Cameron <jic23@...nel.org>,
"Bogdan, Dragos" <dragos.bogdan@...log.com>,
darius.berghe@...log.com,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
linux-iio <linux-iio@...r.kernel.org>
Subject: Re: [PATCH v2 1/2] iio: gyro: Add driver support for ADXRS290
On Tue, Jul 21, 2020 at 9:20 PM Nishant Malpani
<nish.malpani25@...il.com> wrote:
>
> ADXRS290 is a high performance MEMS pitch and roll (dual-axis in-plane)
> angular rate sensor (gyroscope) designed for use in stabilization
> applications. It also features an internal temperature sensor and
> programmable high-pass and low-pass filters.
>
> Add support for ADXRS290 in direct-access mode for now.
> Datasheet:
> Link: https://www.analog.com/media/en/technical-documentation/data-sheets/ADXRS290.pdf
Drop that 'Link:' part and followed blank line, so get something like
Datasheet: https://...
Signed-off-by: ...
> Signed-off-by: Nishant Malpani <nish.malpani25@...il.com>
...
> +config ADXRS290
> + tristate "Analog Devices ADXRS290 Dual-Axis MEMS Gyroscope SPI driver"
> + depends on SPI
> + help
> + Say yes here to build support for Analog Devices ADXRS290 programmable
> + digital output gyroscope.
> +
> + This driver can also be built as a module. If so, the module will be
> + called adxrs290.
> +enum adxrs290_mode {
> + STANDBY,
> + MEASUREMENT,
> +};
> +struct adxrs290_state {
> + struct spi_device *spi;
> + /* Serialize reads and their subsequent processing */
> + struct mutex lock;
> + enum adxrs290_mode mode;
> + unsigned int lpf_3db_freq_idx;
> + unsigned int hpf_3db_freq_idx;
> +};
...
> +/*
> + * Available cut-off frequencies of the low pass filter in Hz.
> + * The integer part and fractional part are represented separately.
> + */
> +static const int adxrs290_lpf_3db_freq_tbl[][2] = {
What about adxrs290_lpf_3db_freq_hz_table ?
> +};
> +
> +/*
> + * Available cut-off frequencies of the high pass filter in Hz.
> + * The integer part and fractional part are represented separately.
> + */
> +static const int adxrs290_hpf_3db_freq_tbl[][2] = {
Ditto.
> +};
...
> +static int adxrs290_get_rate_data(struct iio_dev *indio_dev, const u8 cmd,
> + unsigned int *val)
> +{
> + struct adxrs290_state *st = iio_priv(indio_dev);
> + int ret = 0;
Purpose of this?
> + u16 temp;
> +
> + mutex_lock(&st->lock);
> + temp = spi_w8r16(st->spi, cmd);
> + if (temp < 0) {
How can this ever happen?
> + ret = temp;
> + goto err_unlock;
> + }
> +
> + *val = temp;
> +
> +err_unlock:
> + mutex_unlock(&st->lock);
> + return ret;
> +}
Ditto for the rest of the similar cases.
...
> + case IIO_CHAN_INFO_SCALE:
> + switch (chan->type) {
> + case IIO_ANGL_VEL:
> + *val = 0;
> + *val2 = 87266;
Magic!
> + return IIO_VAL_INT_PLUS_NANO;
> + case IIO_TEMP:
> + *val = 100;
Magic!
> + return IIO_VAL_INT;
> + default:
> + return -EINVAL;
> + }
...
> + *vals = (const int *)adxrs290_lpf_3db_freq_tbl;
Why casting?
...
> + *vals = (const int *)adxrs290_hpf_3db_freq_tbl;
Ditto.
...
> + struct iio_dev *indio_dev;
> + struct adxrs290_state *st;
> + int ret;
> + u8 val, val2;
Swap them to have in reversed spruce tree order.
...
> + indio_dev->dev.parent = &spi->dev;
Do you need this?
> + /* max transition time to measurement mode */
> + msleep_interruptible(ADXRS290_MAX_TRANSITION_TIME_MS);
I'm not sure what the point of interruptible variant here?
...
> +static const struct of_device_id adxrs290_of_match[] = {
> + { .compatible = "adi,adxrs290" },
> + { },
No comma here!
> +};
--
With Best Regards,
Andy Shevchenko
Powered by blists - more mailing lists