RE: [PATCH v4 5/6] iio: imu: Add support for adis16475

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> From: Andy Shevchenko <andy.shevchenko@xxxxxxxxx>
> Sent: Montag, 6. April 2020 18:20
> To: Sa, Nuno <Nuno.Sa@xxxxxxxxxx>
> Cc: linux-iio <linux-iio@xxxxxxxxxxxxxxx>; devicetree
> <devicetree@xxxxxxxxxxxxxxx>; Jonathan Cameron <jic23@xxxxxxxxxx>;
> Hartmut Knaack <knaack.h@xxxxxx>; Lars-Peter Clausen
> <lars@xxxxxxxxxx>; Peter Meerwald-Stadler <pmeerw@xxxxxxxxxx>; Rob
> Herring <robh+dt@xxxxxxxxxx>; Mark Rutland <mark.rutland@xxxxxxx>;
> Ardelean, Alexandru <alexandru.Ardelean@xxxxxxxxxx>; Hennerich,
> Michael <Michael.Hennerich@xxxxxxxxxx>
> Subject: Re: [PATCH v4 5/6] iio: imu: Add support for adis16475
> 
> On Mon, Apr 6, 2020 at 6:10 PM Nuno Sá <nuno.sa@xxxxxxxxxx> wrote:
> >
> > Support ADIS16475 and similar IMU devices. These devices are
> > a precision, miniature MEMS inertial measurement unit (IMU) that
> > includes a triaxial gyroscope and a triaxial accelerometer. Each
> > inertial sensor combines with signal conditioning that optimizes
> > dynamic performance.
> >
> > The driver adds support for the following devices:
> >  * adis16470, adis16475, adis16477, adis16465, adis16467, adis16500,
> >    adis16505, adis16507.
> 
> ...
> 
> > +       int i = ARRAY_SIZE(adis16475_3db_freqs);
> > +       int ret;
> 
> > +       while (--i)
> > +               if (adis16475_3db_freqs[i] >= filter)
> > +                       break;
> 
> Nit: perhaps {} to add.
> 
Actually thought about that and removed them in the last minute. Will add them again...
> ...
> 
> > +enum adis16475_variant {
> > +       ADIS16470,
> > +       ADIS16475_1,
> > +       ADIS16475_2,
> > +       ADIS16475_3,
> > +       ADIS16477_1,
> > +       ADIS16477_2,
> > +       ADIS16477_3,
> > +       ADIS16465_1,
> > +       ADIS16465_2,
> > +       ADIS16465_3,
> > +       ADIS16467_1,
> > +       ADIS16467_2,
> > +       ADIS16467_3,
> > +       ADIS16500,
> > +       ADIS16505_1,
> > +       ADIS16505_2,
> > +       ADIS16505_3,
> > +       ADIS16507_1,
> > +       ADIS16507_2,
> > +       ADIS16507_3,
> 
> > +
> 
> Extra blank line.
> 

ack

> > +};
> 
> ...
> 
> > +static void adis16475_burst32_check(struct adis16475 *st)
> > +{
> > +       int ret;
> > +       struct adis *adis = &st->adis;
> > +
> > +       if (!st->info->has_burst32)
> > +               return;
> > +
> > +       if (st->lsb_flag && !st->burst32) {
> > +               const u16 en = ADIS16500_BURST32(1);
> > +
> > +               ret = __adis_update_bits(&st->adis, ADIS16475_REG_MSG_CTRL,
> > +                                        ADIS16500_BURST32_MASK, en);
> > +               if (ret)
> > +                       return;
> > +
> > +               st->burst32 = true;
> 
> + Blank line.
>

Can add it. For some reason I like to save blank lines when the next lines are comments...

> > +               /*
> > +                * In 32bit mode we need extra 2 bytes for all gyro
> 
> 32-bit
> 
> > +                * and accel channels.
> > +                */
> > +               adis->burst_extra_len = 6 * sizeof(u16);
> > +               adis->xfer[1].len += 6 * sizeof(u16);
> > +               dev_dbg(&adis->spi->dev, "Enable burst32 mode, xfer:%d",
> > +                       adis->xfer[1].len);
> > +
> > +       } else if (!st->lsb_flag && st->burst32) {
> > +               const u16 en = ADIS16500_BURST32(0);
> > +
> > +               ret = __adis_update_bits(&st->adis, ADIS16475_REG_MSG_CTRL,
> > +                                        ADIS16500_BURST32_MASK, en);
> > +               if (ret)
> > +                       return;
> > +
> > +               st->burst32 = false;
> 
> + Blank line
> 
> > +               /* Remove the extra bits */
> > +               adis->burst_extra_len = 0;
> > +               adis->xfer[1].len -= 6 * sizeof(u16);
> > +               dev_dbg(&adis->spi->dev, "Disable burst32 mode, xfer:%d\n",
> > +                       adis->xfer[1].len);
> > +       }
> > +}
> 
> ...
> 
> > +       for_each_set_bit(bit, indio_dev->active_scan_mask,
> > +                        indio_dev->masklength) {
> 
> One line?
> 

It goes beyond 80 col limit... I know I could initialize these to some local const but...

> > +                               if (st->lsb_flag && !st->info->has_burst32) {
> > +                                       u16 val = 0;
> 
> > +                                       const u32 reg = ADIS16475_REG_X_GYRO_L +
> > +                                               (bit * 4);
> 
> Redundant parentheses.
> 

Definitely...
 
> > +                                       adis_read_reg_16(adis, reg, &val);
> > +                                       data[i++] = cpu_to_be16(val);
> > +                               } else {
> > +                                       /* lower not used */
> > +                                       data[i++] = 0;
> > +                               }
> > +                       }
> > +                       break;
> > +               }
> > +       }
> 
> ...
> 
> > +               if (sync->sync_mode == ADIS16475_SYNC_SCALED) {
> > +                       u16 up_scale;
> > +                       u32 scaled_out_freq = 0;
> > +                       /*
> > +                        * If we are in scaled mode, we must have an up_scale.
> > +                        * In scaled mode the allowable input clock range is
> > +                        * 1 Hz to 128 Hz, and the allowable output range is
> > +                        * 1900 to 2100 Hz. Hence, a scale must be given to
> > +                        * get the allowable output.
> > +                        */
> > +                       device_property_read_u32(dev, "adi,scaled-output-hz",
> > +                                                &scaled_out_freq);
> > +
> > +                       if (scaled_out_freq < 1900 || scaled_out_freq > 2100) {
> > +                               dev_err(dev,
> > +                                       "Invalid value:%u for adi,scaled-output-hz",
> > +                                       scaled_out_freq);
> 
> When there is no property or property has a value 0 this message can't
> tell the difference.
> Perhaps you have to check return code from device_property_read_u32()
> call.
>

Well, I think we don't really need to. If the sync mode is scaled, then this property is mandatory
(and this is stated in the bindings). So, I don't really care if the property is not there or if it's just
a wrong value. We should fail either way and I'm not sure an extra if with some other message will
give us that extra value...

> > +                               return -EINVAL;
> > +                       }
> 
> > +               }
> 
> ...
> 
> > +       /*
> > +        * It is possible to configure the data ready polarity. Furthermore, we
> > +        * need to update the adis struct if we want data ready as active low.
> > +        */
> > +       irq_type = irqd_get_trigger_type(desc);
> > +       if (irq_type == IRQF_TRIGGER_RISING) {
> > +               polarity = 1;
> > +       } else if (irq_type == IRQF_TRIGGER_FALLING) {
> > +               polarity = 0;
> > +               st->adis.irq_flag = IRQF_TRIGGER_FALLING;
> > +       } else {
> > +               dev_err(&spi->dev, "Invalid interrupt type 0x%x specified\n",
> > +                       irq_type);
> > +               return -EINVAL;
> > +       }
> 
> Here is the problem. You got type, but you compare it to flags. It's
> not correct.
> Although values are the same, the meaning is different.
> 

Hmm, thanks! Honestly, this was copy paste from adis16480 and I never realized this. I will
use IRQ_TYPE_EDGE_RISING and IRQ_TYPE_EDGE_FALLING. I guess we need a patch changing this
in adis16480...

Thanks,
- Nuno Sá

> --
> With Best Regards,
> Andy Shevchenko




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux