* [PATCH 0/2] Maxim MAX1241 driver, v2
@ 2020-03-18 20:28 Alexandru Lazar
2020-03-18 20:28 ` [PATCH 1/2] iio: adc: Add MAX1241 driver Alexandru Lazar
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Alexandru Lazar @ 2020-03-18 20:28 UTC (permalink / raw)
To: linux-iio
Cc: jic23, knaack.h, lars, pmeerw, robh+dt, mark.rutland,
Alexandru Lazar
Hello again,
Here's version 2 of a patch series which adds support for the Maxim
MAX1241, a 12-bit, single-channel, SPI-connected ADC. The previous
version is here:
https://lore.kernel.org/linux-iio/20200317201710.23180-1-alazar@startmail.com/
I've integrated pretty much all of the suggestions I got here, and fixed
the issues that you all pointed out (thanks again! Did I say thanks
lately? Thanks!!!). A short list of the changes is at the end of this
message. checkpatch.pl is happy, it just warns me about the MAINTAINERS
file, where I don't think an entry is necessary. dt_bindings_check is
happy, too.
The only suggestion that I haven't incorporated is adding max1240 to the
list of compatible devices. I've thought about it, but there are
timing-related differences between the two devices, so simply validating
what my machine sends wouldn't be definitive. I think it would be
disingenious to claim compatibility under these circumstances. I do plan
to get a 1240 asap, anyway, and with any luck my patch would just update
the compat string.
Now, here's what I changed:
* 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!)
Thanks!
Alex
Alexandru Lazar (2):
iio: adc: Add MAX1241 driver
dt-bindings: iio: adc: Add MAX1241 device tree bindings in
documentation
.../bindings/iio/adc/maxim,max1241.yaml | 62 ++++++
drivers/iio/adc/Kconfig | 10 +
drivers/iio/adc/Makefile | 1 +
drivers/iio/adc/max1241.c | 206 ++++++++++++++++++
4 files changed, 279 insertions(+)
create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
create mode 100644 drivers/iio/adc/max1241.c
--
2.25.1
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 1/2] iio: adc: Add MAX1241 driver
2020-03-18 20:28 [PATCH 0/2] Maxim MAX1241 driver, v2 Alexandru Lazar
@ 2020-03-18 20:28 ` Alexandru Lazar
2020-03-19 6:51 ` Ardelean, Alexandru
2020-03-18 20:28 ` [PATCH 2/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
2020-03-19 7:31 ` [PATCH 0/2] Maxim MAX1241 driver, v2 Ardelean, Alexandru
2 siblings, 1 reply; 7+ messages in thread
From: Alexandru Lazar @ 2020-03-18 20:28 UTC (permalink / raw)
To: linux-iio
Cc: jic23, knaack.h, lars, pmeerw, robh+dt, mark.rutland,
Alexandru Lazar
Add driver for the Maxim MAX1241 12-bit, single-channel ADC. The driver
includes support for this device's low-power operation mode.
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..4254633147af 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 max1118.
+
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.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH 1/2] iio: adc: Add MAX1241 driver
2020-03-18 20:28 ` [PATCH 1/2] iio: adc: Add MAX1241 driver Alexandru Lazar
@ 2020-03-19 6:51 ` Ardelean, Alexandru
0 siblings, 0 replies; 7+ messages in thread
From: Ardelean, Alexandru @ 2020-03-19 6:51 UTC (permalink / raw)
To: alazar@startmail.com, linux-iio@vger.kernel.org
Cc: jic23@kernel.org, mark.rutland@arm.com, knaack.h@gmx.de,
lars@metafoo.de, pmeerw@pmeerw.net, robh+dt@kernel.org
On Wed, 2020-03-18 at 22:28 +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.
Just one minor typo I see.
>
> 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..4254633147af 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 max1118.
Apologies if I did not notice this before. 'called max1118' -> '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");
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
2020-03-18 20:28 [PATCH 0/2] Maxim MAX1241 driver, v2 Alexandru Lazar
2020-03-18 20:28 ` [PATCH 1/2] iio: adc: Add MAX1241 driver Alexandru Lazar
@ 2020-03-18 20:28 ` Alexandru Lazar
2020-03-19 7:31 ` [PATCH 0/2] Maxim MAX1241 driver, v2 Ardelean, Alexandru
2 siblings, 0 replies; 7+ messages in thread
From: Alexandru Lazar @ 2020-03-18 20:28 UTC (permalink / raw)
To: linux-iio
Cc: 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 | 62 +++++++++++++++++++
1 file changed, 62 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..28c73ed795aa
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
@@ -0,0 +1,62 @@
+# 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:
+ description: SPI chip select number for this device
+ 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.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH 0/2] Maxim MAX1241 driver, v2
2020-03-18 20:28 [PATCH 0/2] Maxim MAX1241 driver, v2 Alexandru Lazar
2020-03-18 20:28 ` [PATCH 1/2] iio: adc: Add MAX1241 driver Alexandru Lazar
2020-03-18 20:28 ` [PATCH 2/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
@ 2020-03-19 7:31 ` Ardelean, Alexandru
2 siblings, 0 replies; 7+ messages in thread
From: Ardelean, Alexandru @ 2020-03-19 7:31 UTC (permalink / raw)
To: alazar@startmail.com, linux-iio@vger.kernel.org
Cc: jic23@kernel.org, mark.rutland@arm.com, knaack.h@gmx.de,
lars@metafoo.de, pmeerw@pmeerw.net, robh+dt@kernel.org
On Wed, 2020-03-18 at 22:28 +0200, Alexandru Lazar wrote:
> Hello again,
>
> Here's version 2 of a patch series which adds support for the Maxim
> MAX1241, a 12-bit, single-channel, SPI-connected ADC. The previous
> version is here:
>
as a quick note, when generating patches with V2 it's useful to do:
git format-patch -v2 <commit-range>
that way, the V2 gets appended to all patches;
makes it easier for maintainers to see which is V2,3,4,etc
no need to re-spin V2;
but when going to V3, you can try it
> https://lore.kernel.org/linux-iio/20200317201710.23180-1-alazar@startmail.com/
>
> I've integrated pretty much all of the suggestions I got here, and fixed
> the issues that you all pointed out (thanks again! Did I say thanks
> lately? Thanks!!!). A short list of the changes is at the end of this
> message. checkpatch.pl is happy, it just warns me about the MAINTAINERS
> file, where I don't think an entry is necessary. dt_bindings_check is
> happy, too.
>
> The only suggestion that I haven't incorporated is adding max1240 to the
> list of compatible devices. I've thought about it, but there are
> timing-related differences between the two devices, so simply validating
> what my machine sends wouldn't be definitive. I think it would be
> disingenious to claim compatibility under these circumstances. I do plan
> to get a 1240 asap, anyway, and with any luck my patch would just update
> the compat string.
>
> Now, here's what I changed:
>
> * 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!)
>
> Thanks!
>
> Alex
>
> Alexandru Lazar (2):
> iio: adc: Add MAX1241 driver
> dt-bindings: iio: adc: Add MAX1241 device tree bindings in
> documentation
>
> .../bindings/iio/adc/maxim,max1241.yaml | 62 ++++++
> drivers/iio/adc/Kconfig | 10 +
> drivers/iio/adc/Makefile | 1 +
> drivers/iio/adc/max1241.c | 206 ++++++++++++++++++
> 4 files changed, 279 insertions(+)
> create mode 100644
> Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> create mode 100644 drivers/iio/adc/max1241.c
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 0/2] Maxim MAX1241 driver
@ 2020-03-17 20:17 Alexandru Lazar
2020-03-17 20:17 ` [PATCH 2/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
0 siblings, 1 reply; 7+ messages in thread
From: Alexandru Lazar @ 2020-03-17 20:17 UTC (permalink / raw)
To: linux-iio
Cc: jic23, knaack.h, lars, pmeerw, robh+dt, mark.rutland,
Alexandru Lazar
Hello!
This patch series adds support for the Maxim MAX1241, a 12-bit,
single-channel, SPI-connected ADC. It's a pretty sturdy ADC that I've
used for some time now and I figured my driver may be useful to others
as well.
I originally thought I might get this under the max1027 driver but the
124x family is different enough that shoehorning it in there didn't seem
like a good idea. The 1241 has a single channel, no FIFO, uses a
different mechanism to signal conversion start and has a low-power
operation mode which it uses in a pretty different way. This is actually
closer to MAX111x, but those also have a pretty different signaling
convention.
Needless to say, though, if anyone who is more familiar with this
situation disagrees and wants to point me in the direction of the
appropriate driver, I'm happy to make the changes there instead of
providing a separate driver.
Also please note that I am somewhat unfamiliar with the idioms of the
IIO subsystem's tree. Jonathan Cameron was kind enough to give me a few
pointers but there are a few questions I didn't bother him with (so I'm
guess I'm gonna bother you instead now).
1. There are two ADCs in this family, MAX1240 and MAX1241. This driver
only supports the MAX1241. The scaffolding to get MAX1240 support is in
there, but I didn't have access to a MAX1240 and I didn't want to submit
untested code for review. Can we add MAX1240 support later, or should I
do it from the very beginning? Either way is fine by me (I'm just a
little concerned about how quickly I might *get* a MAX1240 these
days...)
2. Looking at other drivers, it seems to me that, on ADCs that require
an external reference, it's customary to make a voltage regulator a
required property in the DT bindings. Am I correct here?
3. checkpatch.pl warns me that the MAINTAINERS file might need
updating. I'm not sure what the appropriate thing to do is here -- I can
maintain this driver indefinitely (I am actively using it anways) but
it's a 200-line driver, does that warrant inclusion in MAINTAINERS?
My apologies if anything here is distinctly bad -- this isn't the first
time I'm writing kernel code but it's definitely the first time I'm
sending ay upstream. Any bugs are due to my own incompetence, everything
else is just temporary ignorance :-).
Thanks,
Alex
Alexandru Lazar (2):
iio: adc: Add MAX1241 driver
dt-bindings: iio: adc: Add MAX1241 device tree bindings in
documentation
.../bindings/iio/adc/maxim,max1241.yaml | 60 +++++
drivers/iio/adc/Kconfig | 12 +
drivers/iio/adc/Makefile | 1 +
drivers/iio/adc/max1241.c | 215 ++++++++++++++++++
4 files changed, 288 insertions(+)
create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
create mode 100644 drivers/iio/adc/max1241.c
--
2.25.1
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 2/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
2020-03-17 20:17 [PATCH 0/2] Maxim MAX1241 driver Alexandru Lazar
@ 2020-03-17 20:17 ` Alexandru Lazar
2020-03-18 7:00 ` Ardelean, Alexandru
0 siblings, 1 reply; 7+ messages in thread
From: Alexandru Lazar @ 2020-03-17 20:17 UTC (permalink / raw)
To: linux-iio
Cc: 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 | 60 +++++++++++++++++++
1 file changed, 60 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..abb90d382067
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
@@ -0,0 +1,60 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/adc/adi,ad7780.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
+
+ spi-max-frequency:
+ 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 {
+ adc@0 {
+ compatible = "maxim,max1241";
+ reg = <0>;
+ vref-supply = <&vdd_3v3_reg>;
+ spi-max-frequency = <1000000>;
+ shdn-gpios = <&gpio 26 1>;
+ };
+ };
+
+
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH 2/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation
2020-03-17 20:17 ` [PATCH 2/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
@ 2020-03-18 7:00 ` Ardelean, Alexandru
0 siblings, 0 replies; 7+ messages in thread
From: Ardelean, Alexandru @ 2020-03-18 7:00 UTC (permalink / raw)
To: alazar@startmail.com, linux-iio@vger.kernel.org
Cc: jic23@kernel.org, mark.rutland@arm.com, knaack.h@gmx.de,
lars@metafoo.de, pmeerw@pmeerw.net, robh+dt@kernel.org
On Tue, 2020-03-17 at 22:17 +0200, Alexandru Lazar wrote:
> [External]
>
> Add device-tree bindings documentation for the MAX1241 device driver.
>
curious: did you run dt_binding_check ?
typically what i do is:
ARCH=arm make defconfig # no idea why this is still needed for bindings check
# i mean, i see the deps, but i don't feel is needed
# ¯\_(ツ)_/¯
ARCH=arm make dt_binding_check \
DT_SCHEMA_FILES=Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
# should be on one line
# for dependencies, see
https://github.com/torvalds/linux/blob/master/Documentation/devicetree/writing-schema.rst#dependencies
It might be that Rob's bot will come back and tell us anything wrong with this
file.
> Signed-off-by: Alexandru Lazar <alazar@startmail.com>
> ---
> .../bindings/iio/adc/maxim,max1241.yaml | 60 +++++++++++++++++++
> 1 file changed, 60 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..abb90d382067
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/adc/maxim,max1241.yaml
> @@ -0,0 +1,60 @@
> +# SPDX-License-Identifier: GPL-2.0
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/iio/adc/adi,ad7780.yaml#
This isn't AD7780 :p
adi,ad7780.yaml# -> 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
> +
> + spi-max-frequency:
> + maxItems: 1
this could probably be omitted;
it's documented in some spi.yaml file and is considered a standard property
> +
> + 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 {
> + 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] 7+ messages in thread
end of thread, other threads:[~2020-03-19 7:32 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-03-18 20:28 [PATCH 0/2] Maxim MAX1241 driver, v2 Alexandru Lazar
2020-03-18 20:28 ` [PATCH 1/2] iio: adc: Add MAX1241 driver Alexandru Lazar
2020-03-19 6:51 ` Ardelean, Alexandru
2020-03-18 20:28 ` [PATCH 2/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
2020-03-19 7:31 ` [PATCH 0/2] Maxim MAX1241 driver, v2 Ardelean, Alexandru
-- strict thread matches above, loose matches on Subject: below --
2020-03-17 20:17 [PATCH 0/2] Maxim MAX1241 driver Alexandru Lazar
2020-03-17 20:17 ` [PATCH 2/2] dt-bindings: iio: adc: Add MAX1241 device tree bindings in documentation Alexandru Lazar
2020-03-18 7:00 ` Ardelean, Alexandru
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox