Re: [PATCH] Staging: iio: adt7316: Add regmap support

2019-01-12 Thread Jonathan Cameron
...  
> > > diff --git a/drivers/staging/iio/addac/adt7316.h 
> > > b/drivers/staging/iio/addac/adt7316.h
> > > index fd7c5c92b599..2c72cf3f71cd 100644
> > > --- a/drivers/staging/iio/addac/adt7316.h
> > > +++ b/drivers/staging/iio/addac/adt7316.h
> > > @@ -11,16 +11,13 @@
> > >  
> > >  #include 
> > >  #include 
> > > +#include 
> > >  
> > >  #define ADT7316_REG_MAX_ADDR 0x3F
> > >  
> > > -struct adt7316_bus {
> > > - void *client;
> > > - int irq;
> > > - int (*read)(void *client, u8 reg, u8 *data);
> > > - int (*write)(void *client, u8 reg, u8 val);
> > > - int (*multi_read)(void *client, u8 first_reg, u8 count, u8 *data);
> > > - int (*multi_write)(void *client, u8 first_reg, u8 count, u8 *data);
> > > +static const struct regmap_config adt7316_regmap_config = {
> > > + .reg_bits = 8,
> > > + .val_bits = 10,  
> 
> I wonder if val_bits should be 8. The driver can read and write 8, 10,
> or 12 bit values. In the 10 and 12 bit cases, the driver currently
> (including with this patch) does two separate reads or writes and expects
> an 8 bit result from each. It then parses these two values to come up with
> the 10 or 12 bit value. I don't think the logic for this calculation is
> known to regmap, so with the current form of the patch, I think val_bits
> should be 8. Maybe there is a better way to do it though?

Good point. I would assume they should be 8 as well.


> 
> I would have tested this but I couldn't get the patch to apply. Shreeya,
> I think if you rebase against iio/testing that might take care of it. I
> can then do some testing with v2.
>
Great.

Jonathan 
> Jeremy


Re: [PATCH] Staging: iio: adt7316: Add regmap support

2019-01-05 Thread Jeremy Fertic
On Sat, Jan 05, 2019 at 05:20:37PM +, Jonathan Cameron wrote:
> +CC Jeremy who is also working with this device.
> 
> On Sun, 23 Dec 2018 19:32:24 +0530
> Shreeya Patel  wrote:
> 
> > Both i2c and spi drivers have functions for reading and writing
> > to/from registers. Remove this redundant and common code by using
> > regmap API.
> > Also remove multi_read and multi_write functions from i2c
> > and spi driver as they are not being used anywhere.
> > 
> > Signed-off-by: Shreeya Patel 
> 
> I would have preferred an initial patch that removed the multi_read
> and multi_write first as that would (I assume) be easily separated
> from the 'major' change of moving to regmap.  I also suggest
> another section to pull out to a precursor patch below.
> 
> The result looks fine to me.
> 
> Thanks,
> 
> Jonathan
> 
> > ---
> >  drivers/staging/iio/addac/adt7316-i2c.c | 101 ++--
> >  drivers/staging/iio/addac/adt7316-spi.c |  94 +++
> >  drivers/staging/iio/addac/adt7316.c | 147 
> >  drivers/staging/iio/addac/adt7316.h |  15 +--
> >  4 files changed, 103 insertions(+), 254 deletions(-)
> > 
> > diff --git a/drivers/staging/iio/addac/adt7316-i2c.c 
> > b/drivers/staging/iio/addac/adt7316-i2c.c
> > index ac91163656b5..435b65845174 100644
> > --- a/drivers/staging/iio/addac/adt7316-i2c.c
> > +++ b/drivers/staging/iio/addac/adt7316-i2c.c
> > @@ -12,105 +12,28 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  
> >  #include "adt7316.h"
> >  
> > -/*
> > - * adt7316 register access by I2C
> > - */
> > -static int adt7316_i2c_read(void *client, u8 reg, u8 *data)
> > -{
> > -   struct i2c_client *cl = client;
> > -   int ret;
> > -
> > -   ret = i2c_smbus_write_byte(cl, reg);
> > -   if (ret < 0) {
> > -   dev_err(>dev, "I2C fail to select reg\n");
> > -   return ret;
> > -   }
> > -
> > -   ret = i2c_smbus_read_byte(client);
> > -
> > -   if (!ret)
> > -   return -EIO;
> > -
> > -   if (ret < 0) {
> > -   dev_err(>dev, "I2C read error\n");
> > -   return ret;
> > -   }
> > -
> > -   *data = ret;
> > -
> > -   return 0;
> > -}
> > -
> > -static int adt7316_i2c_write(void *client, u8 reg, u8 data)
> > -{
> > -   struct i2c_client *cl = client;
> > -   int ret = 0;
> > -
> > -   ret = i2c_smbus_write_byte_data(cl, reg, data);
> > -   if (ret < 0)
> > -   dev_err(>dev, "I2C write error\n");
> > -
> > -   return ret;
> > -}
> > -
> > -static int adt7316_i2c_multi_read(void *client, u8 reg, u8 count, u8 *data)
> > -{
> > -   struct i2c_client *cl = client;
> > -   int i, ret = 0;
> > -
> > -   if (count > ADT7316_REG_MAX_ADDR)
> > -   count = ADT7316_REG_MAX_ADDR;
> > -
> > -   for (i = 0; i < count; i++) {
> > -   ret = adt7316_i2c_read(cl, reg, [i]);
> > -   if (ret < 0) {
> > -   dev_err(>dev, "I2C multi read error\n");
> > -   return ret;
> > -   }
> > -   }
> > -
> > -   return 0;
> > -}
> > -
> > -static int adt7316_i2c_multi_write(void *client, u8 reg, u8 count, u8 
> > *data)
> > -{
> > -   struct i2c_client *cl = client;
> > -   int i, ret = 0;
> > -
> > -   if (count > ADT7316_REG_MAX_ADDR)
> > -   count = ADT7316_REG_MAX_ADDR;
> > -
> > -   for (i = 0; i < count; i++) {
> > -   ret = adt7316_i2c_write(cl, reg, data[i]);
> > -   if (ret < 0) {
> > -   dev_err(>dev, "I2C multi write error\n");
> > -   return ret;
> > -   }
> > -   }
> > -
> > -   return 0;
> > -}
> > -
> >  /*
> >   * device probe and remove
> >   */
> > -
> >  static int adt7316_i2c_probe(struct i2c_client *client,
> >  const struct i2c_device_id *id)
> >  {
> > -   struct adt7316_bus bus = {
> > -   .client = client,
> > -   .irq = client->irq,
> > -   .read = adt7316_i2c_read,
> > -   .write = adt7316_i2c_write,
> > -   .multi_read = adt7316_i2c_multi_read,
> > -   .multi_write = adt7316_i2c_multi_write,
> > -   };
> > +   struct regmap *regmap;
> > +
> > +   regmap = devm_regmap_init_i2c(client, _regmap_config);
> > +
> > +   if (IS_ERR(regmap)) {
> > +   dev_err(>dev, "Error initializing i2c regmap: %ld\n",
> > +   PTR_ERR(regmap));
> > +   return PTR_ERR(regmap);
> > +   }
> >  
> > -   return adt7316_probe(>dev, , id->name);
> > +   return adt7316_probe(>dev, regmap, id ? id->name : NULL,
> > +client->irq);
> >  }
> >  
> >  static const struct i2c_device_id adt7316_i2c_id[] = {
> > diff --git a/drivers/staging/iio/addac/adt7316-spi.c 
> > b/drivers/staging/iio/addac/adt7316-spi.c
> > index e75827e326a6..9e3decb5cb77 100644
> > --- a/drivers/staging/iio/addac/adt7316-spi.c
> > +++ b/drivers/staging/iio/addac/adt7316-spi.c
> > @@ -11,79 +11,12 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> >  
> >  #include "adt7316.h"
> >  
> >  #define 

Re: [PATCH] Staging: iio: adt7316: Add regmap support

2019-01-05 Thread Jonathan Cameron
+CC Jeremy who is also working with this device.

On Sun, 23 Dec 2018 19:32:24 +0530
Shreeya Patel  wrote:

> Both i2c and spi drivers have functions for reading and writing
> to/from registers. Remove this redundant and common code by using
> regmap API.
> Also remove multi_read and multi_write functions from i2c
> and spi driver as they are not being used anywhere.
> 
> Signed-off-by: Shreeya Patel 

I would have preferred an initial patch that removed the multi_read
and multi_write first as that would (I assume) be easily separated
from the 'major' change of moving to regmap.  I also suggest
another section to pull out to a precursor patch below.

The result looks fine to me.

Thanks,

Jonathan

> ---
>  drivers/staging/iio/addac/adt7316-i2c.c | 101 ++--
>  drivers/staging/iio/addac/adt7316-spi.c |  94 +++
>  drivers/staging/iio/addac/adt7316.c | 147 
>  drivers/staging/iio/addac/adt7316.h |  15 +--
>  4 files changed, 103 insertions(+), 254 deletions(-)
> 
> diff --git a/drivers/staging/iio/addac/adt7316-i2c.c 
> b/drivers/staging/iio/addac/adt7316-i2c.c
> index ac91163656b5..435b65845174 100644
> --- a/drivers/staging/iio/addac/adt7316-i2c.c
> +++ b/drivers/staging/iio/addac/adt7316-i2c.c
> @@ -12,105 +12,28 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #include "adt7316.h"
>  
> -/*
> - * adt7316 register access by I2C
> - */
> -static int adt7316_i2c_read(void *client, u8 reg, u8 *data)
> -{
> - struct i2c_client *cl = client;
> - int ret;
> -
> - ret = i2c_smbus_write_byte(cl, reg);
> - if (ret < 0) {
> - dev_err(>dev, "I2C fail to select reg\n");
> - return ret;
> - }
> -
> - ret = i2c_smbus_read_byte(client);
> -
> - if (!ret)
> - return -EIO;
> -
> - if (ret < 0) {
> - dev_err(>dev, "I2C read error\n");
> - return ret;
> - }
> -
> - *data = ret;
> -
> - return 0;
> -}
> -
> -static int adt7316_i2c_write(void *client, u8 reg, u8 data)
> -{
> - struct i2c_client *cl = client;
> - int ret = 0;
> -
> - ret = i2c_smbus_write_byte_data(cl, reg, data);
> - if (ret < 0)
> - dev_err(>dev, "I2C write error\n");
> -
> - return ret;
> -}
> -
> -static int adt7316_i2c_multi_read(void *client, u8 reg, u8 count, u8 *data)
> -{
> - struct i2c_client *cl = client;
> - int i, ret = 0;
> -
> - if (count > ADT7316_REG_MAX_ADDR)
> - count = ADT7316_REG_MAX_ADDR;
> -
> - for (i = 0; i < count; i++) {
> - ret = adt7316_i2c_read(cl, reg, [i]);
> - if (ret < 0) {
> - dev_err(>dev, "I2C multi read error\n");
> - return ret;
> - }
> - }
> -
> - return 0;
> -}
> -
> -static int adt7316_i2c_multi_write(void *client, u8 reg, u8 count, u8 *data)
> -{
> - struct i2c_client *cl = client;
> - int i, ret = 0;
> -
> - if (count > ADT7316_REG_MAX_ADDR)
> - count = ADT7316_REG_MAX_ADDR;
> -
> - for (i = 0; i < count; i++) {
> - ret = adt7316_i2c_write(cl, reg, data[i]);
> - if (ret < 0) {
> - dev_err(>dev, "I2C multi write error\n");
> - return ret;
> - }
> - }
> -
> - return 0;
> -}
> -
>  /*
>   * device probe and remove
>   */
> -
>  static int adt7316_i2c_probe(struct i2c_client *client,
>const struct i2c_device_id *id)
>  {
> - struct adt7316_bus bus = {
> - .client = client,
> - .irq = client->irq,
> - .read = adt7316_i2c_read,
> - .write = adt7316_i2c_write,
> - .multi_read = adt7316_i2c_multi_read,
> - .multi_write = adt7316_i2c_multi_write,
> - };
> + struct regmap *regmap;
> +
> + regmap = devm_regmap_init_i2c(client, _regmap_config);
> +
> + if (IS_ERR(regmap)) {
> + dev_err(>dev, "Error initializing i2c regmap: %ld\n",
> + PTR_ERR(regmap));
> + return PTR_ERR(regmap);
> + }
>  
> - return adt7316_probe(>dev, , id->name);
> + return adt7316_probe(>dev, regmap, id ? id->name : NULL,
> +  client->irq);
>  }
>  
>  static const struct i2c_device_id adt7316_i2c_id[] = {
> diff --git a/drivers/staging/iio/addac/adt7316-spi.c 
> b/drivers/staging/iio/addac/adt7316-spi.c
> index e75827e326a6..9e3decb5cb77 100644
> --- a/drivers/staging/iio/addac/adt7316-spi.c
> +++ b/drivers/staging/iio/addac/adt7316-spi.c
> @@ -11,79 +11,12 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  
>  #include "adt7316.h"
>  
>  #define ADT7316_SPI_MAX_FREQ_HZ  500
> -#define ADT7316_SPI_CMD_READ 0x91
> -#define ADT7316_SPI_CMD_WRITE0x90
> -
> -/*
> - * adt7316 register access by SPI
> - */
> -
> -static int adt7316_spi_multi_read(void *client, u8 reg, u8 count, u8 *data)

[PATCH] Staging: iio: adt7316: Add regmap support

2018-12-23 Thread Shreeya Patel
Both i2c and spi drivers have functions for reading and writing
to/from registers. Remove this redundant and common code by using
regmap API.
Also remove multi_read and multi_write functions from i2c
and spi driver as they are not being used anywhere.

Signed-off-by: Shreeya Patel 
---
 drivers/staging/iio/addac/adt7316-i2c.c | 101 ++--
 drivers/staging/iio/addac/adt7316-spi.c |  94 +++
 drivers/staging/iio/addac/adt7316.c | 147 
 drivers/staging/iio/addac/adt7316.h |  15 +--
 4 files changed, 103 insertions(+), 254 deletions(-)

diff --git a/drivers/staging/iio/addac/adt7316-i2c.c 
b/drivers/staging/iio/addac/adt7316-i2c.c
index ac91163656b5..435b65845174 100644
--- a/drivers/staging/iio/addac/adt7316-i2c.c
+++ b/drivers/staging/iio/addac/adt7316-i2c.c
@@ -12,105 +12,28 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "adt7316.h"
 
-/*
- * adt7316 register access by I2C
- */
-static int adt7316_i2c_read(void *client, u8 reg, u8 *data)
-{
-   struct i2c_client *cl = client;
-   int ret;
-
-   ret = i2c_smbus_write_byte(cl, reg);
-   if (ret < 0) {
-   dev_err(>dev, "I2C fail to select reg\n");
-   return ret;
-   }
-
-   ret = i2c_smbus_read_byte(client);
-
-   if (!ret)
-   return -EIO;
-
-   if (ret < 0) {
-   dev_err(>dev, "I2C read error\n");
-   return ret;
-   }
-
-   *data = ret;
-
-   return 0;
-}
-
-static int adt7316_i2c_write(void *client, u8 reg, u8 data)
-{
-   struct i2c_client *cl = client;
-   int ret = 0;
-
-   ret = i2c_smbus_write_byte_data(cl, reg, data);
-   if (ret < 0)
-   dev_err(>dev, "I2C write error\n");
-
-   return ret;
-}
-
-static int adt7316_i2c_multi_read(void *client, u8 reg, u8 count, u8 *data)
-{
-   struct i2c_client *cl = client;
-   int i, ret = 0;
-
-   if (count > ADT7316_REG_MAX_ADDR)
-   count = ADT7316_REG_MAX_ADDR;
-
-   for (i = 0; i < count; i++) {
-   ret = adt7316_i2c_read(cl, reg, [i]);
-   if (ret < 0) {
-   dev_err(>dev, "I2C multi read error\n");
-   return ret;
-   }
-   }
-
-   return 0;
-}
-
-static int adt7316_i2c_multi_write(void *client, u8 reg, u8 count, u8 *data)
-{
-   struct i2c_client *cl = client;
-   int i, ret = 0;
-
-   if (count > ADT7316_REG_MAX_ADDR)
-   count = ADT7316_REG_MAX_ADDR;
-
-   for (i = 0; i < count; i++) {
-   ret = adt7316_i2c_write(cl, reg, data[i]);
-   if (ret < 0) {
-   dev_err(>dev, "I2C multi write error\n");
-   return ret;
-   }
-   }
-
-   return 0;
-}
-
 /*
  * device probe and remove
  */
-
 static int adt7316_i2c_probe(struct i2c_client *client,
 const struct i2c_device_id *id)
 {
-   struct adt7316_bus bus = {
-   .client = client,
-   .irq = client->irq,
-   .read = adt7316_i2c_read,
-   .write = adt7316_i2c_write,
-   .multi_read = adt7316_i2c_multi_read,
-   .multi_write = adt7316_i2c_multi_write,
-   };
+   struct regmap *regmap;
+
+   regmap = devm_regmap_init_i2c(client, _regmap_config);
+
+   if (IS_ERR(regmap)) {
+   dev_err(>dev, "Error initializing i2c regmap: %ld\n",
+   PTR_ERR(regmap));
+   return PTR_ERR(regmap);
+   }
 
-   return adt7316_probe(>dev, , id->name);
+   return adt7316_probe(>dev, regmap, id ? id->name : NULL,
+client->irq);
 }
 
 static const struct i2c_device_id adt7316_i2c_id[] = {
diff --git a/drivers/staging/iio/addac/adt7316-spi.c 
b/drivers/staging/iio/addac/adt7316-spi.c
index e75827e326a6..9e3decb5cb77 100644
--- a/drivers/staging/iio/addac/adt7316-spi.c
+++ b/drivers/staging/iio/addac/adt7316-spi.c
@@ -11,79 +11,12 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include "adt7316.h"
 
 #define ADT7316_SPI_MAX_FREQ_HZ500
-#define ADT7316_SPI_CMD_READ   0x91
-#define ADT7316_SPI_CMD_WRITE  0x90
-
-/*
- * adt7316 register access by SPI
- */
-
-static int adt7316_spi_multi_read(void *client, u8 reg, u8 count, u8 *data)
-{
-   struct spi_device *spi_dev = client;
-   u8 cmd[2];
-   int ret = 0;
-
-   if (count > ADT7316_REG_MAX_ADDR)
-   count = ADT7316_REG_MAX_ADDR;
-
-   cmd[0] = ADT7316_SPI_CMD_WRITE;
-   cmd[1] = reg;
-
-   ret = spi_write(spi_dev, cmd, 2);
-   if (ret < 0) {
-   dev_err(_dev->dev, "SPI fail to select reg\n");
-   return ret;
-   }
-
-   cmd[0] = ADT7316_SPI_CMD_READ;
-
-   ret = spi_write_then_read(spi_dev, cmd, 1, data, count);
-   if (ret < 0) {
-   dev_err(_dev->dev, "SPI read data error\n");