Re: [PATCH v2 2/3] iio: pressure: Add driver for Sensirion SDP500

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

 



On Mon, 10 Jun 2024 10:58:35 +0200
Petar Stoykov <pd.pstoykov@xxxxxxxxx> wrote:

> On Sun, May 5, 2024 at 7:18 PM Jonathan Cameron <jic23@xxxxxxxxxx> wrote:
> >
> > On Tue, 30 Apr 2024 17:27:24 +0200
> > Petar Stoykov <pd.pstoykov@xxxxxxxxx> wrote:
> >  
> > > From 6ae7537517f551540121ca6fb3b99080b7580410 Mon Sep 17 00:00:00 2001
> > > From: Petar Stoykov <pd.pstoykov@xxxxxxxxx>
> > > Date: Mon, 15 Jan 2024 12:21:26 +0100
> > > Subject: [PATCH 2/3] iio: pressure: Add driver for Sensirion SDP500
> > >
> > > Sensirion SDP500 is a digital differential pressure sensor. The sensor is
> > > accessed over I2C.
> > >
> > > Signed-off-by: Petar Stoykov <pd.pstoykov@xxxxxxxxx>  
> > Hi Petar
> >
> > Ignoring the patch formatting which others have already given feedback on,
> > a few minor comments inline.
> >
> > Also, I'd expect some regulator handling to turn the power on.
> > Obviously on your particular board there may be nothing to do but good to
> > have the support in place anyway and it will be harmless if the power
> > is always on.
> >
> > Jonathan
> >  
> Hi Jonathan,
> 
> Thank you for looking past the formatting!
> 
> I wrongly assumed the power regulator would be handled automatically :)
> I see examples of how to do it in other pressure drivers now.
> 
> > >  st_pressure-$(CONFIG_IIO_BUFFER) += st_pressure_buffer.o
> > > diff --git a/drivers/iio/pressure/sdp500.c b/drivers/iio/pressure/sdp500.c
> > > new file mode 100644
> > > index 000000000000..7efcc69e829c
> > > --- /dev/null
> > > +++ b/drivers/iio/pressure/sdp500.c
> > > @@ -0,0 +1,144 @@
> > > +// SPDX-License-Identifier: GPL-2.0-only
> > > +#include <linux/i2c.h>
> > > +#include <linux/crc8.h>
> > > +#include <linux/iio/iio.h>
> > > +#include <asm/unaligned.h>
> > > +
> > > +#define SDP500_CRC8_POLYNOMIAL  0x31   // x8 + x5 + x4 + 1 (normalized to 0x31)
> > > +#define SDP500_READ_SIZE        3
> > > +#define SDP500_CRC8_WORD_LENGTH 2  
> >
> > As below. I'd establish these off the data the are the lengths of by using
> > a structure definition.  That will be more obvious and less fragile than
> > defines hiding up here.
> >
> >  
> > > +#define SDP500_CRC8_INIT        0x00  
> >
> > I'd just use the number inline.  Can't see what the define is adding.  
> 
> I've been taught to avoid magic numbers as much as possible.
> Giving it a define directly explains what the number is, even if it's used once.
> But I'll follow the community (in this case, you) for this.

Normally I agree with the magic number case, but this
is an actual value.  We are saying continue the CRC from
0 (i.e. nothing). It's kind of the logical default value
so seeing it in line makes it clear we aren't continuing form
a prior crc etc.

...

> >  
> > > +    },
> > > +};
> > > +
> > > +static int sdp500_read_raw(struct iio_dev *indio_dev,
> > > +              struct iio_chan_spec const *chan,
> > > +              int *val, int *val2, long mask)
> > > +{
> > > +    int ret;
> > > +    u8 rxbuf[SDP500_READ_SIZE];  
> > You could define this as a struct so all the data types are obvious.
> >
> >         struct {
> >                 __be16 data;
> >                 u8 crc;
> >         } __packed rxbuf;
> > The  __packed let's you use sizeof(rxbuf) for the transfer size.
> > Beware though as IIRC that will mean data is not necessarily aligned
> > so you'll still need the unaligned accessors.
> >  
> 
> I know, but I prefer to receive data in simple arrays and then deal with it.
The disadvantage is you loose the readability a structure brings, but
meh, I don't care that much. 

> 
> > > +    u8 rec_crc, calculated_crc;
> > > +    s16 dec_value;
> > > +    struct sdp500_data *data = iio_priv(indio_dev);
> > > +    struct i2c_client *client = to_i2c_client(data->dev);
> > > +
> > > +    switch (mask) {
> > > +    case IIO_CHAN_INFO_PROCESSED:
> > > +        ret = i2c_master_recv(client, rxbuf, SDP500_READ_SIZE);
> > > +        if (ret < 0) {
> > > +            dev_err(indio_dev->dev.parent, "Failed to receive data");
> > > +            return ret;
> > > +        }
> > > +        if (ret != SDP500_READ_SIZE) {
> > > +            dev_err(indio_dev->dev.parent, "Data is received wrongly");  
> >
> > I'd guess indio_dev->dev.parent == data->dev
> > If so use data->dev as more compact and that's where you are getting the
> > i2c_client from.
> >  
> 
> Makes sense.
> 
> > > +            return -EIO;
> > > +        }
> > > +
> > > +        rec_crc = rxbuf[2];
> > > +        calculated_crc = crc8(sdp500_crc8_table, rxbuf,
> > > SDP500_CRC8_WORD_LENGTH,  
> >
> > I'd use the number 2 for length directly as it's useful to know this is the
> > __be16 only, or sizeof(__be16)
> > What is the point in rec_crc local variable?  
> 
> Ok, I will use sizeof(rxbuff) - 1 instead of the define.
That's obscure and another reason I'd rather see a structure so this
becomes sizeof(a.data)

> The rec_crc is again for readability, like the SDP500_CRC8_INIT define.
> I will change it to "received_crc" which is clearer though.
The fact you compare it with the crc makes that pretty obvious, but
fair enough I guess if you think it helps.

> 
> >  
> > > +            SDP500_CRC8_INIT);
> > > +        if (rec_crc != calculated_crc) {
> > > +            dev_err(indio_dev->dev.parent, "calculated crc = 0x%.2X,
> > > received 0x%.2X",
> > > +                calculated_crc, rec_crc);
> > > +            return -EIO;
> > > +        }
> > > +
> > > +        dec_value = get_unaligned_be16(rxbuf);
> > > +        dev_dbg(indio_dev->dev.parent, "dec value = %d", dec_value);  
> >

> 
> > > +};
> > > +module_i2c_driver(sdp500_driver);
> > > +
> > > +MODULE_AUTHOR("Thomas Sioutas <thomas.sioutas@xxxxxxxxxxxxxxxxxxxxxxxxx>");
> > > +MODULE_DESCRIPTION("Driver for Sensirion SDP500 differential pressure sensor");
> > > +MODULE_LICENSE("GPL");  
> >  
> 
> I will test the driver with the suggested changes as soon as I get the
> hardware again
> and I will try using the b4 tool with "web submission endpoint". Thanks again!
> 
Good luck! (it should be fine but I've never tried it :)

Jonathan







[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux