linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/2] Maxim MAX1241 driver
@ 2020-03-20 15:01 Alexandru Lazar
  2020-03-20 15:01 ` [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
  2020-03-20 15:01 ` [PATCH v4 2/2] iio: adc: Add MAX1241 driver Alexandru Lazar
  0 siblings, 2 replies; 15+ messages in thread
From: Alexandru Lazar @ 2020-03-20 15:01 UTC (permalink / raw)
  To: linux-iio
  Cc: devicetree, jic23, knaack.h, lars, pmeerw, robh+dt, mark.rutland,
	Alexandru Lazar

Hello again,

Here's version 4 of a patch series which adds support for the Maxim
MAX1241, a 12-bit, single-channel, SPI-connected ADC.

Changelog so far:

v4:

* Dropped explicit documentation of SPI reg property
* Reordered patch series so that dt bindings come first

v3:

* Fixed silly copy-paste error in Kconfig description

v2:

* Removed useeless header includes
* Dropped needlessly verbose stuff in _read and _probe functions
* Dropped useless GPL notice
* Lowered log level of shdn pin status in probe function, now it's
  dev_dbg
* Added proper error checking for the GPIO shutdown pin
* remove now always returns zero (man, I've been wrong about this for
  *years* now...)
* Added regulator disable action, cleanup is now handled via devm
* Drop delay_usecs, use delay.value, delay.unit
* Drop config_of, of_match_ptr call
* Dropped IIO_BUFFER, IIO_TRIGGERED_BUFFER dependencies, set SPI_MASTER
  as dependency, fix indenting.
* DT binding: use correct id, add reg description (looks pretty
  standard), dropped spi-max-frequency, fixed dt_binding_check
  complaints (oops!)

Apologies for the last botched message -- my machine died at the
wrongest possible time.

All the best,
Alex

Alexandru Lazar (2):
  dt-bindings: iio: adc: Add MAX1241 device tree bindings in
    documentation
  iio: adc: Add MAX1241 driver

 .../bindings/iio/adc/maxim,max1241.yaml       |  61 ++++++
 drivers/iio/adc/Kconfig                       |  10 +
 drivers/iio/adc/Makefile                      |   1 +
 drivers/iio/adc/max1241.c                     | 206 ++++++++++++++++++
 4 files changed, 278 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
 create mode 100644 drivers/iio/adc/max1241.c

-- 
2.25.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-20 15:01 [PATCH v4 0/2] Maxim MAX1241 driver Alexandru Lazar
@ 2020-03-20 15:01 ` Alexandru Lazar
  2020-03-21 17:34   ` Jonathan Cameron
  2020-03-30 23:39   ` Rob Herring
  2020-03-20 15:01 ` [PATCH v4 2/2] iio: adc: Add MAX1241 driver Alexandru Lazar
  1 sibling, 2 replies; 15+ messages in thread
From: Alexandru Lazar @ 2020-03-20 15:01 UTC (permalink / raw)
  To: linux-iio
  Cc: devicetree, jic23, knaack.h, lars, pmeerw, robh+dt, mark.rutland,
	Alexandru Lazar

Add device-tree bindings documentation for the MAX1241 device driver.

Signed-off-by: Alexandru Lazar <alazar@startmail.com>
---
 .../bindings/iio/adc/maxim,max1241.yaml       | 61 +++++++++++++++++++
 1 file changed, 61 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml

diff --git a/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
new file mode 100644
index 000000000000..de41d422ce3b
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
@@ -0,0 +1,61 @@
+# SPDX-License-Identifier: GPL-2.0
+# Copyright 2020 Ioan-Alexandru Lazar
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/adc/maxim,max1241.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Maxim MAX1241 12-bit, single-channel analog to digital converter
+
+maintainers:
+  - Ioan-Alexandru Lazar <alazar@startmail.com>
+
+description: |
+  Bindings for the max1241 12-bit, single-channel ADC device. This
+  driver supports voltage reading and can optionally be configured for
+  power-down mode operation. The datasheet can be found at:
+    https://datasheets.maximintegrated.com/en/ds/MAX1240-MAX1241.pdf
+
+properties:
+  compatible:
+    enum:
+      - maxim,max1241
+
+  reg:
+    maxItems: 1
+
+  vref-supply:
+    description:
+      Device tree identifier of the regulator that provides the external
+      reference voltage.
+    maxItems: 1
+
+  shdn-gpios:
+    description:
+      GPIO spec for the GPIO pin connected to the ADC's /SHDN pin. If
+      specified, the /SHDN pin will be asserted between conversions,
+      thus enabling power-down mode.
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - vref-supply
+
+examples:
+  - |
+    #include <dt-bindings/gpio/gpio.h>
+    spi0 {
+      #address-cells = <1>;
+      #size-cells = <0>;
+
+        adc@0 {
+            compatible = "maxim,max1241";
+            reg = <0>;
+            vref-supply = <&vdd_3v3_reg>;
+            spi-max-frequency = <1000000>;
+            shdn-gpios = <&gpio 26 1>;
+        };
+    };
+
+
-- 
2.25.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v4 2/2] iio: adc: Add MAX1241 driver
  2020-03-20 15:01 [PATCH v4 0/2] Maxim MAX1241 driver Alexandru Lazar
  2020-03-20 15:01 ` [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
@ 2020-03-20 15:01 ` Alexandru Lazar
  2020-03-21 18:00   ` Jonathan Cameron
  2020-03-21 21:56   ` Andy Shevchenko
  1 sibling, 2 replies; 15+ messages in thread
From: Alexandru Lazar @ 2020-03-20 15:01 UTC (permalink / raw)
  To: linux-iio
  Cc: devicetree, jic23, knaack.h, lars, pmeerw, robh+dt, mark.rutland,
	Alexandru Lazar, Alexandru Ardelean

Add driver for the Maxim MAX1241 12-bit, single-channel ADC. The driver
includes support for this device's low-power operation mode.

Reviewed-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Alexandru Lazar <alazar@startmail.com>
---
 drivers/iio/adc/Kconfig   |  10 ++
 drivers/iio/adc/Makefile  |   1 +
 drivers/iio/adc/max1241.c | 206 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 217 insertions(+)
 create mode 100644 drivers/iio/adc/max1241.c

diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 5d8540b7b427..55f6462cd93f 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -566,6 +566,16 @@ config MAX1118
 	  To compile this driver as a module, choose M here: the module will be
 	  called max1118.
 
+config MAX1241
+	tristate "Maxim max1241 ADC driver"
+	depends on SPI_MASTER
+	help
+	  Say yes here to build support for Maxim max1241 12-bit, single-channel
+	  ADC.
+
+	  To compile this driver as a module, choose M here: the module will be
+	  called max1241.
+
 config MAX1363
 	tristate "Maxim max1363 ADC driver"
 	depends on I2C
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
index a1f1fbec0f87..37d6f17559dc 100644
--- a/drivers/iio/adc/Makefile
+++ b/drivers/iio/adc/Makefile
@@ -54,6 +54,7 @@ obj-$(CONFIG_LTC2497) += ltc2497.o
 obj-$(CONFIG_MAX1027) += max1027.o
 obj-$(CONFIG_MAX11100) += max11100.o
 obj-$(CONFIG_MAX1118) += max1118.o
+obj-$(CONFIG_MAX1241) += max1241.o
 obj-$(CONFIG_MAX1363) += max1363.o
 obj-$(CONFIG_MAX9611) += max9611.o
 obj-$(CONFIG_MCP320X) += mcp320x.o
diff --git a/drivers/iio/adc/max1241.c b/drivers/iio/adc/max1241.c
new file mode 100644
index 000000000000..0278510ec346
--- /dev/null
+++ b/drivers/iio/adc/max1241.c
@@ -0,0 +1,206 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * MAX1241 low-power, 12-bit serial ADC
+ *
+ * Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX1240-MAX1241.pdf
+ */
+
+#include <linux/regulator/consumer.h>
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
+#include <linux/iio/iio.h>
+#include <linux/module.h>
+#include <linux/spi/spi.h>
+
+#define MAX1241_VAL_MASK 0xFFF
+#define MAX1241_SHDN_DELAY_USEC 4
+
+enum max1241_id {
+	max1241,
+};
+
+struct max1241 {
+	struct spi_device *spi;
+	struct mutex lock;
+	struct regulator *reg;
+	struct gpio_desc *shdn;
+
+	__be16 data ____cacheline_aligned;
+};
+
+static const struct iio_chan_spec max1241_channels[] = {
+	{
+		.type = IIO_VOLTAGE,
+		.indexed = 1,
+		.channel = 0,
+		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
+				BIT(IIO_CHAN_INFO_SCALE),
+		.scan_index = 0,
+		.scan_type = {
+			.sign = 'u',
+			.realbits = 12,
+			.storagebits = 16,
+		},
+	},
+};
+
+static int max1241_read(struct max1241 *adc)
+{
+	struct spi_transfer xfers[] = {
+		/*
+		 * Begin conversion by bringing /CS low for at least
+		 * tconv us.
+		 */
+		{
+			.len = 0,
+			.delay.value = 8,
+			.delay.unit = SPI_DELAY_UNIT_USECS,
+		},
+		/*
+		 * Then read two bytes of data in our RX buffer.
+		 */
+		{
+			.rx_buf = &adc->data,
+			.len = 2,
+		},
+	};
+
+	return spi_sync_transfer(adc->spi, xfers, ARRAY_SIZE(xfers));
+}
+
+static int max1241_read_raw(struct iio_dev *indio_dev,
+			struct iio_chan_spec const *chan,
+			int *val, int *val2, long mask)
+{
+	int ret, vref_uV;
+	struct max1241 *adc = iio_priv(indio_dev);
+
+	switch (mask) {
+	case IIO_CHAN_INFO_RAW:
+		mutex_lock(&adc->lock);
+
+		if (adc->shdn) {
+			gpiod_set_value(adc->shdn, 0);
+			udelay(MAX1241_SHDN_DELAY_USEC);
+		}
+
+		ret = max1241_read(adc);
+
+		if (adc->shdn)
+			gpiod_set_value(adc->shdn, 1);
+
+		if (ret) {
+			mutex_unlock(&adc->lock);
+			return ret;
+		}
+
+		*val = (be16_to_cpu(adc->data) >> 3) & MAX1241_VAL_MASK;
+
+		mutex_unlock(&adc->lock);
+		return IIO_VAL_INT;
+	case IIO_CHAN_INFO_SCALE:
+		vref_uV = regulator_get_voltage(adc->reg);
+
+		if (vref_uV < 0)
+			return vref_uV;
+
+		*val = vref_uV / 1000;
+		*val2 = 12;
+
+		return IIO_VAL_FRACTIONAL_LOG2;
+	default:
+		return -EINVAL;
+	}
+}
+
+static const struct iio_info max1241_info = {
+	.read_raw = max1241_read_raw,
+};
+
+static void max1241_disable_reg_action(void *data)
+{
+	struct max1241 *adc = data;
+	int err;
+
+	err = regulator_disable(adc->reg);
+	if (err)
+		dev_err(&adc->spi->dev, "could not disable reference regulator.\n");
+}
+
+static int max1241_probe(struct spi_device *spi)
+{
+	struct iio_dev *indio_dev;
+	struct max1241 *adc;
+	int ret = 0;
+
+	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
+	if (!indio_dev)
+		return -ENOMEM;
+
+	adc = iio_priv(indio_dev);
+	adc->spi = spi;
+	mutex_init(&adc->lock);
+
+	spi_set_drvdata(spi, indio_dev);
+
+	adc->reg = devm_regulator_get(&spi->dev, "vref");
+	if (IS_ERR(adc->reg)) {
+		dev_err(&spi->dev, "failed to get vref regulator\n");
+		return PTR_ERR(adc->reg);
+	}
+
+	ret = regulator_enable(adc->reg);
+	if (ret)
+		return ret;
+
+	ret = devm_add_action_or_reset(&spi->dev, max1241_disable_reg_action,
+					adc);
+	if (ret) {
+		dev_err(&spi->dev, "could not set up regulator cleanup action!\n");
+		return ret;
+	}
+
+	adc->shdn = devm_gpiod_get_optional(&spi->dev, "shdn", GPIOD_OUT_HIGH);
+
+	if (IS_ERR(adc->shdn))
+		return PTR_ERR(adc->shdn);
+
+	if (!adc->shdn)
+		dev_dbg(&spi->dev, "no shdn pin passed, low-power mode disabled");
+	else
+		dev_dbg(&spi->dev, "shdn pin passed, low-power mode enabled");
+
+	indio_dev->name = spi_get_device_id(spi)->name;
+	indio_dev->dev.parent = &spi->dev;
+	indio_dev->info = &max1241_info;
+	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->channels = max1241_channels;
+	indio_dev->num_channels = ARRAY_SIZE(max1241_channels);
+
+	return devm_iio_device_register(&spi->dev, indio_dev);
+}
+
+static const struct spi_device_id max1241_id[] = {
+	{ "max1241", max1241 },
+	{},
+};
+
+static const struct of_device_id max1241_dt_ids[] = {
+	{ .compatible = "maxim,max1241" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, max1241_dt_ids);
+
+static struct spi_driver max1241_spi_driver = {
+	.driver = {
+		.name = "max1241",
+		.of_match_table = max1241_dt_ids,
+	},
+	.probe = max1241_probe,
+	.id_table = max1241_id,
+};
+module_spi_driver(max1241_spi_driver);
+
+MODULE_AUTHOR("Alexandru Lazar <alazar@startmail.com>");
+MODULE_DESCRIPTION("MAX1241 ADC driver");
+MODULE_LICENSE("GPL v2");
-- 
2.25.2


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-20 15:01 ` [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
@ 2020-03-21 17:34   ` Jonathan Cameron
  2020-03-21 19:35     ` Alexandru Lazar
  2020-03-30 23:39   ` Rob Herring
  1 sibling, 1 reply; 15+ messages in thread
From: Jonathan Cameron @ 2020-03-21 17:34 UTC (permalink / raw)
  To: Alexandru Lazar
  Cc: linux-iio, devicetree, knaack.h, lars, pmeerw, robh+dt, mark.rutland

On Fri, 20 Mar 2020 17:01:14 +0200
Alexandru Lazar <alazar@startmail.com> wrote:

> Add device-tree bindings documentation for the MAX1241 device driver.
> 
> Signed-off-by: Alexandru Lazar <alazar@startmail.com>

Please consider also adding the vdd-supply.
It's not really required, but if you don't add it from the start
chances are high that at some point someone else will need to
add it.

One trivial thing inline.  Otherwise looks good to me.

> ---
>  .../bindings/iio/adc/maxim,max1241.yaml       | 61 +++++++++++++++++++
>  1 file changed, 61 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> 
> diff --git a/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> new file mode 100644
> index 000000000000..de41d422ce3b
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> @@ -0,0 +1,61 @@
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright 2020 Ioan-Alexandru Lazar
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/iio/adc/maxim,max1241.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Maxim MAX1241 12-bit, single-channel analog to digital converter
> +
> +maintainers:
> +  - Ioan-Alexandru Lazar <alazar@startmail.com>
> +
> +description: |
> +  Bindings for the max1241 12-bit, single-channel ADC device. This
> +  driver supports voltage reading and can optionally be configured for

Driver shouldn't be mentioned in the binding. It's a description of the
hardware only.

> +  power-down mode operation. The datasheet can be found at:
> +    https://datasheets.maximintegrated.com/en/ds/MAX1240-MAX1241.pdf
> +
> +properties:
> +  compatible:
> +    enum:
> +      - maxim,max1241
> +
> +  reg:
> +    maxItems: 1
> +
> +  vref-supply:
> +    description:
> +      Device tree identifier of the regulator that provides the external
> +      reference voltage.
> +    maxItems: 1
> +
> +  shdn-gpios:
> +    description:
> +      GPIO spec for the GPIO pin connected to the ADC's /SHDN pin. If
> +      specified, the /SHDN pin will be asserted between conversions,
> +      thus enabling power-down mode.
> +    maxItems: 1
> +
> +required:
> +  - compatible
> +  - reg
> +  - vref-supply
> +
> +examples:
> +  - |
> +    #include <dt-bindings/gpio/gpio.h>
> +    spi0 {
> +      #address-cells = <1>;
> +      #size-cells = <0>;
> +
> +        adc@0 {
> +            compatible = "maxim,max1241";
> +            reg = <0>;
> +            vref-supply = <&vdd_3v3_reg>;
> +            spi-max-frequency = <1000000>;
> +            shdn-gpios = <&gpio 26 1>;
> +        };
> +    };
> +
> +


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 2/2] iio: adc: Add MAX1241 driver
  2020-03-20 15:01 ` [PATCH v4 2/2] iio: adc: Add MAX1241 driver Alexandru Lazar
@ 2020-03-21 18:00   ` Jonathan Cameron
  2020-03-21 21:56   ` Andy Shevchenko
  1 sibling, 0 replies; 15+ messages in thread
From: Jonathan Cameron @ 2020-03-21 18:00 UTC (permalink / raw)
  To: Alexandru Lazar
  Cc: linux-iio, devicetree, knaack.h, lars, pmeerw, robh+dt,
	mark.rutland, Alexandru Ardelean

On Fri, 20 Mar 2020 17:01:15 +0200
Alexandru Lazar <alazar@startmail.com> wrote:

> Add driver for the Maxim MAX1241 12-bit, single-channel ADC. The driver
> includes support for this device's low-power operation mode.
> 
> Reviewed-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
> Signed-off-by: Alexandru Lazar <alazar@startmail.com>

Few minor things inline, but looks good in general.

> ---
>  drivers/iio/adc/Kconfig   |  10 ++
>  drivers/iio/adc/Makefile  |   1 +
>  drivers/iio/adc/max1241.c | 206 ++++++++++++++++++++++++++++++++++++++
>  3 files changed, 217 insertions(+)
>  create mode 100644 drivers/iio/adc/max1241.c
> 
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index 5d8540b7b427..55f6462cd93f 100644
> --- a/drivers/iio/adc/Kconfig
> +++ b/drivers/iio/adc/Kconfig
> @@ -566,6 +566,16 @@ config MAX1118
>  	  To compile this driver as a module, choose M here: the module will be
>  	  called max1118.
>  
> +config MAX1241
> +	tristate "Maxim max1241 ADC driver"
> +	depends on SPI_MASTER
> +	help
> +	  Say yes here to build support for Maxim max1241 12-bit, single-channel
> +	  ADC.
> +
> +	  To compile this driver as a module, choose M here: the module will be
> +	  called max1241.
> +
>  config MAX1363
>  	tristate "Maxim max1363 ADC driver"
>  	depends on I2C
> diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
> index a1f1fbec0f87..37d6f17559dc 100644
> --- a/drivers/iio/adc/Makefile
> +++ b/drivers/iio/adc/Makefile
> @@ -54,6 +54,7 @@ obj-$(CONFIG_LTC2497) += ltc2497.o
>  obj-$(CONFIG_MAX1027) += max1027.o
>  obj-$(CONFIG_MAX11100) += max11100.o
>  obj-$(CONFIG_MAX1118) += max1118.o
> +obj-$(CONFIG_MAX1241) += max1241.o
>  obj-$(CONFIG_MAX1363) += max1363.o
>  obj-$(CONFIG_MAX9611) += max9611.o
>  obj-$(CONFIG_MCP320X) += mcp320x.o
> diff --git a/drivers/iio/adc/max1241.c b/drivers/iio/adc/max1241.c
> new file mode 100644
> index 000000000000..0278510ec346
> --- /dev/null
> +++ b/drivers/iio/adc/max1241.c
> @@ -0,0 +1,206 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * MAX1241 low-power, 12-bit serial ADC
> + *
> + * Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX1240-MAX1241.pdf
> + */
> +
> +#include <linux/regulator/consumer.h>

Nitpick; Tidy up ordering of headers.  If no other reason to have a particular
order go with alphabetical.

> +#include <linux/delay.h>
> +#include <linux/gpio/consumer.h>
> +#include <linux/iio/iio.h>
> +#include <linux/module.h>
> +#include <linux/spi/spi.h>
> +
> +#define MAX1241_VAL_MASK 0xFFF
> +#define MAX1241_SHDN_DELAY_USEC 4
> +
> +enum max1241_id {
> +	max1241,
> +};
> +
> +struct max1241 {
> +	struct spi_device *spi;
> +	struct mutex lock;
> +	struct regulator *reg;
> +	struct gpio_desc *shdn;
> +
> +	__be16 data ____cacheline_aligned;
> +};
> +
> +static const struct iio_chan_spec max1241_channels[] = {
> +	{
> +		.type = IIO_VOLTAGE,
> +		.indexed = 1,
> +		.channel = 0,
> +		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
> +				BIT(IIO_CHAN_INFO_SCALE),
> +		.scan_index = 0,
> +		.scan_type = {
> +			.sign = 'u',
> +			.realbits = 12,
> +			.storagebits = 16,
> +		},

No need to specify scan_index or scan_type unless the driver supports
buffered modes.  Nothing will use them until then.

> +	},
> +};
> +
> +static int max1241_read(struct max1241 *adc)
> +{
> +	struct spi_transfer xfers[] = {
> +		/*
> +		 * Begin conversion by bringing /CS low for at least
> +		 * tconv us.
> +		 */
> +		{
> +			.len = 0,
> +			.delay.value = 8,
> +			.delay.unit = SPI_DELAY_UNIT_USECS,
> +		},
> +		/*
> +		 * Then read two bytes of data in our RX buffer.
> +		 */
> +		{
> +			.rx_buf = &adc->data,
> +			.len = 2,
> +		},
> +	};
> +
> +	return spi_sync_transfer(adc->spi, xfers, ARRAY_SIZE(xfers));
> +}
> +
> +static int max1241_read_raw(struct iio_dev *indio_dev,
> +			struct iio_chan_spec const *chan,
> +			int *val, int *val2, long mask)
> +{
> +	int ret, vref_uV;
> +	struct max1241 *adc = iio_priv(indio_dev);
> +
> +	switch (mask) {
> +	case IIO_CHAN_INFO_RAW:
> +		mutex_lock(&adc->lock);
> +
> +		if (adc->shdn) {
> +			gpiod_set_value(adc->shdn, 0);
> +			udelay(MAX1241_SHDN_DELAY_USEC);
> +		}
> +
> +		ret = max1241_read(adc);
> +
> +		if (adc->shdn)
> +			gpiod_set_value(adc->shdn, 1);
> +
> +		if (ret) {
> +			mutex_unlock(&adc->lock);
> +			return ret;
> +		}
> +
> +		*val = (be16_to_cpu(adc->data) >> 3) & MAX1241_VAL_MASK;
> +
> +		mutex_unlock(&adc->lock);
> +		return IIO_VAL_INT;
> +	case IIO_CHAN_INFO_SCALE:
> +		vref_uV = regulator_get_voltage(adc->reg);
> +
> +		if (vref_uV < 0)
> +			return vref_uV;
> +
> +		*val = vref_uV / 1000;
> +		*val2 = 12;
> +
> +		return IIO_VAL_FRACTIONAL_LOG2;
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
> +static const struct iio_info max1241_info = {
> +	.read_raw = max1241_read_raw,
> +};
> +
> +static void max1241_disable_reg_action(void *data)
> +{
> +	struct max1241 *adc = data;
> +	int err;
> +
> +	err = regulator_disable(adc->reg);
> +	if (err)
> +		dev_err(&adc->spi->dev, "could not disable reference regulator.\n");
> +}
> +
> +static int max1241_probe(struct spi_device *spi)
> +{
> +	struct iio_dev *indio_dev;
> +	struct max1241 *adc;
> +	int ret = 0;

Looks like ret is always set in all the paths that can use it.
Hence no need to initialize here.

> +
> +	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
> +	if (!indio_dev)
> +		return -ENOMEM;
> +
> +	adc = iio_priv(indio_dev);
> +	adc->spi = spi;
> +	mutex_init(&adc->lock);
> +
> +	spi_set_drvdata(spi, indio_dev);
> +
> +	adc->reg = devm_regulator_get(&spi->dev, "vref");
> +	if (IS_ERR(adc->reg)) {
> +		dev_err(&spi->dev, "failed to get vref regulator\n");
> +		return PTR_ERR(adc->reg);
> +	}
> +
> +	ret = regulator_enable(adc->reg);
> +	if (ret)
> +		return ret;
> +
> +	ret = devm_add_action_or_reset(&spi->dev, max1241_disable_reg_action,
> +					adc);
> +	if (ret) {
> +		dev_err(&spi->dev, "could not set up regulator cleanup action!\n");
> +		return ret;
> +	}
> +
> +	adc->shdn = devm_gpiod_get_optional(&spi->dev, "shdn", GPIOD_OUT_HIGH);
> +
> +	if (IS_ERR(adc->shdn))
> +		return PTR_ERR(adc->shdn);
> +
> +	if (!adc->shdn)
> +		dev_dbg(&spi->dev, "no shdn pin passed, low-power mode disabled");
> +	else
> +		dev_dbg(&spi->dev, "shdn pin passed, low-power mode enabled");
> +
> +	indio_dev->name = spi_get_device_id(spi)->name;
> +	indio_dev->dev.parent = &spi->dev;
> +	indio_dev->info = &max1241_info;
> +	indio_dev->modes = INDIO_DIRECT_MODE;
> +	indio_dev->channels = max1241_channels;
> +	indio_dev->num_channels = ARRAY_SIZE(max1241_channels);
> +
> +	return devm_iio_device_register(&spi->dev, indio_dev);
> +}
> +
> +static const struct spi_device_id max1241_id[] = {
> +	{ "max1241", max1241 },
> +	{},
> +};
> +
> +static const struct of_device_id max1241_dt_ids[] = {
> +	{ .compatible = "maxim,max1241" },
> +	{},
> +};
> +MODULE_DEVICE_TABLE(of, max1241_dt_ids);
> +
> +static struct spi_driver max1241_spi_driver = {
> +	.driver = {
> +		.name = "max1241",
> +		.of_match_table = max1241_dt_ids,
> +	},
> +	.probe = max1241_probe,
> +	.id_table = max1241_id,
> +};
> +module_spi_driver(max1241_spi_driver);
> +
> +MODULE_AUTHOR("Alexandru Lazar <alazar@startmail.com>");
> +MODULE_DESCRIPTION("MAX1241 ADC driver");
> +MODULE_LICENSE("GPL v2");


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-21 17:34   ` Jonathan Cameron
@ 2020-03-21 19:35     ` Alexandru Lazar
  2020-03-22  9:02       ` Ardelean, Alexandru
  0 siblings, 1 reply; 15+ messages in thread
From: Alexandru Lazar @ 2020-03-21 19:35 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: linux-iio, devicetree, knaack.h, lars, pmeerw, robh+dt, mark.rutland

Hi Jonathan,

> Please consider also adding the vdd-supply.
> It's not really required, but if you don't add it from the start
> chances are high that at some point someone else will need to
> add it.

Sorry if I'm missing something obvious here -- what vdd-supply is
that? Are you thinking of the regulator used for the ADC's reference
voltage? That's already there (vref-supply).

Or did you mean I should add a definition for the regulator output used
for the device's Vdd input (i.e. the positive supply voltage)? Needless
to say, I'm happy to add it if you think it's a good idea. It's just I
don't think I've seen it in other drivers (except maybe ad7192?) -- so I
figured I'd ask before sending a botched v5.

Best regards,
Alex

> 
> One trivial thing inline.  Otherwise looks good to me.
> 
> > ---
> >  .../bindings/iio/adc/maxim,max1241.yaml       | 61 +++++++++++++++++++
> >  1 file changed, 61 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > 
> > diff --git a/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > new file mode 100644
> > index 000000000000..de41d422ce3b
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > @@ -0,0 +1,61 @@
> > +# SPDX-License-Identifier: GPL-2.0
> > +# Copyright 2020 Ioan-Alexandru Lazar
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/iio/adc/maxim,max1241.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Maxim MAX1241 12-bit, single-channel analog to digital converter
> > +
> > +maintainers:
> > +  - Ioan-Alexandru Lazar <alazar@startmail.com>
> > +
> > +description: |
> > +  Bindings for the max1241 12-bit, single-channel ADC device. This
> > +  driver supports voltage reading and can optionally be configured for
> 
> Driver shouldn't be mentioned in the binding. It's a description of the
> hardware only.
> 
> > +  power-down mode operation. The datasheet can be found at:
> > +    https://datasheets.maximintegrated.com/en/ds/MAX1240-MAX1241.pdf
> > +
> > +properties:
> > +  compatible:
> > +    enum:
> > +      - maxim,max1241
> > +
> > +  reg:
> > +    maxItems: 1
> > +
> > +  vref-supply:
> > +    description:
> > +      Device tree identifier of the regulator that provides the external
> > +      reference voltage.
> > +    maxItems: 1
> > +
> > +  shdn-gpios:
> > +    description:
> > +      GPIO spec for the GPIO pin connected to the ADC's /SHDN pin. If
> > +      specified, the /SHDN pin will be asserted between conversions,
> > +      thus enabling power-down mode.
> > +    maxItems: 1
> > +
> > +required:
> > +  - compatible
> > +  - reg
> > +  - vref-supply
> > +
> > +examples:
> > +  - |
> > +    #include <dt-bindings/gpio/gpio.h>
> > +    spi0 {
> > +      #address-cells = <1>;
> > +      #size-cells = <0>;
> > +
> > +        adc@0 {
> > +            compatible = "maxim,max1241";
> > +            reg = <0>;
> > +            vref-supply = <&vdd_3v3_reg>;
> > +            spi-max-frequency = <1000000>;
> > +            shdn-gpios = <&gpio 26 1>;
> > +        };
> > +    };
> > +
> > +
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 2/2] iio: adc: Add MAX1241 driver
  2020-03-20 15:01 ` [PATCH v4 2/2] iio: adc: Add MAX1241 driver Alexandru Lazar
  2020-03-21 18:00   ` Jonathan Cameron
@ 2020-03-21 21:56   ` Andy Shevchenko
  1 sibling, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2020-03-21 21:56 UTC (permalink / raw)
  To: Alexandru Lazar
  Cc: linux-iio, devicetree, jic23, knaack.h, lars, pmeerw, robh+dt,
	mark.rutland, Alexandru Ardelean

On Fri, Mar 20, 2020 at 05:01:15PM +0200, Alexandru Lazar wrote:
> Add driver for the Maxim MAX1241 12-bit, single-channel ADC. The driver
> includes support for this device's low-power operation mode.

...

> +#include <linux/regulator/consumer.h>
> +#include <linux/delay.h>
> +#include <linux/gpio/consumer.h>
> +#include <linux/iio/iio.h>
> +#include <linux/module.h>
> +#include <linux/spi/spi.h>

I think you can keep them sorted.

...

> +#define MAX1241_VAL_MASK 0xFFF

GENMASK() ?

...

> +		if (adc->shdn) {
> +			gpiod_set_value(adc->shdn, 0);
> +			udelay(MAX1241_SHDN_DELAY_USEC);
> +		}
> +
> +		ret = max1241_read(adc);
> +
> +		if (adc->shdn)
> +			gpiod_set_value(adc->shdn, 1);

I guess easier to read in a way

		if () {
			gpio...
			read();
			gpio...
		} else {
			read();
		}

Or actually introduce runtime PM and move these gpio calls there.


...

> +static int max1241_probe(struct spi_device *spi)
> +{
> +	struct iio_dev *indio_dev;
> +	struct max1241 *adc;

> +	int ret = 0;

Redundant assignment.

> +	ret = regulator_enable(adc->reg);
> +	if (ret)
> +		return ret;
> +

> +	ret = devm_add_action_or_reset(&spi->dev, max1241_disable_reg_action,
> +					adc);

Introducing
	struct device *dev = &spi->dev;
will simplifies such lines like above by making them on one line.

> +	if (ret) {
> +		dev_err(&spi->dev, "could not set up regulator cleanup action!\n");
> +		return ret;
> +	}

> +	adc->shdn = devm_gpiod_get_optional(&spi->dev, "shdn", GPIOD_OUT_HIGH);

> +

Redundant blank line.

> +	if (IS_ERR(adc->shdn))
> +		return PTR_ERR(adc->shdn);

> +	if (!adc->shdn)

Why not to use positive conditional?

> +		dev_dbg(&spi->dev, "no shdn pin passed, low-power mode disabled");
> +	else
> +		dev_dbg(&spi->dev, "shdn pin passed, low-power mode enabled");

> +}

...

> +static const struct spi_device_id max1241_id[] = {
> +	{ "max1241", max1241 },

> +	{},

Terminators better w/o comma.

> +};
> +
> +static const struct of_device_id max1241_dt_ids[] = {
> +	{ .compatible = "maxim,max1241" },

> +	{},

Ditto.

> +};

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-21 19:35     ` Alexandru Lazar
@ 2020-03-22  9:02       ` Ardelean, Alexandru
  2020-03-22  9:53         ` Alexandru Lazar
  2020-03-22 15:25         ` Jonathan Cameron
  0 siblings, 2 replies; 15+ messages in thread
From: Ardelean, Alexandru @ 2020-03-22  9:02 UTC (permalink / raw)
  To: alazar, jic23
  Cc: robh+dt, mark.rutland, devicetree, knaack.h, linux-iio, pmeerw, lars

On Sat, 2020-03-21 at 21:35 +0200, Alexandru Lazar wrote:
> Hi Jonathan,
> 
> > Please consider also adding the vdd-supply.
> > It's not really required, but if you don't add it from the start
> > chances are high that at some point someone else will need to
> > add it.
> 
> Sorry if I'm missing something obvious here -- what vdd-supply is
> that? Are you thinking of the regulator used for the ADC's reference
> voltage? That's already there (vref-supply).
> 
> Or did you mean I should add a definition for the regulator output used
> for the device's Vdd input (i.e. the positive supply voltage)? Needless
> to say, I'm happy to add it if you think it's a good idea. It's just I
> don't think I've seen it in other drivers (except maybe ad7192?) -- so I
> figured I'd ask before sending a botched v5.
> 

Yep.
Jonathan refers to Vdd input/pin [on the chip] which is different from Vref [REF
pin].
Not all drivers define Vdd.
Some call it AVdd.

You can check via:  git grep -i vdd | cut -d: -f1 | sort | uniq -c
in the drivers/iio folder 

It's an idea to add it, and that can give control to the driver to power-up the
ADC, by defining a regulator [vdd-supply] in the device-tree.

Maybe it could be interesting to move this to the IIO core as an option-flag.
[But that's another discussion]

> Best regards,
> Alex
> 
> > One trivial thing inline.  Otherwise looks good to me.
> > 
> > > ---
> > >  .../bindings/iio/adc/maxim,max1241.yaml       | 61 +++++++++++++++++++
> > >  1 file changed, 61 insertions(+)
> > >  create mode 100644
> > > Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > > 
> > > diff --git a/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > > b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > > new file mode 100644
> > > index 000000000000..de41d422ce3b
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > > @@ -0,0 +1,61 @@
> > > +# SPDX-License-Identifier: GPL-2.0
> > > +# Copyright 2020 Ioan-Alexandru Lazar
> > > +%YAML 1.2
> > > +---
> > > +$id: http://devicetree.org/schemas/iio/adc/maxim,max1241.yaml#
> > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > +
> > > +title: Maxim MAX1241 12-bit, single-channel analog to digital converter
> > > +
> > > +maintainers:
> > > +  - Ioan-Alexandru Lazar <alazar@startmail.com>
> > > +
> > > +description: |
> > > +  Bindings for the max1241 12-bit, single-channel ADC device. This
> > > +  driver supports voltage reading and can optionally be configured for
> > 
> > Driver shouldn't be mentioned in the binding. It's a description of the
> > hardware only.
> > 
> > > +  power-down mode operation. The datasheet can be found at:
> > > +    https://datasheets.maximintegrated.com/en/ds/MAX1240-MAX1241.pdf
> > > +
> > > +properties:
> > > +  compatible:
> > > +    enum:
> > > +      - maxim,max1241
> > > +
> > > +  reg:
> > > +    maxItems: 1
> > > +
> > > +  vref-supply:
> > > +    description:
> > > +      Device tree identifier of the regulator that provides the external
> > > +      reference voltage.
> > > +    maxItems: 1
> > > +
> > > +  shdn-gpios:
> > > +    description:
> > > +      GPIO spec for the GPIO pin connected to the ADC's /SHDN pin. If
> > > +      specified, the /SHDN pin will be asserted between conversions,
> > > +      thus enabling power-down mode.
> > > +    maxItems: 1
> > > +
> > > +required:
> > > +  - compatible
> > > +  - reg
> > > +  - vref-supply
> > > +
> > > +examples:
> > > +  - |
> > > +    #include <dt-bindings/gpio/gpio.h>
> > > +    spi0 {
> > > +      #address-cells = <1>;
> > > +      #size-cells = <0>;
> > > +
> > > +        adc@0 {
> > > +            compatible = "maxim,max1241";
> > > +            reg = <0>;
> > > +            vref-supply = <&vdd_3v3_reg>;
> > > +            spi-max-frequency = <1000000>;
> > > +            shdn-gpios = <&gpio 26 1>;
> > > +        };
> > > +    };
> > > +
> > > +

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-22  9:02       ` Ardelean, Alexandru
@ 2020-03-22  9:53         ` Alexandru Lazar
  2020-03-22 15:27           ` Jonathan Cameron
  2020-03-22 15:25         ` Jonathan Cameron
  1 sibling, 1 reply; 15+ messages in thread
From: Alexandru Lazar @ 2020-03-22  9:53 UTC (permalink / raw)
  To: Ardelean, Alexandru
  Cc: jic23, robh+dt, mark.rutland, devicetree, knaack.h, linux-iio,
	pmeerw, lars

> Yep.
> Jonathan refers to Vdd input/pin [on the chip] which is different from Vref [REF
> pin].
> Not all drivers define Vdd.
> Some call it AVdd.
> 
> [...]
> 
> It's an idea to add it, and that can give control to the driver to power-up the
> ADC, by defining a regulator [vdd-supply] in the device-tree.

Hmm... I don't know how useful this would be for the 124x family (I
doubt anyone who needs one of these will power it from its own,
independent supply), but it's a pretty harmless change. I can't think of
any reason to say no :-).

Thanks,
Alex

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-22  9:02       ` Ardelean, Alexandru
  2020-03-22  9:53         ` Alexandru Lazar
@ 2020-03-22 15:25         ` Jonathan Cameron
  1 sibling, 0 replies; 15+ messages in thread
From: Jonathan Cameron @ 2020-03-22 15:25 UTC (permalink / raw)
  To: Ardelean, Alexandru
  Cc: alazar, robh+dt, mark.rutland, devicetree, knaack.h, linux-iio,
	pmeerw, lars

On Sun, 22 Mar 2020 09:02:15 +0000
"Ardelean, Alexandru" <alexandru.Ardelean@analog.com> wrote:

> On Sat, 2020-03-21 at 21:35 +0200, Alexandru Lazar wrote:
> > Hi Jonathan,
> >   
> > > Please consider also adding the vdd-supply.
> > > It's not really required, but if you don't add it from the start
> > > chances are high that at some point someone else will need to
> > > add it.  
> > 
> > Sorry if I'm missing something obvious here -- what vdd-supply is
> > that? Are you thinking of the regulator used for the ADC's reference
> > voltage? That's already there (vref-supply).
> > 
> > Or did you mean I should add a definition for the regulator output used
> > for the device's Vdd input (i.e. the positive supply voltage)? Needless
> > to say, I'm happy to add it if you think it's a good idea. It's just I
> > don't think I've seen it in other drivers (except maybe ad7192?) -- so I
> > figured I'd ask before sending a botched v5.
> >   
> 
> Yep.
> Jonathan refers to Vdd input/pin [on the chip] which is different from Vref [REF
> pin].
> Not all drivers define Vdd.
> Some call it AVdd.
> 
> You can check via:  git grep -i vdd | cut -d: -f1 | sort | uniq -c
> in the drivers/iio folder 
> 
> It's an idea to add it, and that can give control to the driver to power-up the
> ADC, by defining a regulator [vdd-supply] in the device-tree.
> 
> Maybe it could be interesting to move this to the IIO core as an option-flag.
> [But that's another discussion]

Can't easily move it to the core because how you actually handle it is very
much driver dependent.  A devices that has state will keep it on most of
the time, but other drivers will handle it in runtime pm if the device
starts up quickly enough.

We want this to be visible in individual drivers, even if it would be
less code perhaps in the core.

Jonathan

> 
> > Best regards,
> > Alex
> >   
> > > One trivial thing inline.  Otherwise looks good to me.
> > >   
> > > > ---
> > > >  .../bindings/iio/adc/maxim,max1241.yaml       | 61 +++++++++++++++++++
> > > >  1 file changed, 61 insertions(+)
> > > >  create mode 100644
> > > > Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > > > 
> > > > diff --git a/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > > > b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > > > new file mode 100644
> > > > index 000000000000..de41d422ce3b
> > > > --- /dev/null
> > > > +++ b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> > > > @@ -0,0 +1,61 @@
> > > > +# SPDX-License-Identifier: GPL-2.0
> > > > +# Copyright 2020 Ioan-Alexandru Lazar
> > > > +%YAML 1.2
> > > > +---
> > > > +$id: http://devicetree.org/schemas/iio/adc/maxim,max1241.yaml#
> > > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > > +
> > > > +title: Maxim MAX1241 12-bit, single-channel analog to digital converter
> > > > +
> > > > +maintainers:
> > > > +  - Ioan-Alexandru Lazar <alazar@startmail.com>
> > > > +
> > > > +description: |
> > > > +  Bindings for the max1241 12-bit, single-channel ADC device. This
> > > > +  driver supports voltage reading and can optionally be configured for  
> > > 
> > > Driver shouldn't be mentioned in the binding. It's a description of the
> > > hardware only.
> > >   
> > > > +  power-down mode operation. The datasheet can be found at:
> > > > +    https://datasheets.maximintegrated.com/en/ds/MAX1240-MAX1241.pdf
> > > > +
> > > > +properties:
> > > > +  compatible:
> > > > +    enum:
> > > > +      - maxim,max1241
> > > > +
> > > > +  reg:
> > > > +    maxItems: 1
> > > > +
> > > > +  vref-supply:
> > > > +    description:
> > > > +      Device tree identifier of the regulator that provides the external
> > > > +      reference voltage.
> > > > +    maxItems: 1
> > > > +
> > > > +  shdn-gpios:
> > > > +    description:
> > > > +      GPIO spec for the GPIO pin connected to the ADC's /SHDN pin. If
> > > > +      specified, the /SHDN pin will be asserted between conversions,
> > > > +      thus enabling power-down mode.
> > > > +    maxItems: 1
> > > > +
> > > > +required:
> > > > +  - compatible
> > > > +  - reg
> > > > +  - vref-supply
> > > > +
> > > > +examples:
> > > > +  - |
> > > > +    #include <dt-bindings/gpio/gpio.h>
> > > > +    spi0 {
> > > > +      #address-cells = <1>;
> > > > +      #size-cells = <0>;
> > > > +
> > > > +        adc@0 {
> > > > +            compatible = "maxim,max1241";
> > > > +            reg = <0>;
> > > > +            vref-supply = <&vdd_3v3_reg>;
> > > > +            spi-max-frequency = <1000000>;
> > > > +            shdn-gpios = <&gpio 26 1>;
> > > > +        };
> > > > +    };
> > > > +
> > > > +  


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-22  9:53         ` Alexandru Lazar
@ 2020-03-22 15:27           ` Jonathan Cameron
  2020-03-22 16:06             ` Alexandru Lazar
  0 siblings, 1 reply; 15+ messages in thread
From: Jonathan Cameron @ 2020-03-22 15:27 UTC (permalink / raw)
  To: Alexandru Lazar
  Cc: Ardelean, Alexandru, robh+dt, mark.rutland, devicetree, knaack.h,
	linux-iio, pmeerw, lars

On Sun, 22 Mar 2020 11:53:17 +0200
Alexandru Lazar <alazar@startmail.com> wrote:

> > Yep.
> > Jonathan refers to Vdd input/pin [on the chip] which is different from Vref [REF
> > pin].
> > Not all drivers define Vdd.
> > Some call it AVdd.
> > 
> > [...]
> > 
> > It's an idea to add it, and that can give control to the driver to power-up the
> > ADC, by defining a regulator [vdd-supply] in the device-tree.  
> 
> Hmm... I don't know how useful this would be for the 124x family (I
> doubt anyone who needs one of these will power it from its own,
> independent supply), 

You'd be surprised how often this gets added to drivers precisely because
people will put it on a controllable supply.  It may well not have it's own
supply but it may share one with a bunch of other external chips and
all of them need to use the regulator framework controls to make sure it's
only disabled when they are all suspended etc.

See the number of times Linus Walleij has added this for various sensors
and ADCs because he has boards where the control is needed.

Jonathan


> but it's a pretty harmless change. I can't think of
> any reason to say no :-).
> 
> Thanks,
> Alex


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-22 15:27           ` Jonathan Cameron
@ 2020-03-22 16:06             ` Alexandru Lazar
  2020-03-22 16:57               ` Jonathan Cameron
  0 siblings, 1 reply; 15+ messages in thread
From: Alexandru Lazar @ 2020-03-22 16:06 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Ardelean, Alexandru, robh+dt, mark.rutland, devicetree, knaack.h,
	linux-iio, pmeerw, lars

> You'd be surprised how often this gets added to drivers precisely because
> people will put it on a controllable supply.  It may well not have it's own
> supply but it may share one with a bunch of other external chips and
> all of them need to use the regulator framework controls to make sure it's
> only disabled when they are all suspended etc.

I figured it might be something like this :-). I've added the vdd-supply
binding in v5.

If this isn't something that can be easily handled in the core, do you
think we can document it somewhere as a convention/common idiom?
(Assuming it's not already documented, of course). It seems like it's
something that all IIO devices would need. I can do the writing part.

Thanks,
Alex

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-22 16:06             ` Alexandru Lazar
@ 2020-03-22 16:57               ` Jonathan Cameron
  0 siblings, 0 replies; 15+ messages in thread
From: Jonathan Cameron @ 2020-03-22 16:57 UTC (permalink / raw)
  To: Alexandru Lazar
  Cc: Ardelean, Alexandru, robh+dt, mark.rutland, devicetree, knaack.h,
	linux-iio, pmeerw, lars

On Sun, 22 Mar 2020 18:06:04 +0200
Alexandru Lazar <alazar@startmail.com> wrote:

> > You'd be surprised how often this gets added to drivers precisely because
> > people will put it on a controllable supply.  It may well not have it's own
> > supply but it may share one with a bunch of other external chips and
> > all of them need to use the regulator framework controls to make sure it's
> > only disabled when they are all suspended etc.  
> 
> I figured it might be something like this :-). I've added the vdd-supply
> binding in v5.
> 
> If this isn't something that can be easily handled in the core, do you
> think we can document it somewhere as a convention/common idiom?
> (Assuming it's not already documented, of course). It seems like it's
> something that all IIO devices would need. I can do the writing part.

Hmm. We could do with a sort of 'things you'd normally find in a driver'
document.  We don't have such a document, but interesting to think about
what would be in it...  Perhaps a 'best practice' document would
be a better way of putting it.  I don't really want to see a huge
number of patches adding regulators to drivers that don't have them already
for example.  Clearly no one needed them yet :)

