* [PATCH v5 1/6] dt-bindings: iio: adc: mcp3911: add support for the whole MCP39xx family
@ 2023-08-14 12:10 Marcus Folkesson
2023-08-14 12:10 ` [PATCH v5 2/6] iio: adc: mcp3911: make use of dev_err_probe() Marcus Folkesson
` (4 more replies)
0 siblings, 5 replies; 15+ messages in thread
From: Marcus Folkesson @ 2023-08-14 12:10 UTC (permalink / raw)
To: Marcus Folkesson, Kent Gustavsson, Jonathan Cameron,
Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Andy Shevchenko, Cosmin Tanislav, Arnd Bergmann,
ChiYuan Huang, Haibo Chen, Ramona Bolboaca, Ibrahim Tilki,
ChiaEn Wu, William Breathitt Gray
Cc: linux-iio, devicetree, linux-kernel, Krzysztof Kozlowski
Microchip does have many similar chips, add those to the compatible
string as the driver support is extended.
The new supported chips are:
- microchip,mcp3910
- microchip,mcp3912
- microchip,mcp3913
- microchip,mcp3914
- microchip,mcp3918
- microchip,mcp3919
Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
Notes:
v2:
- No changes
v3:
- No changes
v4:
- No changes
v5:
- No changes
.../devicetree/bindings/iio/adc/microchip,mcp3911.yaml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Documentation/devicetree/bindings/iio/adc/microchip,mcp3911.yaml b/Documentation/devicetree/bindings/iio/adc/microchip,mcp3911.yaml
index f7b3fde4115a..06951ec5f5da 100644
--- a/Documentation/devicetree/bindings/iio/adc/microchip,mcp3911.yaml
+++ b/Documentation/devicetree/bindings/iio/adc/microchip,mcp3911.yaml
@@ -18,7 +18,13 @@ description: |
properties:
compatible:
enum:
+ - microchip,mcp3910
- microchip,mcp3911
+ - microchip,mcp3912
+ - microchip,mcp3913
+ - microchip,mcp3914
+ - microchip,mcp3918
+ - microchip,mcp3919
reg:
maxItems: 1
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v5 2/6] iio: adc: mcp3911: make use of dev_err_probe()
2023-08-14 12:10 [PATCH v5 1/6] dt-bindings: iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
@ 2023-08-14 12:10 ` Marcus Folkesson
2023-08-15 14:36 ` Andy Shevchenko
2023-08-14 12:10 ` [PATCH v5 3/6] iio: adc: mcp3911: simplify usage of spi->dev Marcus Folkesson
` (3 subsequent siblings)
4 siblings, 1 reply; 15+ messages in thread
From: Marcus Folkesson @ 2023-08-14 12:10 UTC (permalink / raw)
To: Marcus Folkesson, Kent Gustavsson, Jonathan Cameron,
Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Andy Shevchenko, Cosmin Tanislav, Arnd Bergmann,
ChiYuan Huang, Haibo Chen, Ramona Bolboaca, Ibrahim Tilki,
ChiaEn Wu, William Breathitt Gray
Cc: linux-iio, devicetree, linux-kernel
Simplify code by switch to dev_err_probe().
Suggested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
---
Notes:
v5:
- New patch in this series
drivers/iio/adc/mcp3911.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c
index 974c5bd923a6..681248a3ddde 100644
--- a/drivers/iio/adc/mcp3911.c
+++ b/drivers/iio/adc/mcp3911.c
@@ -468,6 +468,7 @@ static int mcp3911_probe(struct spi_device *spi)
{
struct iio_dev *indio_dev;
struct mcp3911 *adc;
+ struct device *dev = &spi->dev;
int ret;
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
@@ -482,10 +483,7 @@ static int mcp3911_probe(struct spi_device *spi)
if (PTR_ERR(adc->vref) == -ENODEV) {
adc->vref = NULL;
} else {
- dev_err(&adc->spi->dev,
- "failed to get regulator (%ld)\n",
- PTR_ERR(adc->vref));
- return PTR_ERR(adc->vref);
+ return dev_err_probe(dev, PTR_ERR(adc->vref), "failed to get regulator\n");
}
} else {
@@ -504,10 +502,7 @@ static int mcp3911_probe(struct spi_device *spi)
if (PTR_ERR(adc->clki) == -ENOENT) {
adc->clki = NULL;
} else {
- dev_err(&adc->spi->dev,
- "failed to get adc clk (%ld)\n",
- PTR_ERR(adc->clki));
- return PTR_ERR(adc->clki);
+ return dev_err_probe(dev, PTR_ERR(adc->clki), "failed to get adc clk\n");
}
}
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v5 3/6] iio: adc: mcp3911: simplify usage of spi->dev
2023-08-14 12:10 [PATCH v5 1/6] dt-bindings: iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
2023-08-14 12:10 ` [PATCH v5 2/6] iio: adc: mcp3911: make use of dev_err_probe() Marcus Folkesson
@ 2023-08-14 12:10 ` Marcus Folkesson
2023-08-15 14:53 ` Andy Shevchenko
2023-08-14 12:10 ` [PATCH v5 4/6] iio: adc: mcp3911: fix indentation Marcus Folkesson
` (2 subsequent siblings)
4 siblings, 1 reply; 15+ messages in thread
From: Marcus Folkesson @ 2023-08-14 12:10 UTC (permalink / raw)
To: Marcus Folkesson, Kent Gustavsson, Jonathan Cameron,
Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Andy Shevchenko, Cosmin Tanislav, Arnd Bergmann,
ChiYuan Huang, Haibo Chen, Ramona Bolboaca, Ibrahim Tilki,
ChiaEn Wu, William Breathitt Gray
Cc: linux-iio, devicetree, linux-kernel
Replace the usage of `adc->spi->dev` with `dev` to make the code prettier.
Suggested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
---
Notes:
v4:
- New patch in this series
v5:
- Introduce `struct device *dev` to more functions
drivers/iio/adc/mcp3911.c | 59 ++++++++++++++++++---------------------
1 file changed, 27 insertions(+), 32 deletions(-)
diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c
index 681248a3ddde..12fa635ed199 100644
--- a/drivers/iio/adc/mcp3911.c
+++ b/drivers/iio/adc/mcp3911.c
@@ -270,6 +270,7 @@ static int mcp3911_write_raw(struct iio_dev *indio_dev,
static int mcp3911_calc_scale_table(struct mcp3911 *adc)
{
u32 ref = MCP3911_INT_VREF_MV;
+ struct device *dev = &adc->spi->dev;
u32 div;
int ret;
u64 tmp;
@@ -277,9 +278,7 @@ static int mcp3911_calc_scale_table(struct mcp3911 *adc)
if (adc->vref) {
ret = regulator_get_voltage(adc->vref);
if (ret < 0) {
- dev_err(&adc->spi->dev,
- "failed to get vref voltage: %d\n",
- ret);
+ dev_err(dev, "failed to get vref voltage: %d\n", ret);
return ret;
}
@@ -337,6 +336,7 @@ static irqreturn_t mcp3911_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct mcp3911 *adc = iio_priv(indio_dev);
+ struct device *dev = &adc->spi->dev;
struct spi_transfer xfer[] = {
{
.tx_buf = &adc->tx_buf,
@@ -354,8 +354,7 @@ static irqreturn_t mcp3911_trigger_handler(int irq, void *p)
adc->tx_buf = MCP3911_REG_READ(MCP3911_CHANNEL(0), adc->dev_addr);
ret = spi_sync_transfer(adc->spi, xfer, ARRAY_SIZE(xfer));
if (ret < 0) {
- dev_warn(&adc->spi->dev,
- "failed to get conversion data\n");
+ dev_warn(dev, "failed to get conversion data\n");
goto out;
}
@@ -396,12 +395,10 @@ static int mcp3911_config(struct mcp3911 *adc)
if (ret)
device_property_read_u32(dev, "device-addr", &adc->dev_addr);
if (adc->dev_addr > 3) {
- dev_err(&adc->spi->dev,
- "invalid device address (%i). Must be in range 0-3.\n",
- adc->dev_addr);
+ dev_err(dev, "invalid device address (%i). Must be in range 0-3.\n", adc->dev_addr);
return -EINVAL;
}
- dev_dbg(&adc->spi->dev, "use device address %i\n", adc->dev_addr);
+ dev_dbg(dev, "use device address %i\n", adc->dev_addr);
ret = mcp3911_read(adc, MCP3911_REG_CONFIG, ®val, 2);
if (ret)
@@ -409,21 +406,19 @@ static int mcp3911_config(struct mcp3911 *adc)
regval &= ~MCP3911_CONFIG_VREFEXT;
if (adc->vref) {
- dev_dbg(&adc->spi->dev, "use external voltage reference\n");
+ dev_dbg(dev, "use external voltage reference\n");
regval |= FIELD_PREP(MCP3911_CONFIG_VREFEXT, 1);
} else {
- dev_dbg(&adc->spi->dev,
- "use internal voltage reference (1.2V)\n");
+ dev_dbg(dev, "use internal voltage reference (1.2V)\n");
regval |= FIELD_PREP(MCP3911_CONFIG_VREFEXT, 0);
}
regval &= ~MCP3911_CONFIG_CLKEXT;
if (adc->clki) {
- dev_dbg(&adc->spi->dev, "use external clock as clocksource\n");
+ dev_dbg(dev, "use external clock as clocksource\n");
regval |= FIELD_PREP(MCP3911_CONFIG_CLKEXT, 1);
} else {
- dev_dbg(&adc->spi->dev,
- "use crystal oscillator as clocksource\n");
+ dev_dbg(dev, "use crystal oscillator as clocksource\n");
regval |= FIELD_PREP(MCP3911_CONFIG_CLKEXT, 0);
}
@@ -471,14 +466,14 @@ static int mcp3911_probe(struct spi_device *spi)
struct device *dev = &spi->dev;
int ret;
- indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*adc));
if (!indio_dev)
return -ENOMEM;
adc = iio_priv(indio_dev);
adc->spi = spi;
- adc->vref = devm_regulator_get_optional(&adc->spi->dev, "vref");
+ adc->vref = devm_regulator_get_optional(dev, "vref");
if (IS_ERR(adc->vref)) {
if (PTR_ERR(adc->vref) == -ENODEV) {
adc->vref = NULL;
@@ -491,13 +486,12 @@ static int mcp3911_probe(struct spi_device *spi)
if (ret)
return ret;
- ret = devm_add_action_or_reset(&spi->dev,
- mcp3911_cleanup_regulator, adc->vref);
+ ret = devm_add_action_or_reset(dev, mcp3911_cleanup_regulator, adc->vref);
if (ret)
return ret;
}
- adc->clki = devm_clk_get_enabled(&adc->spi->dev, NULL);
+ adc->clki = devm_clk_get_enabled(dev, NULL);
if (IS_ERR(adc->clki)) {
if (PTR_ERR(adc->clki) == -ENOENT) {
adc->clki = NULL;
@@ -510,7 +504,7 @@ static int mcp3911_probe(struct spi_device *spi)
if (ret)
return ret;
- if (device_property_read_bool(&adc->spi->dev, "microchip,data-ready-hiz"))
+ if (device_property_read_bool(dev, "microchip,data-ready-hiz"))
ret = mcp3911_update(adc, MCP3911_REG_STATUSCOM, MCP3911_STATUSCOM_DRHIZ,
0, 2);
else
@@ -544,15 +538,15 @@ static int mcp3911_probe(struct spi_device *spi)
mutex_init(&adc->lock);
if (spi->irq > 0) {
- adc->trig = devm_iio_trigger_alloc(&spi->dev, "%s-dev%d",
- indio_dev->name,
- iio_device_id(indio_dev));
+ adc->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
+ indio_dev->name,
+ iio_device_id(indio_dev));
if (!adc->trig)
return -ENOMEM;
adc->trig->ops = &mcp3911_trigger_ops;
iio_trigger_set_drvdata(adc->trig, adc);
- ret = devm_iio_trigger_register(&spi->dev, adc->trig);
+ ret = devm_iio_trigger_register(dev, adc->trig);
if (ret)
return ret;
@@ -561,20 +555,21 @@ static int mcp3911_probe(struct spi_device *spi)
* Some platforms might not allow the option to power it down so
* don't enable the interrupt to avoid extra load on the system.
*/
- ret = devm_request_irq(&spi->dev, spi->irq,
- &iio_trigger_generic_data_rdy_poll, IRQF_NO_AUTOEN | IRQF_ONESHOT,
- indio_dev->name, adc->trig);
+ ret = devm_request_irq(dev, spi->irq,
+ &iio_trigger_generic_data_rdy_poll,
+ IRQF_NO_AUTOEN | IRQF_ONESHOT,
+ indio_dev->name, adc->trig);
if (ret)
return ret;
}
- ret = devm_iio_triggered_buffer_setup(&spi->dev, indio_dev,
- NULL,
- mcp3911_trigger_handler, NULL);
+ ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
+ NULL,
+ mcp3911_trigger_handler, NULL);
if (ret)
return ret;
- return devm_iio_device_register(&adc->spi->dev, indio_dev);
+ return devm_iio_device_register(dev, indio_dev);
}
static const struct of_device_id mcp3911_dt_ids[] = {
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v5 4/6] iio: adc: mcp3911: fix indentation
2023-08-14 12:10 [PATCH v5 1/6] dt-bindings: iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
2023-08-14 12:10 ` [PATCH v5 2/6] iio: adc: mcp3911: make use of dev_err_probe() Marcus Folkesson
2023-08-14 12:10 ` [PATCH v5 3/6] iio: adc: mcp3911: simplify usage of spi->dev Marcus Folkesson
@ 2023-08-14 12:10 ` Marcus Folkesson
2023-08-15 14:58 ` Andy Shevchenko
2023-08-14 12:10 ` [PATCH v5 5/6] iio: adc: mcp3911: avoid ambiguity parameters in macros Marcus Folkesson
2023-08-14 12:10 ` [PATCH v5 6/6] iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
4 siblings, 1 reply; 15+ messages in thread
From: Marcus Folkesson @ 2023-08-14 12:10 UTC (permalink / raw)
To: Marcus Folkesson, Kent Gustavsson, Jonathan Cameron,
Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Andy Shevchenko, Cosmin Tanislav, Arnd Bergmann,
ChiYuan Huang, Haibo Chen, Ramona Bolboaca, Ibrahim Tilki,
ChiaEn Wu, William Breathitt Gray
Cc: linux-iio, devicetree, linux-kernel
The file does not make use of indentation properly.
Fix that.
Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
---
Notes:
v4:
- New patch in this series
v5:
- Cosmetics
drivers/iio/adc/mcp3911.c | 41 +++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c
index 12fa635ed199..1648eaa878eb 100644
--- a/drivers/iio/adc/mcp3911.c
+++ b/drivers/iio/adc/mcp3911.c
@@ -33,7 +33,7 @@
#define MCP3911_GAIN_VAL(ch, val) ((val << 3 * ch) & MCP3911_GAIN_MASK(ch))
#define MCP3911_REG_STATUSCOM 0x0a
-#define MCP3911_STATUSCOM_DRHIZ BIT(12)
+#define MCP3911_STATUSCOM_DRHIZ BIT(12)
#define MCP3911_STATUSCOM_READ GENMASK(7, 6)
#define MCP3911_STATUSCOM_CH1_24WIDTH BIT(4)
#define MCP3911_STATUSCOM_CH0_24WIDTH BIT(3)
@@ -111,8 +111,7 @@ static int mcp3911_write(struct mcp3911 *adc, u8 reg, u32 val, u8 len)
return spi_write(adc->spi, &val, len + 1);
}
-static int mcp3911_update(struct mcp3911 *adc, u8 reg, u32 mask,
- u32 val, u8 len)
+static int mcp3911_update(struct mcp3911 *adc, u8 reg, u32 mask, u32 val, u8 len)
{
u32 tmp;
int ret;
@@ -127,8 +126,8 @@ static int mcp3911_update(struct mcp3911 *adc, u8 reg, u32 mask,
}
static int mcp3911_write_raw_get_fmt(struct iio_dev *indio_dev,
- struct iio_chan_spec const *chan,
- long mask)
+ struct iio_chan_spec const *chan,
+ long mask)
{
switch (mask) {
case IIO_CHAN_INFO_SCALE:
@@ -141,9 +140,9 @@ static int mcp3911_write_raw_get_fmt(struct iio_dev *indio_dev,
}
static int mcp3911_read_avail(struct iio_dev *indio_dev,
- struct iio_chan_spec const *chan,
- const int **vals, int *type, int *length,
- long info)
+ struct iio_chan_spec const *chan,
+ const int **vals, int *type, int *length,
+ long info)
{
switch (info) {
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
@@ -212,8 +211,8 @@ static int mcp3911_read_raw(struct iio_dev *indio_dev,
}
static int mcp3911_write_raw(struct iio_dev *indio_dev,
- struct iio_chan_spec const *channel, int val,
- int val2, long mask)
+ struct iio_chan_spec const *channel, int val,
+ int val2, long mask)
{
struct mcp3911 *adc = iio_priv(indio_dev);
int ret = -EINVAL;
@@ -223,12 +222,12 @@ static int mcp3911_write_raw(struct iio_dev *indio_dev,
case IIO_CHAN_INFO_SCALE:
for (int i = 0; i < MCP3911_NUM_SCALES; i++) {
if (val == mcp3911_scale_table[i][0] &&
- val2 == mcp3911_scale_table[i][1]) {
+ val2 == mcp3911_scale_table[i][1]) {
adc->gain[channel->channel] = BIT(i);
ret = mcp3911_update(adc, MCP3911_REG_GAIN,
- MCP3911_GAIN_MASK(channel->channel),
- MCP3911_GAIN_VAL(channel->channel, i), 1);
+ MCP3911_GAIN_MASK(channel->channel),
+ MCP3911_GAIN_VAL(channel->channel, i), 1);
}
}
break;
@@ -246,8 +245,8 @@ static int mcp3911_write_raw(struct iio_dev *indio_dev,
/* Enable offset*/
ret = mcp3911_update(adc, MCP3911_REG_STATUSCOM,
- MCP3911_STATUSCOM_EN_OFFCAL,
- MCP3911_STATUSCOM_EN_OFFCAL, 2);
+ MCP3911_STATUSCOM_EN_OFFCAL,
+ MCP3911_STATUSCOM_EN_OFFCAL, 2);
break;
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
@@ -255,7 +254,7 @@ static int mcp3911_write_raw(struct iio_dev *indio_dev,
if (val == mcp3911_osr_table[i]) {
val = FIELD_PREP(MCP3911_CONFIG_OSR, i);
ret = mcp3911_update(adc, MCP3911_REG_CONFIG, MCP3911_CONFIG_OSR,
- val, 2);
+ val, 2);
break;
}
}
@@ -506,10 +505,10 @@ static int mcp3911_probe(struct spi_device *spi)
if (device_property_read_bool(dev, "microchip,data-ready-hiz"))
ret = mcp3911_update(adc, MCP3911_REG_STATUSCOM, MCP3911_STATUSCOM_DRHIZ,
- 0, 2);
+ 0, 2);
else
ret = mcp3911_update(adc, MCP3911_REG_STATUSCOM, MCP3911_STATUSCOM_DRHIZ,
- MCP3911_STATUSCOM_DRHIZ, 2);
+ MCP3911_STATUSCOM_DRHIZ, 2);
if (ret)
return ret;
@@ -517,12 +516,12 @@ static int mcp3911_probe(struct spi_device *spi)
if (ret)
return ret;
- /* Set gain to 1 for all channels */
+ /* Set gain to 1 for all channels */
for (int i = 0; i < MCP3911_NUM_CHANNELS; i++) {
adc->gain[i] = 1;
ret = mcp3911_update(adc, MCP3911_REG_GAIN,
- MCP3911_GAIN_MASK(i),
- MCP3911_GAIN_VAL(i, 0), 1);
+ MCP3911_GAIN_MASK(i),
+ MCP3911_GAIN_VAL(i, 0), 1);
if (ret)
return ret;
}
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v5 5/6] iio: adc: mcp3911: avoid ambiguity parameters in macros
2023-08-14 12:10 [PATCH v5 1/6] dt-bindings: iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
` (2 preceding siblings ...)
2023-08-14 12:10 ` [PATCH v5 4/6] iio: adc: mcp3911: fix indentation Marcus Folkesson
@ 2023-08-14 12:10 ` Marcus Folkesson
2023-08-15 14:56 ` Andy Shevchenko
2023-08-14 12:10 ` [PATCH v5 6/6] iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
4 siblings, 1 reply; 15+ messages in thread
From: Marcus Folkesson @ 2023-08-14 12:10 UTC (permalink / raw)
To: Marcus Folkesson, Kent Gustavsson, Jonathan Cameron,
Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Andy Shevchenko, Cosmin Tanislav, Arnd Bergmann,
ChiYuan Huang, Haibo Chen, Ramona Bolboaca, Ibrahim Tilki,
ChiaEn Wu, William Breathitt Gray
Cc: linux-iio, devicetree, linux-kernel
Name macro parameters after what they represent instead of 'x'.
Suggested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
---
Notes:
v5:
- New patch in this series
drivers/iio/adc/mcp3911.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c
index 1648eaa878eb..f1e02aa14e93 100644
--- a/drivers/iio/adc/mcp3911.c
+++ b/drivers/iio/adc/mcp3911.c
@@ -51,8 +51,8 @@
#define MCP3911_REG_GAINCAL_CH1 0x17
#define MCP3911_REG_VREFCAL 0x1a
-#define MCP3911_CHANNEL(x) (MCP3911_REG_CHANNEL0 + x * 3)
-#define MCP3911_OFFCAL(x) (MCP3911_REG_OFFCAL_CH0 + x * 6)
+#define MCP3911_CHANNEL(ch) (MCP3911_REG_CHANNEL0 + ch * 3)
+#define MCP3911_OFFCAL(ch) (MCP3911_REG_OFFCAL_CH0 + ch * 6)
/* Internal voltage reference in mV */
#define MCP3911_INT_VREF_MV 1200
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v5 6/6] iio: adc: mcp3911: add support for the whole MCP39xx family
2023-08-14 12:10 [PATCH v5 1/6] dt-bindings: iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
` (3 preceding siblings ...)
2023-08-14 12:10 ` [PATCH v5 5/6] iio: adc: mcp3911: avoid ambiguity parameters in macros Marcus Folkesson
@ 2023-08-14 12:10 ` Marcus Folkesson
2023-08-15 15:44 ` Andy Shevchenko
4 siblings, 1 reply; 15+ messages in thread
From: Marcus Folkesson @ 2023-08-14 12:10 UTC (permalink / raw)
To: Marcus Folkesson, Kent Gustavsson, Jonathan Cameron,
Lars-Peter Clausen, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Andy Shevchenko, Cosmin Tanislav, Arnd Bergmann,
ChiYuan Huang, Haibo Chen, Ramona Bolboaca, Ibrahim Tilki,
ChiaEn Wu, William Breathitt Gray
Cc: linux-iio, devicetree, linux-kernel
Microchip does have many similar chips, add support for those.
The new supported chips are:
- microchip,mcp3910
- microchip,mcp3912
- microchip,mcp3913
- microchip,mcp3914
- microchip,mcp3918
- microchip,mcp3919
Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
---
Notes:
v2:
- Use callbacks rather than matching against enum for determine chip variants
v3:
- Fix cosmetics
v4:
- Do not pollute output variable upon error in *_get_osr() functions.
- Fix cosmetics
v5:
- Reorder text in Kconfig
- change val to u32 for *_get_osr(), *_set_osr() and *_set_scale()
- avoid ambiguity parameters in macro
drivers/iio/adc/Kconfig | 6 +-
drivers/iio/adc/mcp3911.c | 454 +++++++++++++++++++++++++++++++++-----
2 files changed, 403 insertions(+), 57 deletions(-)
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index eb2b09ef5d5b..2e71a73d8c7d 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -774,8 +774,10 @@ config MCP3911
select IIO_BUFFER
select IIO_TRIGGERED_BUFFER
help
- Say yes here to build support for Microchip Technology's MCP3911
- analog to digital converter.
+ Say yes here to build support for one of the following
+ Microchip Technology's analog to digital converters:
+ MCP3910, MCP3911, MCP3912, MCP3913, MCP3914,
+ MCP3918 and MCP3919.
This driver can also be built as a module. If so, the module will be
called mcp3911.
diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c
index f1e02aa14e93..6c4605c8f09d 100644
--- a/drivers/iio/adc/mcp3911.c
+++ b/drivers/iio/adc/mcp3911.c
@@ -61,12 +61,55 @@
#define MCP3911_REG_WRITE(reg, id) ((((reg) << 1) | ((id) << 6) | (0 << 0)) & 0xff)
#define MCP3911_REG_MASK GENMASK(4, 1)
-#define MCP3911_NUM_CHANNELS 2
#define MCP3911_NUM_SCALES 6
+/* Registers compatible with MCP3910 */
+#define MCP3910_REG_STATUSCOM 0x0c
+#define MCP3910_STATUSCOM_READ GENMASK(23, 22)
+#define MCP3910_STATUSCOM_DRHIZ BIT(20)
+
+#define MCP3910_REG_GAIN 0x0b
+
+#define MCP3910_REG_CONFIG0 0x0d
+#define MCP3910_CONFIG0_EN_OFFCAL BIT(23)
+#define MCP3910_CONFIG0_OSR GENMASK(15, 13)
+
+#define MCP3910_REG_CONFIG1 0x0e
+#define MCP3910_CONFIG1_CLKEXT BIT(6)
+#define MCP3910_CONFIG1_VREFEXT BIT(7)
+
+#define MCP3910_REG_OFFCAL_CH0 0x0f
+#define MCP3910_OFFCAL(ch) (MCP3910_REG_OFFCAL_CH0 + ch * 6)
+
+/* Maximal number of channels used by the MCP39XX family */
+#define MCP39XX_MAX_NUM_CHANNELS 8
+
static const int mcp3911_osr_table[] = { 32, 64, 128, 256, 512, 1024, 2048, 4096 };
static u32 mcp3911_scale_table[MCP3911_NUM_SCALES][2];
+enum mcp3911_id {
+ MCP3910,
+ MCP3911,
+ MCP3912,
+ MCP3913,
+ MCP3914,
+ MCP3918,
+ MCP3919,
+};
+
+struct mcp3911;
+struct mcp3911_chip_info {
+ const struct iio_chan_spec *channels;
+ unsigned int num_channels;
+
+ int (*config)(struct mcp3911 *adc);
+ int (*get_osr)(struct mcp3911 *adc, u32 *val);
+ int (*set_osr)(struct mcp3911 *adc, u32 val);
+ int (*get_offset)(struct mcp3911 *adc, int channel, int *val);
+ int (*set_offset)(struct mcp3911 *adc, int channel, int val);
+ int (*set_scale)(struct mcp3911 *adc, int channel, u32 val);
+};
+
struct mcp3911 {
struct spi_device *spi;
struct mutex lock;
@@ -74,14 +117,15 @@ struct mcp3911 {
struct clk *clki;
u32 dev_addr;
struct iio_trigger *trig;
- u32 gain[MCP3911_NUM_CHANNELS];
+ u32 gain[MCP39XX_MAX_NUM_CHANNELS];
+ const struct mcp3911_chip_info *chip;
struct {
- u32 channels[MCP3911_NUM_CHANNELS];
+ u32 channels[MCP39XX_MAX_NUM_CHANNELS];
s64 ts __aligned(8);
} scan;
u8 tx_buf __aligned(IIO_DMA_MINALIGN);
- u8 rx_buf[MCP3911_NUM_CHANNELS * 3];
+ u8 rx_buf[MCP39XX_MAX_NUM_CHANNELS * 3];
};
static int mcp3911_read(struct mcp3911 *adc, u8 reg, u32 *val, u8 len)
@@ -125,6 +169,102 @@ static int mcp3911_update(struct mcp3911 *adc, u8 reg, u32 mask, u32 val, u8 len
return mcp3911_write(adc, reg, val, len);
}
+static int mcp3910_get_offset(struct mcp3911 *adc, int channel, int *val)
+{
+ return mcp3911_read(adc, MCP3910_OFFCAL(channel), val, 3);
+}
+
+static int mcp3910_set_offset(struct mcp3911 *adc, int channel, int val)
+{
+ int ret;
+
+ /* Write offset */
+ ret = mcp3911_write(adc, MCP3910_OFFCAL(channel), val, 3);
+ if (ret)
+ return ret;
+
+ /* Enable offset*/
+ return mcp3911_update(adc, MCP3910_REG_CONFIG0,
+ MCP3910_CONFIG0_EN_OFFCAL,
+ MCP3910_CONFIG0_EN_OFFCAL, 3);
+}
+
+static int mcp3911_get_offset(struct mcp3911 *adc, int channel, int *val)
+{
+ return mcp3911_read(adc, MCP3911_OFFCAL(channel), val, 3);
+}
+
+static int mcp3911_set_offset(struct mcp3911 *adc, int channel, int val)
+{
+ int ret;
+
+ /* Write offset */
+ ret = mcp3911_write(adc, MCP3911_OFFCAL(channel), val, 3);
+ if (ret)
+ return ret;
+
+ /* Enable offset */
+ return mcp3911_update(adc, MCP3911_REG_STATUSCOM,
+ MCP3911_STATUSCOM_EN_OFFCAL,
+ MCP3911_STATUSCOM_EN_OFFCAL, 2);
+}
+
+static int mcp3910_get_osr(struct mcp3911 *adc, u32 *val)
+{
+ int ret, osr;
+
+ ret = mcp3911_read(adc, MCP3910_REG_CONFIG0, val, 3);
+ if (ret)
+ return ret;
+
+ osr = FIELD_GET(MCP3910_CONFIG0_OSR, *val);
+ *val = 32 << osr;
+ return ret;
+}
+
+static int mcp3910_set_osr(struct mcp3911 *adc, u32 val)
+{
+ int osr = FIELD_PREP(MCP3910_CONFIG0_OSR, val);
+
+ return mcp3911_update(adc, MCP3910_REG_CONFIG0,
+ MCP3910_CONFIG0_OSR, osr, 3);
+}
+
+static int mcp3911_set_osr(struct mcp3911 *adc, u32 val)
+{
+ int osr = FIELD_PREP(MCP3911_CONFIG_OSR, val);
+
+ return mcp3911_update(adc, MCP3911_REG_CONFIG,
+ MCP3911_CONFIG_OSR, osr, 2);
+}
+
+static int mcp3911_get_osr(struct mcp3911 *adc, u32 *val)
+{
+ int ret, osr;
+
+ ret = mcp3911_read(adc, MCP3911_REG_CONFIG, val, 2);
+ if (ret)
+ return ret;
+
+ osr = FIELD_GET(MCP3911_CONFIG_OSR, *val);
+ *val = 32 << osr;
+ return ret;
+}
+
+static int mcp3910_set_scale(struct mcp3911 *adc, int channel, u32 val)
+{
+ return mcp3911_update(adc, MCP3910_REG_GAIN,
+ MCP3911_GAIN_MASK(channel),
+ MCP3911_GAIN_VAL(channel, val), 3);
+}
+
+static int mcp3911_set_scale(struct mcp3911 *adc, int channel, u32 val)
+{
+ return mcp3911_update(adc, MCP3911_REG_GAIN,
+ MCP3911_GAIN_MASK(channel),
+ MCP3911_GAIN_VAL(channel, val), 1);
+}
+
static int mcp3911_write_raw_get_fmt(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan,
long mask)
@@ -181,20 +321,18 @@ static int mcp3911_read_raw(struct iio_dev *indio_dev,
break;
case IIO_CHAN_INFO_OFFSET:
- ret = mcp3911_read(adc,
- MCP3911_OFFCAL(channel->channel), val, 3);
+
+ ret = adc->chip->get_offset(adc, channel->channel, val);
if (ret)
goto out;
ret = IIO_VAL_INT;
break;
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
- ret = mcp3911_read(adc, MCP3911_REG_CONFIG, val, 2);
+ ret = adc->chip->get_osr(adc, val);
if (ret)
goto out;
- *val = FIELD_GET(MCP3911_CONFIG_OSR, *val);
- *val = 32 << *val;
ret = IIO_VAL_INT;
break;
@@ -225,9 +363,7 @@ static int mcp3911_write_raw(struct iio_dev *indio_dev,
val2 == mcp3911_scale_table[i][1]) {
adc->gain[channel->channel] = BIT(i);
- ret = mcp3911_update(adc, MCP3911_REG_GAIN,
- MCP3911_GAIN_MASK(channel->channel),
- MCP3911_GAIN_VAL(channel->channel, i), 1);
+ ret = adc->chip->set_scale(adc, channel->channel, i);
}
}
break;
@@ -237,24 +373,13 @@ static int mcp3911_write_raw(struct iio_dev *indio_dev,
goto out;
}
- /* Write offset */
- ret = mcp3911_write(adc, MCP3911_OFFCAL(channel->channel), val,
- 3);
- if (ret)
- goto out;
-
- /* Enable offset*/
- ret = mcp3911_update(adc, MCP3911_REG_STATUSCOM,
- MCP3911_STATUSCOM_EN_OFFCAL,
- MCP3911_STATUSCOM_EN_OFFCAL, 2);
+ ret = adc->chip->set_offset(adc, channel->channel, val);
break;
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
for (int i = 0; i < ARRAY_SIZE(mcp3911_osr_table); i++) {
if (val == mcp3911_osr_table[i]) {
- val = FIELD_PREP(MCP3911_CONFIG_OSR, i);
- ret = mcp3911_update(adc, MCP3911_REG_CONFIG, MCP3911_CONFIG_OSR,
- val, 2);
+ ret = adc->chip->set_osr(adc, i);
break;
}
}
@@ -324,12 +449,60 @@ static int mcp3911_calc_scale_table(struct mcp3911 *adc)
}, \
}
+static const struct iio_chan_spec mcp3910_channels[] = {
+ MCP3911_CHAN(0),
+ MCP3911_CHAN(1),
+ IIO_CHAN_SOFT_TIMESTAMP(2),
+};
+
static const struct iio_chan_spec mcp3911_channels[] = {
MCP3911_CHAN(0),
MCP3911_CHAN(1),
IIO_CHAN_SOFT_TIMESTAMP(2),
};
+static const struct iio_chan_spec mcp3912_channels[] = {
+ MCP3911_CHAN(0),
+ MCP3911_CHAN(1),
+ MCP3911_CHAN(2),
+ MCP3911_CHAN(3),
+ IIO_CHAN_SOFT_TIMESTAMP(4),
+};
+
+static const struct iio_chan_spec mcp3913_channels[] = {
+ MCP3911_CHAN(0),
+ MCP3911_CHAN(1),
+ MCP3911_CHAN(2),
+ MCP3911_CHAN(3),
+ MCP3911_CHAN(4),
+ MCP3911_CHAN(5),
+ IIO_CHAN_SOFT_TIMESTAMP(6),
+};
+
+static const struct iio_chan_spec mcp3914_channels[] = {
+ MCP3911_CHAN(0),
+ MCP3911_CHAN(1),
+ MCP3911_CHAN(2),
+ MCP3911_CHAN(3),
+ MCP3911_CHAN(4),
+ MCP3911_CHAN(5),
+ MCP3911_CHAN(6),
+ MCP3911_CHAN(7),
+ IIO_CHAN_SOFT_TIMESTAMP(8),
+};
+
+static const struct iio_chan_spec mcp3918_channels[] = {
+ MCP3911_CHAN(0),
+ IIO_CHAN_SOFT_TIMESTAMP(1),
+};
+
+static const struct iio_chan_spec mcp3919_channels[] = {
+ MCP3911_CHAN(0),
+ MCP3911_CHAN(1),
+ MCP3911_CHAN(2),
+ IIO_CHAN_SOFT_TIMESTAMP(3),
+};
+
static irqreturn_t mcp3911_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
@@ -342,7 +515,7 @@ static irqreturn_t mcp3911_trigger_handler(int irq, void *p)
.len = 1,
}, {
.rx_buf = adc->rx_buf,
- .len = sizeof(adc->rx_buf),
+ .len = (adc->chip->num_channels - 1) * 3,
},
};
int scan_index;
@@ -381,23 +554,9 @@ static const struct iio_info mcp3911_info = {
static int mcp3911_config(struct mcp3911 *adc)
{
- struct device *dev = &adc->spi->dev;
u32 regval;
int ret;
-
- ret = device_property_read_u32(dev, "microchip,device-addr", &adc->dev_addr);
-
- /*
- * Fallback to "device-addr" due to historical mismatch between
- * dt-bindings and implementation
- */
- if (ret)
- device_property_read_u32(dev, "device-addr", &adc->dev_addr);
- if (adc->dev_addr > 3) {
- dev_err(dev, "invalid device address (%i). Must be in range 0-3.\n", adc->dev_addr);
- return -EINVAL;
- }
- dev_dbg(dev, "use device address %i\n", adc->dev_addr);
+ struct device *dev = &adc->spi->dev;
ret = mcp3911_read(adc, MCP3911_REG_CONFIG, ®val, 2);
if (ret)
@@ -433,7 +592,102 @@ static int mcp3911_config(struct mcp3911 *adc)
regval &= ~MCP3911_STATUSCOM_READ;
regval |= FIELD_PREP(MCP3911_STATUSCOM_READ, 0x02);
- return mcp3911_write(adc, MCP3911_REG_STATUSCOM, regval, 2);
+ regval &= ~MCP3911_STATUSCOM_DRHIZ;
+ if (device_property_read_bool(dev, "microchip,data-ready-hiz"))
+ regval |= FIELD_PREP(MCP3911_STATUSCOM_DRHIZ, 0);
+ else
+ regval |= FIELD_PREP(MCP3911_STATUSCOM_DRHIZ, 1);
+
+ /* Disable offset to ignore any old values in offset register*/
+ regval &= ~MCP3911_STATUSCOM_EN_OFFCAL;
+
+ ret = mcp3911_write(adc, MCP3911_REG_STATUSCOM, regval, 2);
+ if (ret)
+ return ret;
+
+ /* Set gain to 1 for all channels */
+ ret = mcp3911_read(adc, MCP3911_REG_GAIN, ®val, 1);
+ if (ret)
+ return ret;
+
+ for (int i = 0; i < adc->chip->num_channels - 1; i++) {
+ adc->gain[i] = 1;
+ regval &= ~MCP3911_GAIN_MASK(i);
+ }
+
+ return mcp3911_write(adc, MCP3911_REG_GAIN, regval, 1);
+}
+
+static int mcp3910_config(struct mcp3911 *adc)
+{
+ u32 regval;
+ int ret;
+ struct device *dev = &adc->spi->dev;
+
+ ret = mcp3911_read(adc, MCP3910_REG_CONFIG1, ®val, 3);
+ if (ret)
+ return ret;
+
+ regval &= ~MCP3910_CONFIG1_VREFEXT;
+ if (adc->vref) {
+ dev_dbg(dev, "use external voltage reference\n");
+ regval |= FIELD_PREP(MCP3910_CONFIG1_VREFEXT, 1);
+ } else {
+ dev_dbg(dev,
+ "use internal voltage reference (1.2V)\n");
+ regval |= FIELD_PREP(MCP3910_CONFIG1_VREFEXT, 0);
+ }
+
+ regval &= ~MCP3910_CONFIG1_CLKEXT;
+ if (adc->clki) {
+ dev_dbg(dev, "use external clock as clocksource\n");
+ regval |= FIELD_PREP(MCP3910_CONFIG1_CLKEXT, 1);
+ } else {
+ dev_dbg(dev,
+ "use crystal oscillator as clocksource\n");
+ regval |= FIELD_PREP(MCP3910_CONFIG1_CLKEXT, 0);
+ }
+
+ ret = mcp3911_write(adc, MCP3910_REG_CONFIG1, regval, 3);
+ if (ret)
+ return ret;
+
+ ret = mcp3911_read(adc, MCP3910_REG_STATUSCOM, ®val, 3);
+ if (ret)
+ return ret;
+
+ /* Address counter incremented, cycle through register types */
+ regval &= ~MCP3910_STATUSCOM_READ;
+ regval |= FIELD_PREP(MCP3910_STATUSCOM_READ, 0x02);
+
+
+ regval &= ~MCP3910_STATUSCOM_DRHIZ;
+ if (device_property_present(dev, "microchip,data-ready-hiz"))
+ regval |= FIELD_PREP(MCP3910_STATUSCOM_DRHIZ, 0);
+ else
+ regval |= FIELD_PREP(MCP3910_STATUSCOM_DRHIZ, 1);
+
+ ret = mcp3911_write(adc, MCP3910_REG_STATUSCOM, regval, 3);
+ if (ret)
+ return ret;
+
+ /* Set gain to 1 for all channels */
+ ret = mcp3911_read(adc, MCP3910_REG_GAIN, ®val, 3);
+ if (ret)
+ return ret;
+
+ for (int i = 0; i < adc->chip->num_channels - 1; i++) {
+ adc->gain[i] = 1;
+ regval &= ~MCP3911_GAIN_MASK(i);
+ }
+ ret = mcp3911_write(adc, MCP3910_REG_GAIN, regval, 3);
+ if (ret)
+ return ret;
+
+ /* Disable offset to ignore any old values in offset register */
+ return mcp3911_update(adc, MCP3910_REG_CONFIG0,
+ MCP3910_CONFIG0_EN_OFFCAL,
+ MCP3910_CONFIG0_EN_OFFCAL, 3);
}
static void mcp3911_cleanup_regulator(void *vref)
@@ -471,6 +725,7 @@ static int mcp3911_probe(struct spi_device *spi)
adc = iio_priv(indio_dev);
adc->spi = spi;
+ adc->chip = spi_get_device_match_data(spi);
adc->vref = devm_regulator_get_optional(dev, "vref");
if (IS_ERR(adc->vref)) {
@@ -499,16 +754,21 @@ static int mcp3911_probe(struct spi_device *spi)
}
}
- ret = mcp3911_config(adc);
+ /*
+ * Fallback to "device-addr" due to historical mismatch between
+ * dt-bindings and implementation.
+ */
+ ret = device_property_read_u32(dev, "microchip,device-addr", &adc->dev_addr);
if (ret)
- return ret;
+ device_property_read_u32(dev, "device-addr", &adc->dev_addr);
+ if (adc->dev_addr > 3) {
+ dev_err_probe(dev, -EINVAL,
+ "invalid device address (%i). Must be in range 0-3.\n",
+ adc->dev_addr);
+ }
+ dev_dbg(dev, "use device address %i\n", adc->dev_addr);
- if (device_property_read_bool(dev, "microchip,data-ready-hiz"))
- ret = mcp3911_update(adc, MCP3911_REG_STATUSCOM, MCP3911_STATUSCOM_DRHIZ,
- 0, 2);
- else
- ret = mcp3911_update(adc, MCP3911_REG_STATUSCOM, MCP3911_STATUSCOM_DRHIZ,
- MCP3911_STATUSCOM_DRHIZ, 2);
+ ret = adc->chip->config(adc);
if (ret)
return ret;
@@ -517,7 +777,7 @@ static int mcp3911_probe(struct spi_device *spi)
return ret;
/* Set gain to 1 for all channels */
- for (int i = 0; i < MCP3911_NUM_CHANNELS; i++) {
+ for (int i = 0; i < adc->chip->num_channels - 1; i++) {
adc->gain[i] = 1;
ret = mcp3911_update(adc, MCP3911_REG_GAIN,
MCP3911_GAIN_MASK(i),
@@ -531,8 +791,8 @@ static int mcp3911_probe(struct spi_device *spi)
indio_dev->info = &mcp3911_info;
spi_set_drvdata(spi, indio_dev);
- indio_dev->channels = mcp3911_channels;
- indio_dev->num_channels = ARRAY_SIZE(mcp3911_channels);
+ indio_dev->channels = adc->chip->channels;
+ indio_dev->num_channels = adc->chip->num_channels;
mutex_init(&adc->lock);
@@ -571,14 +831,98 @@ static int mcp3911_probe(struct spi_device *spi)
return devm_iio_device_register(dev, indio_dev);
}
+static const struct mcp3911_chip_info mcp3911_chip_info[] = {
+ [MCP3910] = {
+ .channels = mcp3910_channels,
+ .num_channels = ARRAY_SIZE(mcp3910_channels),
+ .config = mcp3910_config,
+ .get_osr = mcp3910_get_osr,
+ .set_osr = mcp3910_set_osr,
+ .get_offset = mcp3910_get_offset,
+ .set_offset = mcp3910_set_offset,
+ .set_scale = mcp3910_set_scale,
+ },
+ [MCP3911] = {
+ .channels = mcp3911_channels,
+ .num_channels = ARRAY_SIZE(mcp3911_channels),
+ .config = mcp3911_config,
+ .get_osr = mcp3911_get_osr,
+ .set_osr = mcp3911_set_osr,
+ .get_offset = mcp3911_get_offset,
+ .set_offset = mcp3911_set_offset,
+ .set_scale = mcp3911_set_scale,
+ },
+ [MCP3912] = {
+ .channels = mcp3912_channels,
+ .num_channels = ARRAY_SIZE(mcp3912_channels),
+ .config = mcp3910_config,
+ .get_osr = mcp3910_get_osr,
+ .set_osr = mcp3910_set_osr,
+ .get_offset = mcp3910_get_offset,
+ .set_offset = mcp3910_set_offset,
+ .set_scale = mcp3910_set_scale,
+ },
+ [MCP3913] = {
+ .channels = mcp3913_channels,
+ .num_channels = ARRAY_SIZE(mcp3913_channels),
+ .config = mcp3910_config,
+ .get_osr = mcp3910_get_osr,
+ .set_osr = mcp3910_set_osr,
+ .get_offset = mcp3910_get_offset,
+ .set_offset = mcp3910_set_offset,
+ .set_scale = mcp3910_set_scale,
+ },
+ [MCP3914] = {
+ .channels = mcp3914_channels,
+ .num_channels = ARRAY_SIZE(mcp3914_channels),
+ .config = mcp3910_config,
+ .get_osr = mcp3910_get_osr,
+ .set_osr = mcp3910_set_osr,
+ .get_offset = mcp3910_get_offset,
+ .set_offset = mcp3910_set_offset,
+ .set_scale = mcp3910_set_scale,
+ },
+ [MCP3918] = {
+ .channels = mcp3918_channels,
+ .num_channels = ARRAY_SIZE(mcp3918_channels),
+ .config = mcp3910_config,
+ .get_osr = mcp3910_get_osr,
+ .set_osr = mcp3910_set_osr,
+ .get_offset = mcp3910_get_offset,
+ .set_offset = mcp3910_set_offset,
+ .set_scale = mcp3910_set_scale,
+ },
+ [MCP3919] = {
+ .channels = mcp3919_channels,
+ .num_channels = ARRAY_SIZE(mcp3919_channels),
+ .config = mcp3910_config,
+ .get_osr = mcp3910_get_osr,
+ .set_osr = mcp3910_set_osr,
+ .get_offset = mcp3910_get_offset,
+ .set_offset = mcp3910_set_offset,
+ .set_scale = mcp3910_set_scale,
+ },
+};
static const struct of_device_id mcp3911_dt_ids[] = {
- { .compatible = "microchip,mcp3911" },
+ { .compatible = "microchip,mcp3910", .data = &mcp3911_chip_info[MCP3910] },
+ { .compatible = "microchip,mcp3911", .data = &mcp3911_chip_info[MCP3911] },
+ { .compatible = "microchip,mcp3912", .data = &mcp3911_chip_info[MCP3912] },
+ { .compatible = "microchip,mcp3913", .data = &mcp3911_chip_info[MCP3913] },
+ { .compatible = "microchip,mcp3914", .data = &mcp3911_chip_info[MCP3914] },
+ { .compatible = "microchip,mcp3918", .data = &mcp3911_chip_info[MCP3918] },
+ { .compatible = "microchip,mcp3919", .data = &mcp3911_chip_info[MCP3919] },
{ }
};
MODULE_DEVICE_TABLE(of, mcp3911_dt_ids);
static const struct spi_device_id mcp3911_id[] = {
- { "mcp3911", 0 },
+ { "mcp3910", (kernel_ulong_t)&mcp3911_chip_info[MCP3910] },
+ { "mcp3911", (kernel_ulong_t)&mcp3911_chip_info[MCP3911] },
+ { "mcp3912", (kernel_ulong_t)&mcp3911_chip_info[MCP3912] },
+ { "mcp3913", (kernel_ulong_t)&mcp3911_chip_info[MCP3913] },
+ { "mcp3914", (kernel_ulong_t)&mcp3911_chip_info[MCP3914] },
+ { "mcp3918", (kernel_ulong_t)&mcp3911_chip_info[MCP3918] },
+ { "mcp3919", (kernel_ulong_t)&mcp3911_chip_info[MCP3919] },
{ }
};
MODULE_DEVICE_TABLE(spi, mcp3911_id);
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v5 2/6] iio: adc: mcp3911: make use of dev_err_probe()
2023-08-14 12:10 ` [PATCH v5 2/6] iio: adc: mcp3911: make use of dev_err_probe() Marcus Folkesson
@ 2023-08-15 14:36 ` Andy Shevchenko
0 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2023-08-15 14:36 UTC (permalink / raw)
To: Marcus Folkesson
Cc: Kent Gustavsson, Jonathan Cameron, Lars-Peter Clausen,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cosmin Tanislav,
Arnd Bergmann, ChiYuan Huang, Haibo Chen, Ramona Bolboaca,
Ibrahim Tilki, ChiaEn Wu, William Breathitt Gray, linux-iio,
devicetree, linux-kernel
On Mon, Aug 14, 2023 at 02:10:06PM +0200, Marcus Folkesson wrote:
> Simplify code by switch to dev_err_probe().
>
> Suggested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
> ---
>
> Notes:
> v5:
> - New patch in this series
>
> drivers/iio/adc/mcp3911.c | 11 +++--------
> 1 file changed, 3 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c
> index 974c5bd923a6..681248a3ddde 100644
> --- a/drivers/iio/adc/mcp3911.c
> +++ b/drivers/iio/adc/mcp3911.c
> @@ -468,6 +468,7 @@ static int mcp3911_probe(struct spi_device *spi)
> {
> struct iio_dev *indio_dev;
> struct mcp3911 *adc;
> + struct device *dev = &spi->dev;
> int ret;
With preserved reversed xmas tree order (longer line comes first),
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
> @@ -482,10 +483,7 @@ static int mcp3911_probe(struct spi_device *spi)
> if (PTR_ERR(adc->vref) == -ENODEV) {
> adc->vref = NULL;
> } else {
> - dev_err(&adc->spi->dev,
> - "failed to get regulator (%ld)\n",
> - PTR_ERR(adc->vref));
> - return PTR_ERR(adc->vref);
> + return dev_err_probe(dev, PTR_ERR(adc->vref), "failed to get regulator\n");
> }
>
> } else {
> @@ -504,10 +502,7 @@ static int mcp3911_probe(struct spi_device *spi)
> if (PTR_ERR(adc->clki) == -ENOENT) {
> adc->clki = NULL;
> } else {
> - dev_err(&adc->spi->dev,
> - "failed to get adc clk (%ld)\n",
> - PTR_ERR(adc->clki));
> - return PTR_ERR(adc->clki);
> + return dev_err_probe(dev, PTR_ERR(adc->clki), "failed to get adc clk\n");
> }
> }
>
> --
> 2.41.0
>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 3/6] iio: adc: mcp3911: simplify usage of spi->dev
2023-08-14 12:10 ` [PATCH v5 3/6] iio: adc: mcp3911: simplify usage of spi->dev Marcus Folkesson
@ 2023-08-15 14:53 ` Andy Shevchenko
0 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2023-08-15 14:53 UTC (permalink / raw)
To: Marcus Folkesson
Cc: Kent Gustavsson, Jonathan Cameron, Lars-Peter Clausen,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cosmin Tanislav,
Arnd Bergmann, ChiYuan Huang, Haibo Chen, Ramona Bolboaca,
Ibrahim Tilki, ChiaEn Wu, William Breathitt Gray, linux-iio,
devicetree, linux-kernel
On Mon, Aug 14, 2023 at 02:10:07PM +0200, Marcus Folkesson wrote:
> Replace the usage of `adc->spi->dev` with `dev` to make the code prettier.
...
> u32 ref = MCP3911_INT_VREF_MV;
> + struct device *dev = &adc->spi->dev;
Keep it upper.
> u32 div;
> int ret;
> u64 tmp;
...
> + ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
> + NULL,
This can be moved to the upper line.
> + mcp3911_trigger_handler, NULL);
> if (ret)
> return ret;
...
With above addressed,
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 5/6] iio: adc: mcp3911: avoid ambiguity parameters in macros
2023-08-14 12:10 ` [PATCH v5 5/6] iio: adc: mcp3911: avoid ambiguity parameters in macros Marcus Folkesson
@ 2023-08-15 14:56 ` Andy Shevchenko
2023-08-15 16:49 ` Marcus Folkesson
0 siblings, 1 reply; 15+ messages in thread
From: Andy Shevchenko @ 2023-08-15 14:56 UTC (permalink / raw)
To: Marcus Folkesson
Cc: Kent Gustavsson, Jonathan Cameron, Lars-Peter Clausen,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cosmin Tanislav,
Arnd Bergmann, ChiYuan Huang, Haibo Chen, Ramona Bolboaca,
Ibrahim Tilki, ChiaEn Wu, William Breathitt Gray, linux-iio,
devicetree, linux-kernel
On Mon, Aug 14, 2023 at 02:10:09PM +0200, Marcus Folkesson wrote:
> Name macro parameters after what they represent instead of 'x'.
Yes, but it's not my suggestion, what I was talking about is how macro
parameters being treated.
This change doesn't make the problem go away.
Per se, this one is good for its purposes.
> Suggested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This shouldn't be here.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 4/6] iio: adc: mcp3911: fix indentation
2023-08-14 12:10 ` [PATCH v5 4/6] iio: adc: mcp3911: fix indentation Marcus Folkesson
@ 2023-08-15 14:58 ` Andy Shevchenko
2023-08-15 16:55 ` Marcus Folkesson
0 siblings, 1 reply; 15+ messages in thread
From: Andy Shevchenko @ 2023-08-15 14:58 UTC (permalink / raw)
To: Marcus Folkesson
Cc: Kent Gustavsson, Jonathan Cameron, Lars-Peter Clausen,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cosmin Tanislav,
Arnd Bergmann, ChiYuan Huang, Haibo Chen, Ramona Bolboaca,
Ibrahim Tilki, ChiaEn Wu, William Breathitt Gray, linux-iio,
devicetree, linux-kernel
On Mon, Aug 14, 2023 at 02:10:08PM +0200, Marcus Folkesson wrote:
> The file does not make use of indentation properly.
> Fix that.
I'm not sure this is anyhow a fix. Yet you may refer to the checkpatch
if it complains.
...
This kind of change is preferred to be the last in the series or closer
to the end where no more code changed.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 6/6] iio: adc: mcp3911: add support for the whole MCP39xx family
2023-08-14 12:10 ` [PATCH v5 6/6] iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
@ 2023-08-15 15:44 ` Andy Shevchenko
0 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2023-08-15 15:44 UTC (permalink / raw)
To: Marcus Folkesson
Cc: Kent Gustavsson, Jonathan Cameron, Lars-Peter Clausen,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cosmin Tanislav,
Arnd Bergmann, ChiYuan Huang, Haibo Chen, Ramona Bolboaca,
Ibrahim Tilki, ChiaEn Wu, William Breathitt Gray, linux-iio,
devicetree, linux-kernel
On Mon, Aug 14, 2023 at 02:10:10PM +0200, Marcus Folkesson wrote:
> Microchip does have many similar chips, add support for those.
>
> The new supported chips are:
> - microchip,mcp3910
> - microchip,mcp3912
> - microchip,mcp3913
> - microchip,mcp3914
> - microchip,mcp3918
> - microchip,mcp3919
...
> struct {
> - u32 channels[MCP3911_NUM_CHANNELS];
> + u32 channels[MCP39XX_MAX_NUM_CHANNELS];
> s64 ts __aligned(8);
Can we actually have the __aligned_s64 defined?
Rhetorical... Let me send a patch for that as it's not related to this series.
> } scan;
...
> + /* Enable offset*/
Missing space.
...
> +static int mcp3911_get_osr(struct mcp3911 *adc, u32 *val)
> +{
> + int ret, osr;
> +
> + ret = mcp3911_read(adc, MCP3911_REG_CONFIG, val, 2);
> + if (ret)
> + return ret;
> +
> + osr = FIELD_GET(MCP3911_CONFIG_OSR, *val);
> + *val = 32 << osr;
> + return ret;
return 0;
> +}
...
> {
> - struct device *dev = &adc->spi->dev;
> u32 regval;
> int ret;
> + struct device *dev = &adc->spi->dev;
Stray change.
...
> + /* Disable offset to ignore any old values in offset register*/
Missing space.
...
> + u32 regval;
> + int ret;
> + struct device *dev = &adc->spi->dev;
Make the longer line first.
...
> + dev_dbg(dev,
> + "use internal voltage reference (1.2V)\n");
One line.
...
> + dev_dbg(dev,
> + "use crystal oscillator as clocksource\n");
Ditto.
(This is the outcome of the exercise with temporary dev variable)
...
> + ret = device_property_read_u32(dev, "microchip,device-addr", &adc->dev_addr);
> if (ret)
> - return ret;
> + device_property_read_u32(dev, "device-addr", &adc->dev_addr);
> + if (adc->dev_addr > 3) {
> + dev_err_probe(dev, -EINVAL,
> + "invalid device address (%i). Must be in range 0-3.\n",
> + adc->dev_addr);
Missing return?
return dev_err_probe(...);
> + }
> + dev_dbg(dev, "use device address %i\n", adc->dev_addr);
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 5/6] iio: adc: mcp3911: avoid ambiguity parameters in macros
2023-08-15 14:56 ` Andy Shevchenko
@ 2023-08-15 16:49 ` Marcus Folkesson
2023-08-15 16:54 ` Andy Shevchenko
0 siblings, 1 reply; 15+ messages in thread
From: Marcus Folkesson @ 2023-08-15 16:49 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Kent Gustavsson, Jonathan Cameron, Lars-Peter Clausen,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cosmin Tanislav,
Arnd Bergmann, ChiYuan Huang, Haibo Chen, Ramona Bolboaca,
Ibrahim Tilki, ChiaEn Wu, William Breathitt Gray, linux-iio,
devicetree, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 487 bytes --]
On Tue, Aug 15, 2023 at 05:56:37PM +0300, Andy Shevchenko wrote:
> On Mon, Aug 14, 2023 at 02:10:09PM +0200, Marcus Folkesson wrote:
> > Name macro parameters after what they represent instead of 'x'.
>
> Yes, but it's not my suggestion, what I was talking about is how macro
> parameters being treated.
Sorry, I clearly missunderstood what you was aiming for.
I will change to (ch) in this patch and keep it consistent in the
following.
Best regards,
Marcus Folkesson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 5/6] iio: adc: mcp3911: avoid ambiguity parameters in macros
2023-08-15 16:49 ` Marcus Folkesson
@ 2023-08-15 16:54 ` Andy Shevchenko
0 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2023-08-15 16:54 UTC (permalink / raw)
To: Marcus Folkesson
Cc: Kent Gustavsson, Jonathan Cameron, Lars-Peter Clausen,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cosmin Tanislav,
Arnd Bergmann, ChiYuan Huang, Haibo Chen, Ramona Bolboaca,
Ibrahim Tilki, ChiaEn Wu, William Breathitt Gray, linux-iio,
devicetree, linux-kernel
On Tue, Aug 15, 2023 at 06:49:11PM +0200, Marcus Folkesson wrote:
> On Tue, Aug 15, 2023 at 05:56:37PM +0300, Andy Shevchenko wrote:
> > On Mon, Aug 14, 2023 at 02:10:09PM +0200, Marcus Folkesson wrote:
> > > Name macro parameters after what they represent instead of 'x'.
> >
> > Yes, but it's not my suggestion, what I was talking about is how macro
> > parameters being treated.
>
> Sorry, I clearly missunderstood what you was aiming for.
> I will change to (ch) in this patch and keep it consistent in the
> following.
Yep. and drop tag with my name in it.
Thank you!
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 4/6] iio: adc: mcp3911: fix indentation
2023-08-15 14:58 ` Andy Shevchenko
@ 2023-08-15 16:55 ` Marcus Folkesson
2023-08-15 17:04 ` Andy Shevchenko
0 siblings, 1 reply; 15+ messages in thread
From: Marcus Folkesson @ 2023-08-15 16:55 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Kent Gustavsson, Jonathan Cameron, Lars-Peter Clausen,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cosmin Tanislav,
Arnd Bergmann, ChiYuan Huang, Haibo Chen, Ramona Bolboaca,
Ibrahim Tilki, ChiaEn Wu, William Breathitt Gray, linux-iio,
devicetree, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 983 bytes --]
On Tue, Aug 15, 2023 at 05:58:13PM +0300, Andy Shevchenko wrote:
> On Mon, Aug 14, 2023 at 02:10:08PM +0200, Marcus Folkesson wrote:
> > The file does not make use of indentation properly.
>
> > Fix that.
>
> I'm not sure this is anyhow a fix. Yet you may refer to the checkpatch
> if it complains.
>
> ...
>
> This kind of change is preferred to be the last in the series or closer
> to the end where no more code changed.
Checkpatch did never complain about the formatting, but I got a few comments
during the review process about the formatting, so I went
through the whole file to fix it once for all.
I do not think that it has to be the last patch in the series.
All following patches has proper indentation.
Pretty much the same as the simplification of spi->dev I think.
If there is no strong opinions about it I think I will leave it as is.
>
>
> --
> With Best Regards,
> Andy Shevchenko
>
>
Best regards,
Marcus Folkesson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 4/6] iio: adc: mcp3911: fix indentation
2023-08-15 16:55 ` Marcus Folkesson
@ 2023-08-15 17:04 ` Andy Shevchenko
0 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2023-08-15 17:04 UTC (permalink / raw)
To: Marcus Folkesson
Cc: Kent Gustavsson, Jonathan Cameron, Lars-Peter Clausen,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Cosmin Tanislav,
Arnd Bergmann, ChiYuan Huang, Haibo Chen, Ramona Bolboaca,
Ibrahim Tilki, ChiaEn Wu, William Breathitt Gray, linux-iio,
devicetree, linux-kernel
On Tue, Aug 15, 2023 at 06:55:45PM +0200, Marcus Folkesson wrote:
> On Tue, Aug 15, 2023 at 05:58:13PM +0300, Andy Shevchenko wrote:
> > On Mon, Aug 14, 2023 at 02:10:08PM +0200, Marcus Folkesson wrote:
> > > The file does not make use of indentation properly.
> >
> > > Fix that.
> >
> > I'm not sure this is anyhow a fix. Yet you may refer to the checkpatch
> > if it complains.
> >
> > ...
> >
> > This kind of change is preferred to be the last in the series or closer
> > to the end where no more code changed.
>
> Checkpatch did never complain about the formatting, but I got a few comments
> during the review process about the formatting, so I went
> through the whole file to fix it once for all.
>
> I do not think that it has to be the last patch in the series.
> All following patches has proper indentation.
> Pretty much the same as the simplification of spi->dev I think.
>
> If there is no strong opinions about it I think I will leave it as is.
I'm not a maintainer of IIO, so let them decide :-)
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2023-08-15 17:07 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-14 12:10 [PATCH v5 1/6] dt-bindings: iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
2023-08-14 12:10 ` [PATCH v5 2/6] iio: adc: mcp3911: make use of dev_err_probe() Marcus Folkesson
2023-08-15 14:36 ` Andy Shevchenko
2023-08-14 12:10 ` [PATCH v5 3/6] iio: adc: mcp3911: simplify usage of spi->dev Marcus Folkesson
2023-08-15 14:53 ` Andy Shevchenko
2023-08-14 12:10 ` [PATCH v5 4/6] iio: adc: mcp3911: fix indentation Marcus Folkesson
2023-08-15 14:58 ` Andy Shevchenko
2023-08-15 16:55 ` Marcus Folkesson
2023-08-15 17:04 ` Andy Shevchenko
2023-08-14 12:10 ` [PATCH v5 5/6] iio: adc: mcp3911: avoid ambiguity parameters in macros Marcus Folkesson
2023-08-15 14:56 ` Andy Shevchenko
2023-08-15 16:49 ` Marcus Folkesson
2023-08-15 16:54 ` Andy Shevchenko
2023-08-14 12:10 ` [PATCH v5 6/6] iio: adc: mcp3911: add support for the whole MCP39xx family Marcus Folkesson
2023-08-15 15:44 ` Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).