2019-01-20 15:38:11

by Shreeya Patel

[permalink] [raw]
Subject: [PATCH v3 0/3] adt7316 regmap implementation

This patchset consist of some initial patches for heading
towards the regmap implementation and also the final patch
which enables the driver to use regmap API thus removing
the redundant and common code.

Changes in v3
-Fetch the changes from remote and rebase to have it in
the current working directory.

Changes in v2
-Change the val_bits to 8 and add two more patches
having a different change before the final implemetation
of regmap.

Shreeya Patel (3):
Staging: iio: adt7316: Remove irq from bus structure
Staging: iio: adt7316: Remove multi read and write functions
Staging: iio: adt7316: Add regmap support

drivers/staging/iio/addac/adt7316-i2c.c | 97 ++--------------
drivers/staging/iio/addac/adt7316-spi.c | 95 +++------------
drivers/staging/iio/addac/adt7316.c | 147 ++++++++++++------------
drivers/staging/iio/addac/adt7316.h | 15 +--
4 files changed, 103 insertions(+), 251 deletions(-)

--
2.17.1



2019-01-20 15:38:16

by Shreeya Patel

[permalink] [raw]
Subject: [PATCH v3 1/3] Staging: iio: adt7316: Remove irq from bus structure

interrupt request is not needed to be present in the bus
structure. It is a good option to pass it as a parameter
in the probe function instead of having it in the bus structure.

Signed-off-by: Shreeya Patel <[email protected]>
---
drivers/staging/iio/addac/adt7316-i2c.c | 3 +--
drivers/staging/iio/addac/adt7316-spi.c | 4 ++--
drivers/staging/iio/addac/adt7316.c | 15 +++++++--------
drivers/staging/iio/addac/adt7316.h | 3 +--
4 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/drivers/staging/iio/addac/adt7316-i2c.c b/drivers/staging/iio/addac/adt7316-i2c.c
index 2d51bd425662..b6571db2e8d8 100644
--- a/drivers/staging/iio/addac/adt7316-i2c.c
+++ b/drivers/staging/iio/addac/adt7316-i2c.c
@@ -99,14 +99,13 @@ static int adt7316_i2c_probe(struct i2c_client *client,
{
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,
};

- return adt7316_probe(&client->dev, &bus, id->name);
+ return adt7316_probe(&client->dev, &bus, id->name, 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..adaaa3eecd04 100644
--- a/drivers/staging/iio/addac/adt7316-spi.c
+++ b/drivers/staging/iio/addac/adt7316-spi.c
@@ -93,7 +93,6 @@ static int adt7316_spi_probe(struct spi_device *spi_dev)
{
struct adt7316_bus bus = {
.client = spi_dev,
- .irq = spi_dev->irq,
.read = adt7316_spi_read,
.write = adt7316_spi_write,
.multi_read = adt7316_spi_multi_read,
@@ -112,7 +111,8 @@ static int adt7316_spi_probe(struct spi_device *spi_dev)
adt7316_spi_write(spi_dev, 0, 0);
adt7316_spi_write(spi_dev, 0, 0);

- return adt7316_probe(&spi_dev->dev, &bus, spi_dev->modalias);
+ return adt7316_probe(&spi_dev->dev, &bus, spi_dev->modalias,
+ spi_dev->irq);
}

static const struct spi_device_id adt7316_spi_id[] = {
diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c
index 8cf3ff25eb62..30808a897fc2 100644
--- a/drivers/staging/iio/addac/adt7316.c
+++ b/drivers/staging/iio/addac/adt7316.c
@@ -1809,12 +1809,12 @@ static irqreturn_t adt7316_event_handler(int irq, void *private)
return IRQ_HANDLED;
}

-static int adt7316_setup_irq(struct iio_dev *indio_dev)
+static int adt7316_setup_irq(struct iio_dev *indio_dev, int irq)
{
struct adt7316_chip_info *chip = iio_priv(indio_dev);
int irq_type, ret;

- irq_type = irqd_get_trigger_type(irq_get_irq_data(chip->bus.irq));
+ irq_type = irqd_get_trigger_type(irq_get_irq_data(irq));

switch (irq_type) {
case IRQF_TRIGGER_HIGH:
@@ -1830,13 +1830,12 @@ static int adt7316_setup_irq(struct iio_dev *indio_dev)
break;
}

- ret = devm_request_threaded_irq(&indio_dev->dev, chip->bus.irq,
+ ret = devm_request_threaded_irq(&indio_dev->dev, irq,
NULL, adt7316_event_handler,
irq_type | IRQF_ONESHOT,
indio_dev->name, indio_dev);
if (ret) {
- dev_err(&indio_dev->dev, "failed to request irq %d\n",
- chip->bus.irq);
+ dev_err(&indio_dev->dev, "failed to request irq %d\n", irq);
return ret;
}

@@ -2136,7 +2135,7 @@ static const struct iio_info adt7516_info = {
* device probe and remove
*/
int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
- const char *name)
+ const char *name, int irq)
{
struct adt7316_chip_info *chip;
struct iio_dev *indio_dev;
@@ -2182,8 +2181,8 @@ int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
indio_dev->name = name;
indio_dev->modes = INDIO_DIRECT_MODE;

- if (chip->bus.irq > 0) {
- ret = adt7316_setup_irq(indio_dev);
+ if (irq > 0) {
+ ret = adt7316_setup_irq(indio_dev, irq);
if (ret)
return ret;
}
diff --git a/drivers/staging/iio/addac/adt7316.h b/drivers/staging/iio/addac/adt7316.h
index 84ca4f6c88f5..03d5300a98cd 100644
--- a/drivers/staging/iio/addac/adt7316.h
+++ b/drivers/staging/iio/addac/adt7316.h
@@ -16,7 +16,6 @@

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);
@@ -30,6 +29,6 @@ extern const struct dev_pm_ops adt7316_pm_ops;
#define ADT7316_PM_OPS NULL
#endif
int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
- const char *name);
+ const char *name, int irq);

#endif
--
2.17.1


2019-01-20 15:39:05

by Shreeya Patel

[permalink] [raw]
Subject: [PATCH v3 3/3] Staging: iio: adt7316: Add regmap support

Both i2c and spi drivers have functions for reading and writing
to/from registers. Remove this redundant and common code by using
regmap API.

Signed-off-by: Shreeya Patel <[email protected]>
---
drivers/staging/iio/addac/adt7316-i2c.c | 56 +++-------
drivers/staging/iio/addac/adt7316-spi.c | 74 +++----------
drivers/staging/iio/addac/adt7316.c | 132 ++++++++++++------------
drivers/staging/iio/addac/adt7316.h | 10 +-
4 files changed, 94 insertions(+), 178 deletions(-)

diff --git a/drivers/staging/iio/addac/adt7316-i2c.c b/drivers/staging/iio/addac/adt7316-i2c.c
index c7f82c3fe27c..435b65845174 100644
--- a/drivers/staging/iio/addac/adt7316-i2c.c
+++ b/drivers/staging/iio/addac/adt7316-i2c.c
@@ -12,60 +12,28 @@
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/module.h>
+#include <linux/regmap.h>

#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(&cl->dev, "I2C fail to select reg\n");
- return ret;
- }
-
- ret = i2c_smbus_read_byte(client);
- if (ret < 0) {
- dev_err(&cl->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(&cl->dev, "I2C write error\n");
-
- return ret;
-}
-
/*
* 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,
- .read = adt7316_i2c_read,
- .write = adt7316_i2c_write,
- };
+ struct regmap *regmap;
+
+ regmap = devm_regmap_init_i2c(client, &adt7316_regmap_config);
+
+ if (IS_ERR(regmap)) {
+ dev_err(&client->dev, "Error initializing i2c regmap: %ld\n",
+ PTR_ERR(regmap));
+ return PTR_ERR(regmap);
+ }

- return adt7316_probe(&client->dev, &bus, id->name, client->irq);
+ return adt7316_probe(&client->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 1a78dc1e2840..203b5c3ada6e 100644
--- a/drivers/staging/iio/addac/adt7316-spi.c
+++ b/drivers/staging/iio/addac/adt7316-spi.c
@@ -11,74 +11,19 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/interrupt.h>
+#include <linux/regmap.h>
#include <linux/spi/spi.h>

#include "adt7316.h"

#define ADT7316_SPI_MAX_FREQ_HZ 5000000
-#define ADT7316_SPI_CMD_READ 0x91
-#define ADT7316_SPI_CMD_WRITE 0x90
-
-/*
- * adt7316 register access by SPI
- */
-
-static int adt7316_spi_read(void *client, u8 reg, u8 *data)
-{
- struct spi_device *spi_dev = client;
- u8 cmd[2];
- int ret = 0;
-
- cmd[0] = ADT7316_SPI_CMD_WRITE;
- cmd[1] = reg;
-
- ret = spi_write(spi_dev, cmd, 2);
- if (ret < 0) {
- dev_err(&spi_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, 1);
- if (ret < 0) {
- dev_err(&spi_dev->dev, "SPI read data error\n");
- return ret;
- }
-
- return 0;
-}
-
-static int adt7316_spi_write(void *client, u8 reg, u8 val)
-{
- struct spi_device *spi_dev = client;
- u8 buf[ADT7316_REG_MAX_ADDR + 2];
- int ret = 0;
-
- buf[0] = ADT7316_SPI_CMD_WRITE;
- buf[1] = reg;
- buf[2] = val;
-
- ret = spi_write(spi_dev, buf, 3);
- if (ret < 0) {
- dev_err(&spi_dev->dev, "SPI write error\n");
- return ret;
- }
-
- return ret;
-}

/*
* device probe and remove
*/
-
static int adt7316_spi_probe(struct spi_device *spi_dev)
{
- struct adt7316_bus bus = {
- .client = spi_dev,
- .read = adt7316_spi_read,
- .write = adt7316_spi_write,
- };
+ struct regmap *regmap;

/* don't exceed max specified SPI CLK frequency */
if (spi_dev->max_speed_hz > ADT7316_SPI_MAX_FREQ_HZ) {
@@ -87,12 +32,19 @@ static int adt7316_spi_probe(struct spi_device *spi_dev)
return -EINVAL;
}

+ regmap = devm_regmap_init_spi(spi_dev, &adt7316_regmap_config);
+ if (IS_ERR(regmap)) {
+ dev_err(&spi_dev->dev, "Error initializing spi regmap: %ld\n",
+ PTR_ERR(regmap));
+ return PTR_ERR(regmap);
+ }
+
/* switch from default I2C protocol to SPI protocol */
- adt7316_spi_write(spi_dev, 0, 0);
- adt7316_spi_write(spi_dev, 0, 0);
- adt7316_spi_write(spi_dev, 0, 0);
+ regmap_write(regmap, 0, 0);
+ regmap_write(regmap, 0, 0);
+ regmap_write(regmap, 0, 0);

- return adt7316_probe(&spi_dev->dev, &bus, spi_dev->modalias,
+ return adt7316_probe(&spi_dev->dev, regmap, spi_dev->modalias,
spi_dev->irq);
}

diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c
index 30808a897fc2..2aa0471bd140 100644
--- a/drivers/staging/iio/addac/adt7316.c
+++ b/drivers/staging/iio/addac/adt7316.c
@@ -17,6 +17,7 @@
#include <linux/list.h>
#include <linux/i2c.h>
#include <linux/rtc.h>
+#include <linux/regmap.h>
#include <linux/module.h>

#include <linux/iio/iio.h>
@@ -176,7 +177,7 @@
*/

struct adt7316_chip_info {
- struct adt7316_bus bus;
+ struct regmap *regmap;
struct gpio_desc *ldac_pin;
u16 int_mask; /* 0x2f */
u8 config1;
@@ -237,7 +238,7 @@ static ssize_t _adt7316_store_enabled(struct adt7316_chip_info *chip,
else
config1 = chip->config1 & ~ADT7316_EN;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG1, config1);
if (ret)
return -EIO;

@@ -301,7 +302,7 @@ static ssize_t adt7316_store_select_ex_temp(struct device *dev,
if (buf[0] == '1')
config1 |= ADT7516_SEL_EX_TEMP;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG1, config1);
if (ret)
return -EIO;

@@ -342,7 +343,7 @@ static ssize_t adt7316_store_mode(struct device *dev,
if (!memcmp(buf, "single_channel", 14))
config2 |= ADT7316_AD_SINGLE_CH_MODE;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG2, config2);
if (ret)
return -EIO;

@@ -435,7 +436,7 @@ static ssize_t adt7316_store_ad_channel(struct device *dev,

config2 |= data;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG2, config2);
if (ret)
return -EIO;

@@ -495,7 +496,7 @@ static ssize_t adt7316_store_disable_averaging(struct device *dev,
if (buf[0] == '1')
config2 |= ADT7316_DISABLE_AVERAGING;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG2, config2);
if (ret)
return -EIO;

@@ -534,7 +535,7 @@ static ssize_t adt7316_store_enable_smbus_timeout(struct device *dev,
if (buf[0] == '1')
config2 |= ADT7316_EN_SMBUS_TIMEOUT;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG2, config2);
if (ret)
return -EIO;

@@ -572,7 +573,7 @@ static ssize_t adt7316_store_powerdown(struct device *dev,
if (buf[0] == '1')
config1 |= ADT7316_PD;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG1, config1);
if (ret)
return -EIO;

@@ -610,7 +611,7 @@ static ssize_t adt7316_store_fast_ad_clock(struct device *dev,
if (buf[0] == '1')
config3 |= ADT7316_ADCLK_22_5;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG3, config3);
if (ret)
return -EIO;

@@ -663,7 +664,7 @@ static ssize_t adt7316_store_da_high_resolution(struct device *dev,
config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION);
}

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG3, config3);
if (ret)
return -EIO;

@@ -709,7 +710,7 @@ static ssize_t adt7316_store_AIN_internal_Vref(struct device *dev,
else
config3 = chip->config3 | ADT7516_AIN_IN_VREF;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG3, config3);
if (ret)
return -EIO;

@@ -748,7 +749,7 @@ static ssize_t adt7316_store_enable_prop_DACA(struct device *dev,
if (buf[0] == '1')
config3 |= ADT7316_EN_IN_TEMP_PROP_DACA;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG3, config3);
if (ret)
return -EIO;

@@ -787,7 +788,7 @@ static ssize_t adt7316_store_enable_prop_DACB(struct device *dev,
if (buf[0] == '1')
config3 |= ADT7316_EN_EX_TEMP_PROP_DACB;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG3, config3);
if (ret)
return -EIO;

@@ -830,7 +831,7 @@ static ssize_t adt7316_store_DAC_2Vref_ch_mask(struct device *dev,
dac_config = chip->dac_config & (~ADT7316_DA_2VREF_CH_MASK);
dac_config |= data;

- ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
+ ret = regmap_write(chip->regmap, ADT7316_DAC_CONFIG, dac_config);
if (ret)
return -EIO;

@@ -890,7 +891,7 @@ static ssize_t adt7316_store_DAC_update_mode(struct device *dev,
dac_config = chip->dac_config & (~ADT7316_DA_EN_MODE_MASK);
dac_config |= data;

- ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
+ ret = regmap_write(chip->regmap, ADT7316_DAC_CONFIG, dac_config);
if (ret)
return -EIO;

@@ -945,8 +946,8 @@ static ssize_t adt7316_store_update_DAC(struct device *dev,
ldac_config = chip->ldac_config & (~ADT7316_LDAC_EN_DA_MASK);
ldac_config |= data;

- ret = chip->bus.write(chip->bus.client, ADT7316_LDAC_CONFIG,
- ldac_config);
+ ret = regmap_write(chip->regmap, ADT7316_LDAC_CONFIG,
+ ldac_config);
if (ret)
return -EIO;
} else {
@@ -993,7 +994,7 @@ static ssize_t adt7316_store_DA_AB_Vref_bypass(struct device *dev,
if (buf[0] == '1')
dac_config |= ADT7316_VREF_BYPASS_DAC_AB;

- ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
+ ret = regmap_write(chip->regmap, ADT7316_DAC_CONFIG, dac_config);
if (ret)
return -EIO;

@@ -1038,7 +1039,7 @@ static ssize_t adt7316_store_DA_CD_Vref_bypass(struct device *dev,
if (buf[0] == '1')
dac_config |= ADT7316_VREF_BYPASS_DAC_CD;

- ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
+ ret = regmap_write(chip->regmap, ADT7316_DAC_CONFIG, dac_config);
if (ret)
return -EIO;

@@ -1098,8 +1099,7 @@ static ssize_t adt7316_store_DAC_internal_Vref(struct device *dev,
ldac_config = chip->ldac_config | ADT7316_DAC_IN_VREF;
}

- ret = chip->bus.write(chip->bus.client, ADT7316_LDAC_CONFIG,
- ldac_config);
+ ret = regmap_write(chip->regmap, ADT7316_LDAC_CONFIG, ldac_config);
if (ret)
return -EIO;

@@ -1117,7 +1117,7 @@ static ssize_t adt7316_show_ad(struct adt7316_chip_info *chip,
int channel, char *buf)
{
u16 data;
- u8 msb, lsb;
+ unsigned int msb, lsb;
char sign = ' ';
int ret;

@@ -1127,13 +1127,12 @@ static ssize_t adt7316_show_ad(struct adt7316_chip_info *chip,

switch (channel) {
case ADT7316_AD_SINGLE_CH_IN:
- ret = chip->bus.read(chip->bus.client,
- ADT7316_LSB_IN_TEMP_VDD, &lsb);
+ ret = regmap_read(chip->regmap, ADT7316_LSB_IN_TEMP_VDD, &lsb);
if (ret)
return -EIO;

- ret = chip->bus.read(chip->bus.client,
- ADT7316_AD_MSB_DATA_BASE + channel, &msb);
+ ret = regmap_read(chip->regmap,
+ ADT7316_AD_MSB_DATA_BASE + channel, &msb);
if (ret)
return -EIO;

@@ -1141,14 +1140,12 @@ static ssize_t adt7316_show_ad(struct adt7316_chip_info *chip,
data |= lsb & ADT7316_LSB_IN_TEMP_MASK;
break;
case ADT7316_AD_SINGLE_CH_VDD:
- ret = chip->bus.read(chip->bus.client,
- ADT7316_LSB_IN_TEMP_VDD, &lsb);
+ ret = regmap_read(chip->regmap, ADT7316_LSB_IN_TEMP_VDD, &lsb);
if (ret)
return -EIO;

- ret = chip->bus.read(chip->bus.client,
-
- ADT7316_AD_MSB_DATA_BASE + channel, &msb);
+ ret = regmap_read(chip->regmap,
+ ADT7316_AD_MSB_DATA_BASE + channel, &msb);
if (ret)
return -EIO;

@@ -1156,13 +1153,12 @@ static ssize_t adt7316_show_ad(struct adt7316_chip_info *chip,
data |= (lsb & ADT7316_LSB_VDD_MASK) >> ADT7316_LSB_VDD_OFFSET;
return sprintf(buf, "%d\n", data);
default: /* ex_temp and ain */
- ret = chip->bus.read(chip->bus.client,
- ADT7316_LSB_EX_TEMP_AIN, &lsb);
+ ret = regmap_read(chip->regmap, ADT7316_LSB_EX_TEMP_AIN, &lsb);
if (ret)
return -EIO;

- ret = chip->bus.read(chip->bus.client,
- ADT7316_AD_MSB_DATA_BASE + channel, &msb);
+ ret = regmap_read(chip->regmap,
+ ADT7316_AD_MSB_DATA_BASE + channel, &msb);
if (ret)
return -EIO;

@@ -1262,10 +1258,10 @@ static ssize_t adt7316_show_temp_offset(struct adt7316_chip_info *chip,
int offset_addr, char *buf)
{
int data;
- u8 val;
+ unsigned int val;
int ret;

- ret = chip->bus.read(chip->bus.client, offset_addr, &val);
+ ret = regmap_read(chip->regmap, offset_addr, &val);
if (ret)
return -EIO;

@@ -1294,7 +1290,7 @@ static ssize_t adt7316_store_temp_offset(struct adt7316_chip_info *chip,

val = (u8)data;

- ret = chip->bus.write(chip->bus.client, offset_addr, val);
+ ret = regmap_write(chip->regmap, offset_addr, val);
if (ret)
return -EIO;

@@ -1411,7 +1407,7 @@ static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip,
int channel, char *buf)
{
u16 data;
- u8 msb, lsb, offset;
+ unsigned int msb, lsb, offset;
int ret;

if (channel >= ADT7316_DA_MSB_DATA_REGS ||
@@ -1424,14 +1420,14 @@ static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip,
offset = chip->dac_bits - 8;

if (chip->dac_bits > 8) {
- ret = chip->bus.read(chip->bus.client,
- ADT7316_DA_DATA_BASE + channel * 2, &lsb);
+ ret = regmap_read(chip->regmap,
+ ADT7316_DA_DATA_BASE + channel * 2, &lsb);
if (ret)
return -EIO;
}

- ret = chip->bus.read(chip->bus.client,
- ADT7316_DA_DATA_BASE + 1 + channel * 2, &msb);
+ ret = regmap_read(chip->regmap, ADT7316_DA_DATA_BASE + 1 + channel * 2,
+ &msb);
if (ret)
return -EIO;

@@ -1462,15 +1458,15 @@ static ssize_t adt7316_store_DAC(struct adt7316_chip_info *chip,

if (chip->dac_bits > 8) {
lsb = data & (1 << offset);
- ret = chip->bus.write(chip->bus.client,
- ADT7316_DA_DATA_BASE + channel * 2, lsb);
+ ret = regmap_write(chip->regmap,
+ ADT7316_DA_DATA_BASE + channel * 2, lsb);
if (ret)
return -EIO;
}

msb = data >> offset;
- ret = chip->bus.write(chip->bus.client,
- ADT7316_DA_DATA_BASE + 1 + channel * 2, msb);
+ ret = regmap_write(chip->regmap, ADT7316_DA_DATA_BASE + 1 + channel * 2,
+ msb);
if (ret)
return -EIO;

@@ -1579,10 +1575,10 @@ static ssize_t adt7316_show_device_id(struct device *dev,
{
struct iio_dev *dev_info = dev_to_iio_dev(dev);
struct adt7316_chip_info *chip = iio_priv(dev_info);
- u8 id;
+ unsigned int id;
int ret;

- ret = chip->bus.read(chip->bus.client, ADT7316_DEVICE_ID, &id);
+ ret = regmap_read(chip->regmap, ADT7316_DEVICE_ID, &id);
if (ret)
return -EIO;

@@ -1597,10 +1593,10 @@ static ssize_t adt7316_show_manufactorer_id(struct device *dev,
{
struct iio_dev *dev_info = dev_to_iio_dev(dev);
struct adt7316_chip_info *chip = iio_priv(dev_info);
- u8 id;
+ unsigned int id;
int ret;

- ret = chip->bus.read(chip->bus.client, ADT7316_MANUFACTURE_ID, &id);
+ ret = regmap_read(chip->regmap, ADT7316_MANUFACTURE_ID, &id);
if (ret)
return -EIO;

@@ -1616,10 +1612,10 @@ static ssize_t adt7316_show_device_rev(struct device *dev,
{
struct iio_dev *dev_info = dev_to_iio_dev(dev);
struct adt7316_chip_info *chip = iio_priv(dev_info);
- u8 rev;
+ unsigned int rev;
int ret;

- ret = chip->bus.read(chip->bus.client, ADT7316_DEVICE_REV, &rev);
+ ret = regmap_read(chip->regmap, ADT7316_DEVICE_REV, &rev);
if (ret)
return -EIO;

@@ -1634,10 +1630,10 @@ static ssize_t adt7316_show_bus_type(struct device *dev,
{
struct iio_dev *dev_info = dev_to_iio_dev(dev);
struct adt7316_chip_info *chip = iio_priv(dev_info);
- u8 stat;
+ unsigned int stat;
int ret;

- ret = chip->bus.read(chip->bus.client, ADT7316_SPI_LOCK_STAT, &stat);
+ ret = regmap_read(chip->regmap, ADT7316_SPI_LOCK_STAT, &stat);
if (ret)
return -EIO;

@@ -1742,11 +1738,11 @@ static irqreturn_t adt7316_event_handler(int irq, void *private)
{
struct iio_dev *indio_dev = private;
struct adt7316_chip_info *chip = iio_priv(indio_dev);
- u8 stat1, stat2;
+ unsigned int stat1, stat2;
int ret;
s64 time;

- ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT1, &stat1);
+ ret = regmap_read(chip->regmap, ADT7316_INT_STAT1, &stat1);
if (!ret) {
if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
stat1 &= 0x1F;
@@ -1795,7 +1791,7 @@ static irqreturn_t adt7316_event_handler(int irq, void *private)
IIO_EV_DIR_EITHER),
time);
}
- ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT2, &stat2);
+ ret = regmap_read(chip->regmap, ADT7316_INT_STAT2, &stat2);
if (!ret) {
if (stat2 & ADT7316_INT_MASK2_VDD)
iio_push_event(indio_dev,
@@ -1881,7 +1877,7 @@ static ssize_t adt7316_set_int_mask(struct device *dev,
else
mask = ADT7316_INT_MASK2_VDD; /* disable vdd int */

- ret = chip->bus.write(chip->bus.client, ADT7316_INT_MASK2, mask);
+ ret = regmap_write(chip->regmap, ADT7316_INT_MASK2, mask);
if (!ret) {
chip->int_mask &= ~ADT7316_VDD_INT_MASK;
chip->int_mask |= data & ADT7316_VDD_INT_MASK;
@@ -1895,7 +1891,7 @@ static ssize_t adt7316_set_int_mask(struct device *dev,
/* mask in reg is opposite, set 1 to disable */
mask = (~data) & ADT7316_TEMP_AIN_INT_MASK;
}
- ret = chip->bus.write(chip->bus.client, ADT7316_INT_MASK1, mask);
+ ret = regmap_write(chip->regmap, ADT7316_INT_MASK1, mask);

chip->int_mask = mask;

@@ -1909,7 +1905,7 @@ static inline ssize_t adt7316_show_ad_bound(struct device *dev,
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
struct iio_dev *dev_info = dev_to_iio_dev(dev);
struct adt7316_chip_info *chip = iio_priv(dev_info);
- u8 val;
+ unsigned int val;
int data;
int ret;

@@ -1917,7 +1913,7 @@ static inline ssize_t adt7316_show_ad_bound(struct device *dev,
this_attr->address > ADT7316_EX_TEMP_LOW)
return -EPERM;

- ret = chip->bus.read(chip->bus.client, this_attr->address, &val);
+ ret = regmap_read(chip->regmap, this_attr->address, &val);
if (ret)
return -EIO;

@@ -1966,7 +1962,7 @@ static inline ssize_t adt7316_set_ad_bound(struct device *dev,

val = (u8)data;

- ret = chip->bus.write(chip->bus.client, this_attr->address, val);
+ ret = regmap_write(chip->regmap, this_attr->address, val);
if (ret)
return -EIO;

@@ -1997,7 +1993,7 @@ static ssize_t adt7316_set_int_enabled(struct device *dev,
if (buf[0] == '1')
config1 |= ADT7316_INT_EN;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG1, config1);
if (ret)
return -EIO;

@@ -2134,7 +2130,7 @@ static const struct iio_info adt7516_info = {
/*
* device probe and remove
*/
-int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
+int adt7316_probe(struct device *dev, struct regmap *regmap,
const char *name, int irq)
{
struct adt7316_chip_info *chip;
@@ -2148,7 +2144,7 @@ int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
/* this is only used for device removal purposes */
dev_set_drvdata(dev, indio_dev);

- chip->bus = *bus;
+ chip->regmap = regmap;

if (name[4] == '3')
chip->id = ID_ADT7316 + (name[6] - '6');
@@ -2187,11 +2183,11 @@ int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
return ret;
}

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, chip->config1);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG1, chip->config1);
if (ret)
return -EIO;

- ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, chip->config3);
+ ret = regmap_write(chip->regmap, ADT7316_CONFIG3, chip->config3);
if (ret)
return -EIO;

diff --git a/drivers/staging/iio/addac/adt7316.h b/drivers/staging/iio/addac/adt7316.h
index e9f288420234..0162d4026e88 100644
--- a/drivers/staging/iio/addac/adt7316.h
+++ b/drivers/staging/iio/addac/adt7316.h
@@ -11,13 +11,13 @@

#include <linux/types.h>
#include <linux/pm.h>
+#include <linux/regmap.h>

#define ADT7316_REG_MAX_ADDR 0x3F

-struct adt7316_bus {
- void *client;
- int (*read)(void *client, u8 reg, u8 *data);
- int (*write)(void *client, u8 reg, u8 val);
+static const struct regmap_config adt7316_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
};

#ifdef CONFIG_PM_SLEEP
@@ -26,7 +26,7 @@ extern const struct dev_pm_ops adt7316_pm_ops;
#else
#define ADT7316_PM_OPS NULL
#endif
-int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
+int adt7316_probe(struct device *dev, struct regmap *regmap,
const char *name, int irq);

#endif
--
2.17.1


2019-01-20 15:39:15

by Shreeya Patel

[permalink] [raw]
Subject: [PATCH v3 2/3] Staging: iio: adt7316: Remove multi read and write functions

Currently, adt7316 doesn't use multi read and multi write
functions hence remove the redundant code and make the
necessary changes in the code.

Signed-off-by: Shreeya Patel <[email protected]>
---
drivers/staging/iio/addac/adt7316-i2c.c | 40 -------------------------
drivers/staging/iio/addac/adt7316-spi.c | 31 ++++---------------
drivers/staging/iio/addac/adt7316.h | 2 --
3 files changed, 6 insertions(+), 67 deletions(-)

diff --git a/drivers/staging/iio/addac/adt7316-i2c.c b/drivers/staging/iio/addac/adt7316-i2c.c
index b6571db2e8d8..c7f82c3fe27c 100644
--- a/drivers/staging/iio/addac/adt7316-i2c.c
+++ b/drivers/staging/iio/addac/adt7316-i2c.c
@@ -52,44 +52,6 @@ static int adt7316_i2c_write(void *client, u8 reg, u8 data)
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, &data[i]);
- if (ret < 0) {
- dev_err(&cl->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(&cl->dev, "I2C multi write error\n");
- return ret;
- }
- }
-
- return 0;
-}
-
/*
* device probe and remove
*/
@@ -101,8 +63,6 @@ static int adt7316_i2c_probe(struct i2c_client *client,
.client = client,
.read = adt7316_i2c_read,
.write = adt7316_i2c_write,
- .multi_read = adt7316_i2c_multi_read,
- .multi_write = adt7316_i2c_multi_write,
};

return adt7316_probe(&client->dev, &bus, id->name, client->irq);
diff --git a/drivers/staging/iio/addac/adt7316-spi.c b/drivers/staging/iio/addac/adt7316-spi.c
index adaaa3eecd04..1a78dc1e2840 100644
--- a/drivers/staging/iio/addac/adt7316-spi.c
+++ b/drivers/staging/iio/addac/adt7316-spi.c
@@ -23,15 +23,12 @@
* adt7316 register access by SPI
*/

-static int adt7316_spi_multi_read(void *client, u8 reg, u8 count, u8 *data)
+static int adt7316_spi_read(void *client, u8 reg, 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;

@@ -43,7 +40,7 @@ static int adt7316_spi_multi_read(void *client, u8 reg, u8 count, u8 *data)

cmd[0] = ADT7316_SPI_CMD_READ;

- ret = spi_write_then_read(spi_dev, cmd, 1, data, count);
+ ret = spi_write_then_read(spi_dev, cmd, 1, data, 1);
if (ret < 0) {
dev_err(&spi_dev->dev, "SPI read data error\n");
return ret;
@@ -52,21 +49,17 @@ static int adt7316_spi_multi_read(void *client, u8 reg, u8 count, u8 *data)
return 0;
}

-static int adt7316_spi_multi_write(void *client, u8 reg, u8 count, u8 *data)
+static int adt7316_spi_write(void *client, u8 reg, u8 val)
{
struct spi_device *spi_dev = client;
u8 buf[ADT7316_REG_MAX_ADDR + 2];
- int i, ret = 0;
-
- if (count > ADT7316_REG_MAX_ADDR)
- count = ADT7316_REG_MAX_ADDR;
+ int ret = 0;

buf[0] = ADT7316_SPI_CMD_WRITE;
buf[1] = reg;
- for (i = 0; i < count; i++)
- buf[i + 2] = data[i];
+ buf[2] = val;

- ret = spi_write(spi_dev, buf, count + 2);
+ ret = spi_write(spi_dev, buf, 3);
if (ret < 0) {
dev_err(&spi_dev->dev, "SPI write error\n");
return ret;
@@ -75,16 +68,6 @@ static int adt7316_spi_multi_write(void *client, u8 reg, u8 count, u8 *data)
return ret;
}

-static int adt7316_spi_read(void *client, u8 reg, u8 *data)
-{
- return adt7316_spi_multi_read(client, reg, 1, data);
-}
-
-static int adt7316_spi_write(void *client, u8 reg, u8 val)
-{
- return adt7316_spi_multi_write(client, reg, 1, &val);
-}
-
/*
* device probe and remove
*/
@@ -95,8 +78,6 @@ static int adt7316_spi_probe(struct spi_device *spi_dev)
.client = spi_dev,
.read = adt7316_spi_read,
.write = adt7316_spi_write,
- .multi_read = adt7316_spi_multi_read,
- .multi_write = adt7316_spi_multi_write,
};

/* don't exceed max specified SPI CLK frequency */
diff --git a/drivers/staging/iio/addac/adt7316.h b/drivers/staging/iio/addac/adt7316.h
index 03d5300a98cd..e9f288420234 100644
--- a/drivers/staging/iio/addac/adt7316.h
+++ b/drivers/staging/iio/addac/adt7316.h
@@ -18,8 +18,6 @@ struct adt7316_bus {
void *client;
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);
};

#ifdef CONFIG_PM_SLEEP
--
2.17.1


2019-01-26 01:24:46

by Jeremy Fertic

[permalink] [raw]
Subject: Re: [PATCH v3 0/3] adt7316 regmap implementation

On Sun, Jan 20, 2019 at 09:06:30PM +0530, Shreeya Patel wrote:
> This patchset consist of some initial patches for heading
> towards the regmap implementation and also the final patch
> which enables the driver to use regmap API thus removing
> the redundant and common code.
>
> Changes in v3
> -Fetch the changes from remote and rebase to have it in
> the current working directory.
>
> Changes in v2
> -Change the val_bits to 8 and add two more patches
> having a different change before the final implemetation
> of regmap.
>
> Shreeya Patel (3):
> Staging: iio: adt7316: Remove irq from bus structure
> Staging: iio: adt7316: Remove multi read and write functions
> Staging: iio: adt7316: Add regmap support
>
> drivers/staging/iio/addac/adt7316-i2c.c | 97 ++--------------
> drivers/staging/iio/addac/adt7316-spi.c | 95 +++------------
> drivers/staging/iio/addac/adt7316.c | 147 ++++++++++++------------
> drivers/staging/iio/addac/adt7316.h | 15 +--
> 4 files changed, 103 insertions(+), 251 deletions(-)
>
> --
> 2.17.1
>

The series doesn't apply to the current iio testing branch. If there's any
value in a quick sanity testing, I can do that after a rebase. I wasn't
planning to test everything the patch touches, but thought I could at
least test a few register reads and writes to make sure we haven't missed
anything obvious in the regmap implementation.

Jeremy


2019-01-26 05:14:53

by Shreeya Patel

[permalink] [raw]
Subject: Re: [PATCH v3 0/3] adt7316 regmap implementation

On Fri, 2019-01-25 at 18:22 -0700, Jeremy Fertic wrote:
> On Sun, Jan 20, 2019 at 09:06:30PM +0530, Shreeya Patel wrote:
> > This patchset consist of some initial patches for heading
> > towards the regmap implementation and also the final patch
> > which enables the driver to use regmap API thus removing
> > the redundant and common code.
> >
> > Changes in v3
> > -Fetch the changes from remote and rebase to have it in
> > the current working directory.
> >
> > Changes in v2
> > -Change the val_bits to 8 and add two more patches
> > having a different change before the final implemetation
> > of regmap.
> >
> > Shreeya Patel (3):
> > Staging: iio: adt7316: Remove irq from bus structure
> > Staging: iio: adt7316: Remove multi read and write functions
> > Staging: iio: adt7316: Add regmap support
> >
> > drivers/staging/iio/addac/adt7316-i2c.c | 97 ++--------------
> > drivers/staging/iio/addac/adt7316-spi.c | 95 +++------------
> > drivers/staging/iio/addac/adt7316.c | 147 ++++++++++++------
> > ------
> > drivers/staging/iio/addac/adt7316.h | 15 +--
> > 4 files changed, 103 insertions(+), 251 deletions(-)
> >
> > --
> > 2.17.1
> >
>
> The series doesn't apply to the current iio testing branch. If
> there's any
> value in a quick sanity testing, I can do that after a rebase. I
> wasn't
> planning to test everything the patch touches, but thought I could at
> least test a few register reads and writes to make sure we haven't
> missed
> anything obvious in the regmap implementation.

Hi Jeremy,

Is it still not applying? Jonathan told me that v2 of this series
wasn't applying so I rebased for this series.

I hope I didn't mess things up while rebasing :(

Thanks

>
> Jeremy
>


2019-01-26 06:19:24

by Shreeya Patel

[permalink] [raw]
Subject: Re: [PATCH v3 0/3] adt7316 regmap implementation

On Sat, 2019-01-26 at 10:42 +0530, Shreeya Patel wrote:
> On Fri, 2019-01-25 at 18:22 -0700, Jeremy Fertic wrote:
> > On Sun, Jan 20, 2019 at 09:06:30PM +0530, Shreeya Patel wrote:
> > > This patchset consist of some initial patches for heading
> > > towards the regmap implementation and also the final patch
> > > which enables the driver to use regmap API thus removing
> > > the redundant and common code.
> > >
> > > Changes in v3
> > > -Fetch the changes from remote and rebase to have it in
> > > the current working directory.
> > >
> > > Changes in v2
> > > -Change the val_bits to 8 and add two more patches
> > > having a different change before the final implemetation
> > > of regmap.
> > >
> > > Shreeya Patel (3):
> > > Staging: iio: adt7316: Remove irq from bus structure
> > > Staging: iio: adt7316: Remove multi read and write functions
> > > Staging: iio: adt7316: Add regmap support
> > >
> > > drivers/staging/iio/addac/adt7316-i2c.c | 97 ++--------------
> > > drivers/staging/iio/addac/adt7316-spi.c | 95 +++------------
> > > drivers/staging/iio/addac/adt7316.c | 147 ++++++++++++------
> > > ------
> > > drivers/staging/iio/addac/adt7316.h | 15 +--
> > > 4 files changed, 103 insertions(+), 251 deletions(-)
> > >
> > > --
> > > 2.17.1
> > >
> >
> > The series doesn't apply to the current iio testing branch. If
> > there's any
> > value in a quick sanity testing, I can do that after a rebase. I
> > wasn't
> > planning to test everything the patch touches, but thought I could
> > at
> > least test a few register reads and writes to make sure we haven't
> > missed
> > anything obvious in the regmap implementation.
>
> Hi Jeremy,
>
> Is it still not applying? Jonathan told me that v2 of this series
> wasn't applying so I rebased for this series.
>
> I hope I didn't mess things up while rebasing :(
>
> Thanks

Yes it is my mistake. I've rebased against greg's staging tree.
I will soon send a v4 for the series.

Thanks

>
> >
> > Jeremy
> >
>
>