If you want to take a stab at such a document that would be great.

Jonathan


> 
> Thanks,
> Alex


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
  2020-03-20 15:01 ` [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
  2020-03-21 17:34   ` Jonathan Cameron
@ 2020-03-30 23:39   ` Rob Herring
  1 sibling, 0 replies; 15+ messages in thread
From: Rob Herring @ 2020-03-30 23:39 UTC (permalink / raw)
  To: Alexandru Lazar
  Cc: linux-iio, devicetree, jic23, knaack.h, lars, pmeerw, mark.rutland

On Fri, Mar 20, 2020 at 05:01:14PM +0200, Alexandru Lazar wrote:
> Add device-tree bindings documentation for the MAX1241 device driver.
> 
> Signed-off-by: Alexandru Lazar <alazar@startmail.com>
> ---
>  .../bindings/iio/adc/maxim,max1241.yaml       | 61 +++++++++++++++++++
>  1 file changed, 61 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> 
> diff --git a/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> new file mode 100644
> index 000000000000..de41d422ce3b
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> @@ -0,0 +1,61 @@
> +# SPDX-License-Identifier: GPL-2.0

Dual license new bindings please:

(GPL-2.0-only OR BSD-2-Clause)

> +# Copyright 2020 Ioan-Alexandru Lazar
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/iio/adc/maxim,max1241.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Maxim MAX1241 12-bit, single-channel analog to digital converter
> +
> +maintainers:
> +  - Ioan-Alexandru Lazar <alazar@startmail.com>
> +
> +description: |
> +  Bindings for the max1241 12-bit, single-channel ADC device. This
> +  driver supports voltage reading and can optionally be configured for
> +  power-down mode operation. The datasheet can be found at:
> +    https://datasheets.maximintegrated.com/en/ds/MAX1240-MAX1241.pdf
> +
> +properties:
> +  compatible:
> +    enum:
> +      - maxim,max1241
> +
> +  reg:
> +    maxItems: 1
> +
> +  vref-supply:
> +    description:
> +      Device tree identifier of the regulator that provides the external
> +      reference voltage.
> +    maxItems: 1

Drop this. Supplies are always 1 item.

> +
> +  shdn-gpios:

shutdown-gpios is the semi standard name.

> +    description:
> +      GPIO spec for the GPIO pin connected to the ADC's /SHDN pin. If
> +      specified, the /SHDN pin will be asserted between conversions,
> +      thus enabling power-down mode.
> +    maxItems: 1
> +
> +required:
> +  - compatible
> +  - reg
> +  - vref-supply
> +
> +examples:
> +  - |
> +    #include <dt-bindings/gpio/gpio.h>
> +    spi0 {

Just 'spi'

> +      #address-cells = <1>;
> +      #size-cells = <0>;
> +
> +        adc@0 {
> +            compatible = "maxim,max1241";
> +            reg = <0>;
> +            vref-supply = <&vdd_3v3_reg>;
> +            spi-max-frequency = <1000000>;
> +            shdn-gpios = <&gpio 26 1>;
> +        };
> +    };
> +
> +
> -- 
> 2.25.2
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v4 0/2] Maxim MAX1241 driver
@ 2020-03-20 14:57 Alexandru Lazar
  0 siblings, 0 replies; 15+ messages in thread
From: Alexandru Lazar @ 2020-03-20 14:57 UTC (permalink / raw)
  To: linux-iio
  Cc: devicetree, jic23, knaack.h, lars, pmeerw, robh+dt, mark.rutland,
	Alexandru Lazar

Hello again,

Here's version 4 of a patch series which adds support for the Maxim
MAX1241, a 12-bit, single-channel, SPI-connected ADC.

Changelog so far:

v4:

* Dropped explicit documentation of SPI reg property
* Reordered patch series so that dt bindings come first

v3:

* Fixed silly copy-paste error in Kconfig description

v2:

* Removed useeless header includes
* Dropped needlessly verbose stuff in _read and _probe functions
* Dropped useless GPL notice
* Lowered log level of shdn pin status in probe function, now it's
  dev_dbg
* Added proper error checking for the GPIO shutdown pin
* remove now always returns zero (man, I've been wrong about this for
  *years* now...)
* Added regulator disable action, cleanup is now handled via devm
* Drop delay_usecs, use delay.value, delay.unit
* Drop config_of, of_match_ptr call
* Dropped IIO_BUFFER, IIO_TRIGGERED_BUFFER dependencies, set SPI_MASTER
  as dependency, fix indenting.
* DT binding: use correct id, add reg description (looks pretty
  standard), dropped spi-max-frequency, fixed dt_binding_check
  complaints (oops!)

All the best,
Alex

Alexandru Lazar (2):
  dt-bindings: iio: adc: Add MAX1241 device tree bindings in
    documentation
  iio: adc: Add MAX1241 driver

 .../bindings/iio/adc/maxim,max1241.yaml       |  61 ++++++
 drivers/iio/adc/Kconfig                       |  10 +
 drivers/iio/adc/Makefile                      |   1 +
 drivers/iio/adc/max1241.c                     | 206 ++++++++++++++++++
 4 files changed, 278 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
 create mode 100644 drivers/iio/adc/max1241.c

-- 
2.25.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2020-03-30 23:39 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-20 15:01 [PATCH v4 0/2] Maxim MAX1241 driver Alexandru Lazar
2020-03-20 15:01 ` [PATCH v4 1/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
2020-03-21 17:34   ` Jonathan Cameron
2020-03-21 19:35     ` Alexandru Lazar
2020-03-22  9:02       ` Ardelean, Alexandru
2020-03-22  9:53         ` Alexandru Lazar
2020-03-22 15:27           ` Jonathan Cameron
2020-03-22 16:06             ` Alexandru Lazar
2020-03-22 16:57               ` Jonathan Cameron
2020-03-22 15:25         ` Jonathan Cameron
2020-03-30 23:39   ` Rob Herring
2020-03-20 15:01 ` [PATCH v4 2/2] iio: adc: Add MAX1241 driver Alexandru Lazar
2020-03-21 18:00   ` Jonathan Cameron
2020-03-21 21:56   ` Andy Shevchenko
  -- strict thread matches above, loose matches on Subject: below --
2020-03-20 14:57 [PATCH v4 0/2] Maxim " Alexandru Lazar

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).