Hi Dan,

Replies to queries inline.

On Mon, 10 Dec 2018 14:14:55 -0600
Dan Murphy <[email protected]> wrote:

> Jonathan
> 
> Thanks for the review
> 
> On 12/08/2018 05:56 AM, Jonathan Cameron wrote:
> > On Tue, 4 Dec 2018 11:59:55 -0600
> > Dan Murphy <[email protected]> wrote:
> >   
> >> Introduce the TI ADS124S08 and the ADS124S06 ADC
> >> devices from TI.  The ADS124S08 is the 12 channel ADC
> >> and the ADS124S06 is the 6 channel ADC device
> >>
> >> These devices share a common datasheet:
> >> http://www.ti.com/lit/gpn/ads124s08
> >>
> >> Signed-off-by: Dan Murphy <[email protected]>  
> > Various minor things inline.
> >   
> 
> No worries.  I believe I used the ADS8688 driver as a reference so that driver
> may need to be updated as well

Great if you don't mind fixing the buffer size issue in there as well.

> 
> > Thanks,
> > 
> > Jonathan
> >   
> >> ---
> >>  drivers/iio/adc/Kconfig        |  10 +
> >>  drivers/iio/adc/Makefile       |   1 +
> >>  drivers/iio/adc/ti-ads124s08.c | 437 +++++++++++++++++++++++++++++++++
> >>  3 files changed, 448 insertions(+)
> >>  create mode 100644 drivers/iio/adc/ti-ads124s08.c
> >>
> >> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> >> index a52fea8749a9..e8c5686e6716 100644
> >> --- a/drivers/iio/adc/Kconfig
> >> +++ b/drivers/iio/adc/Kconfig
> >> @@ -887,6 +887,16 @@ config TI_ADS8688
> >>      This driver can also be built as a module. If so, the module will be
> >>      called ti-ads8688.
> >>  
> >> +config TI_ADS124S08
> >> +  tristate "Texas Instruments ADS124S08"
> >> +  depends on SPI && OF
> >> +  help
> >> +    If you say yes here you get support for Texas Instruments ADS124S08
> >> +    and ADS124S06 ADC chips
> >> +
> >> +    This driver can also be built as a module. If so, the module will be
> >> +    called ti-ads124s08.
> >> +
> >>  config TI_AM335X_ADC
> >>    tristate "TI's AM335X ADC driver"
> >>    depends on MFD_TI_AM335X_TSCADC && HAS_DMA
> >> diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
> >> index a6e6a0b659e2..d70293abfdba 100644
> >> --- a/drivers/iio/adc/Makefile
> >> +++ b/drivers/iio/adc/Makefile
> >> @@ -79,6 +79,7 @@ obj-$(CONFIG_TI_ADC161S626) += ti-adc161s626.o
> >>  obj-$(CONFIG_TI_ADS1015) += ti-ads1015.o
> >>  obj-$(CONFIG_TI_ADS7950) += ti-ads7950.o
> >>  obj-$(CONFIG_TI_ADS8688) += ti-ads8688.o
> >> +obj-$(CONFIG_TI_ADS124S08) += ti-ads124s08.o
> >>  obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o
> >>  obj-$(CONFIG_TI_TLC4541) += ti-tlc4541.o
> >>  obj-$(CONFIG_TWL4030_MADC) += twl4030-madc.o
> >> diff --git a/drivers/iio/adc/ti-ads124s08.c 
> >> b/drivers/iio/adc/ti-ads124s08.c
> >> new file mode 100644
> >> index 000000000000..b6fc93f37355
> >> --- /dev/null
> >> +++ b/drivers/iio/adc/ti-ads124s08.c
> >> @@ -0,0 +1,437 @@
> >> +// SPDX-License-Identifier: GPL-2.0
> >> +// TI ADS124S0X chip family driver
> >> +// Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/ 
> >>  
> > An oddity of current kernel style is that typically only the spdx
> > line is // 
> > 
> > The rest are a normal kernel multiline comment.  
> 
> Ack.  Finding it is up to the maintainer here on the preference so I will 
> change it.
> 
> >   
> >> +
> >> +#include <linux/err.h>
> >> +#include <linux/delay.h>
> >> +#include <linux/device.h>
> >> +#include <linux/kernel.h>
> >> +#include <linux/module.h>
> >> +#include <linux/of.h>
> >> +#include <linux/of_gpio.h>
> >> +#include <linux/slab.h>
> >> +#include <linux/sysfs.h>
> >> +
> >> +#include <linux/gpio/consumer.h>
> >> +#include <linux/regulator/consumer.h>
> >> +#include <linux/spi/spi.h>
> >> +
> >> +#include <linux/iio/iio.h>
> >> +#include <linux/iio/buffer.h>
> >> +#include <linux/iio/trigger_consumer.h>
> >> +#include <linux/iio/triggered_buffer.h>
> >> +#include <linux/iio/sysfs.h>
> >> +
> >> +#define ADS124S08_ID              0x00
> >> +#define ADS124S06_ID              0x01  
> > 
> > Use an enum for these as the actual values don't matter, only that
> > they are unique.
> >   
> 
> Ack.  Is there a preference on using the sentinnal or not?

If the sentinel is useful for a loop or range check then yes, if not
then don't bother.

> 
> >> +
> >> +/* Commands */
> >> +#define ADS124S_CMD_NOP           0x00  
> > Why this shorter prefix? Are all ADS124S parts
> > compatible with this list? 
> >   
> 
> Ack.  Yes the 124S are all compatible since there are only 2 ATM.
> 
> 
> >> +#define ADS124S_CMD_WAKEUP        0x02
> >> +#define ADS124S_CMD_PWRDWN        0x04
> >> +#define ADS124S_CMD_RESET 0x06
> >> +#define ADS124S_CMD_START 0x08
> >> +#define ADS124S_CMD_STOP  0x0a
> >> +#define ADS124S_CMD_SYOCAL        0x16
> >> +#define ADS124S_CMD_SYGCAL        0x17
> >> +#define ADS124S_CMD_SFOCAL        0x19
> >> +#define ADS124S_CMD_RDATA 0x12
> >> +#define ADS124S_CMD_RREG  0x20
> >> +#define ADS124S_CMD_WREG  0x40
> >> +
> >> +/* Registers */
> >> +#define ADS124S0X_ID              0x00  
> > Avoid wild cards in naming.  It always goes wrong when
> > along comes another part that is similar but not quite the
> > same yet fits in your naming scheme.  Just pick a part
> > and name after that.  
> 
> The issue is that there are some registers below that are S08 only
> and do not apply to the S06.
> 
> This is why I choose the wild card.  I can use the 08 since that has a master 
> set.
> Unless I can keep the 0X

Use 08 seems like a good solution as they are definitely valid for that.

...

> >> +
> >> +static int ads124s_read(struct iio_dev *indio_dev, unsigned int chan)
> >> +{
> >> +  struct ads124s_private *priv = iio_priv(indio_dev);
> >> +  int ret;
> >> +  u32 tmp;
> >> +  struct spi_transfer t[] = {
> >> +          {
> >> +                  .tx_buf = &priv->data[0],
> >> +                  .len = 4,
> >> +                  .cs_change = 1,
> >> +          }, {
> >> +                  .tx_buf = &priv->data[1],
> >> +                  .rx_buf = &priv->data[1],
> >> +                  .len = 4,
> >> +          },
> >> +  };  
> > 
> > Pity we don't have a spi_write_the_read_with_cs or
> > something like that.  I wonder how common this structure is?  
> 
> This is common with this part and the ads8688 and another spi part I am 
> working on for CAN.
> 
> I just don't know if there are any parts that hold CS for more then one data 
> xfer.

There definitely are though I couldn't name one right now.
Some devices use the CS to reset a simple state machine.  If you drop
it then the state machine resets, even mid read.

...
> 
> >   
> >> +
> >> +static const struct iio_info ads124s_info = {
> >> +  .read_raw = &ads124s_read_raw,
> >> +};
> >> +
> >> +static irqreturn_t ads124s_trigger_handler(int irq, void *p)
> >> +{
> >> +  struct iio_poll_func *pf = p;
> >> +  struct iio_dev *indio_dev = pf->indio_dev;
> >> +  struct ads124s_private *priv = iio_priv(indio_dev);
> >> +  u16 buffer[ADS124S0X_MAX_CHANNELS];  
> > 
> > There is an unfortunate oddity in how push_to_buffers_with_timestamp
> > works in that it builds the data for the kfifo inline in the buffer
> > provided.  Thus that buffer has to have room for the channels and
> > the 64 bit timestamp.  
> 
> Hmmm.  This is like the 8688.  I am starting to think the 8688 needs to be 
> updated.

Yes that looks wrong.  Thanks!

> 
> >   
> >> +  int i, j = 0;
> >> +  int ret;
> >> +
> >> +  for (i = 0; i < indio_dev->masklength; i++) {
> >> +          if (!test_bit(i, indio_dev->active_scan_mask))  
> > 
> > for_each_bit_set   
> 
> Same as above.  But I can change it.
> 
> >   
> >> +                  continue;
> >> +
> >> +          ret = ads124s_write_reg(indio_dev, ADS124S0X_INPUT_MUX, i);  
> > 
> > Does this need to be rewritten if the channel is already correct?  
> 
> This is an iterative loop so the channel should be different each time 0 - 12

doh.  I'm not sure how I misread that.  However, not true for the raw
read above I think?
   
...
> > 
> > You can move to fully managed if you use devm_add_action_or_reset
> > to turn the regulator off.
> >   
> >> +
> >> +  return 0;
> >> +}
> >> +
> >> +static const struct spi_device_id ads124s_id[] = {
> >> +  { "ads124s08", ADS124S08_ID },
> >> +  { "ads124s06", ADS124S06_ID },
> >> +  { }
> >> +};
> >> +MODULE_DEVICE_TABLE(spi, ads124s_id);
> >> +
> >> +static const struct of_device_id ads124s_of_table[] = {
> >> +  { .compatible = "ti,ads124s08" },
> >> +  { .compatible = "ti,ads124s06" },  
> > 
> > It's trivial but numerical order preferred as it makes it
> > obvious where to add new devices later.  
> 
> Actually I based these off the ID read from the device.
> The S08 ID is 0x0 and the S06 is 0x1.  Bit I can reorder this since it just 
> the compatible.

Given that reason for the order is hidden by the defines
I'd reorder to avoid someone else coming and tidying it up later!

> 
> Dan
...

Jonathan

Reply via email to