Add maxim max34408/34409 ADC driver and yaml
Subsystems (2)
v3 cover Add maxim max34408/34409 ADC driver and yaml
Add Maxim max34408/34409 ADC driver and yaml for it. Until now it supports only current monitioring function without overcurrent threshold/delay, shutdown delay configuration, alert interrupt.
Changes from v1:
- minor changes from Rob's comments for yaml
- add ena, shtdn and make 4 inputs for R sense from Jonathan's comments for yaml
- add _REG suffix and make prefix for bitmasks and statuses
- add SCALE/OFFSET instead of AVG/PROCESSED from Jonathan and Lars-Peter comments
- add chip data from Jonathan and Lars-Peter comments
- minor changes from Lars-Peter and Jonathan comments for driver
Changes from v2:
- add channels into hardware description into yaml
- add rsense property per channel
- rename pins for shtdn and ena pins
- make one array for input_rsense values
Ivan Mikhaylov (2):
dt-bindings: adc: provide max34408/9 device tree binding document
iio: adc: Add driver support for MAX34408/9
.../bindings/iio/adc/maxim,max34408.yaml | 137 +++++++++ drivers/iio/adc/Kconfig | 11 + drivers/iio/adc/Makefile | 1 + drivers/iio/adc/max34408.c | 270 ++++++++++++++++++ 4 files changed, 419 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max34408.yaml create mode 100644 drivers/iio/adc/max34408.c
Signature · 1 line
2.42.0
PATCH v3 1/2 dt-bindings: adc: provide max34408/9 device tree binding document
The hardware binding for i2c current monitoring device with overcurrent control.
--- .../bindings/iio/adc/maxim,max34408.yaml | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/adc/maxim,max34408.yaml
Documentation/devicetree/bindings/iio/adc/maxim,max34408.yaml new file +137 -0
@@ -0,0 +1,137 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/adc/maxim,max34408.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Two- and four-channel current monitors with overcurrent control + +maintainers: + - Ivan Mikhaylov <[email protected]> + +description: | + The MAX34408/MAX34409 are two- and four-channel current monitors that are + configured and monitored with a standard I2C/SMBus serial interface. Each + unidirectional current sensor offers precision high-side operation with a + low full-scale sense voltage. The devices automatically sequence through + two or four channels and collect the current-sense samples and average them + to reduce the effect of impulse noise. The raw ADC samples are compared to + user-programmable digital thresholds to indicate overcurrent conditions. + Overcurrent conditions trigger a hardware output to provide an immediate + indication to shut down any necessary external circuitry. + + Specifications about the devices can be found at: + https://www.analog.com/media/en/technical-documentation/data-sheets/MAX34408-MAX34409.pdf + +properties: + compatible: + enum: + - maxim,max34408 + - maxim,max34409 + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + isshutdown-gpios: + description: + Shutdown Output. Open-drain output. This output transitions to high impedance + when any of the digital comparator thresholds are exceeded as long as the ENA + pin is high. + maxItems: 1 + + shtdn-enable-gpios: + description: + SHTDN Enable Input. CMOS digital input. Connect to GND to clear the latch and + unconditionally deassert (force low) the SHTDN output and reset the shutdown + delay. Connect to VDD to enable normal latch operation of the SHTDN output. + maxItems: 1 + + vdd-supply: true + +required: + - compatible + - reg + +patternProperties: + "^channel@[0-3]$": + $ref: adc.yaml + type: object + description: + Represents the internal channels of the ADC. + + properties: + reg: + items: + minimum: 0 + maximum: 3 + + maxim,rsense-val-micro-ohms: + description: + Adjust the Rsense value to monitor higher or lower current levels for + input. + enum: [250, 500, 1000, 5000, 10000, 50000, 100000, 200000, 500000] + default: 1000 + + required: + - reg + - maxim,rsense-val-micro-ohms + + unevaluatedProperties: false + +allOf: + - if: + properties: + compatible: + contains: + const: maxim,max34408 + then: + patternProperties: + "^channel@[2-3]$": false + "^channel@[0-1]$": + properties: + reg: + minimum: 0 + maximum: 1 + else: + patternProperties: + "^channel@[0-3]$": + properties: + reg: + minimum: 0 + maximum: 3 + +additionalProperties: false + +examples: + - | + i2c { + + #address-cells = <1>; + #size-cells = <0>; + + adc@1e { + compatible = "maxim,max34409"; + reg = <0x1e>; + + #address-cells = <1>; + #size-cells = <0>; + channel@0 { + reg = <0x0>; + maxim,rsense-val-micro-ohms = <5000>; + }; + + channel@1 { + reg = <0x1>; + maxim,rsense-val-micro-ohms = <10000>; + }; + }; + };
Signature · 1 line
2.42.0
PATCH v3 2/2 iio: adc: Add driver support for MAX34408/9
In reply to Ivan MikhaylovThe MAX34408/MAX34409 are two- and four-channel current monitors that are configured and monitored with a standard I2C/SMBus serial interface. Each unidirectional current sensor offers precision high-side operation with a low full-scale sense voltage. The devices automatically sequence through two or four channels and collect the current-sense samples and average them to reduce the effect of impulse noise. The raw ADC samples are compared to user-programmable digital thresholds to indicate overcurrent conditions. Overcurrent conditions trigger a hardware output to provide an immediate indication to shut down any necessary external circuitry.
Add as ADC driver which only supports current monitoring for now.
--- drivers/iio/adc/Kconfig | 11 ++ drivers/iio/adc/Makefile | 1 + drivers/iio/adc/max34408.c | 270 +++++++++++++++++++++++++++++++++++++ 3 files changed, 282 insertions(+) create mode 100644 drivers/iio/adc/max34408.c
drivers/iio/adc/Kconfig +11 -0
@@ -735,6 +735,17 @@ config MAX1363 To compile this driver as a module, choose M here: the module will be called max1363. +config MAX34408 + tristate "Maxim max34408/max344089 ADC driver" + depends on I2C + help + Say yes here to build support for Maxim max34408/max34409 current sense + monitor with 8-bits ADC interface with overcurrent delay/threshold and + shutdown delay. + + To compile this driver as a module, choose M here: the module will be + called max34408. + config MAX77541_ADC tristate "Analog Devices MAX77541 ADC driver" depends on MFD_MAX77541
drivers/iio/adc/Makefile +1 -0
@@ -67,6 +67,7 @@ obj-$(CONFIG_MAX11205) += max11205.o obj-$(CONFIG_MAX11410) += max11410.o obj-$(CONFIG_MAX1241) += max1241.o obj-$(CONFIG_MAX1363) += max1363.o +obj-$(CONFIG_MAX34408) += max34408.o obj-$(CONFIG_MAX77541_ADC) += max77541-adc.o obj-$(CONFIG_MAX9611) += max9611.o obj-$(CONFIG_MCP320X) += mcp320x.o
drivers/iio/adc/max34408.c new file +270 -0
270 lines not on this page · raw message
Signature · 1 line
2.42.0
Jonathan Cameron
maintainerRe: [PATCH v3 2/2] iio: adc: Add driver support for MAX34408/9
Quoted 10 lines · On Thu, 5 Oct 2023 19:09:30 +0300 Ivan Mikhaylov <[email protected]> wrote:
The MAX34408/MAX34409 are two- and four-channel current monitors that are configured and monitored with a standard I2C/SMBus serial interface. Each unidirectional current sensor offers precision high-side operation with a low full-scale sense voltage. The devices automatically sequence through two or four channels and collect the current-sense samples and average them to reduce the effect of impulse noise. The raw ADC samples are compared to user-programmable digital thresholds to indicate overcurrent conditions. Overcurrent conditions trigger a hardware output to provide an immediate indication to shut down any necessary external circuitry.
Quoted 5 lines
Add as ADC driver which only supports current monitoring for now.
Signed-off-by Ivan Mikhaylov <[email protected]>
Hi Ivan,
Biggest thing remaining that I noticed on this read through is that for new drivers in IIO I am asking people to only use generic firmware property accessors from property.h instead of the of specific ones.
I rarely makes things less readable or more complex, and leaves us ready for other options in future.
Thanks,
Jonathan
Quoted 6 lines
drivers/iio/adc/max34408.c new file +3
-0@@ -0,0 +1,270 @@ +// SPDX-License-Identifier: GPL-2.0 +/* +* IIO driver for Maxim MAX34409/34408 ADC, 4-Channels/2-Channels, 8bits, I2C
drivers/iio/adc/max34408.c line 13
Quoted 10 lines
drivers/iio/adc/max34408.c new file +10
-0+* +* Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/MAX34408-MAX34409.pdf +* +* TODO: ALERT interrupt, Overcurrent delay, Shutdown delay +*/ + +#include <linux/bitfield.h> +#include <linux/init.h> +#include <linux/i2c.h> +#include <linux/module.h>
mod_devicetable.h for the various firmware match table definitions
drivers/iio/adc/max34408.c line 15
Quoted 2 lines
drivers/iio/adc/max34408.c new file +2
-0+#include <linux/mutex.h> +#include <linux/of_device.h>
Should be include <linux/property.h>
and use the accessors in there instead of of specific ones.
Quoted 6 lines
drivers/iio/adc/max34408.c new file +6
-0+ +static int max34408_probe (struct i2c_client *client) +{ +const struct max34408_adc_model_data *model_data; +struct device *dev = &client->dev; +const struct of_device_id *match;
drivers/iio/adc/max34408.c line 220
Quoted 10 lines
drivers/iio/adc/max34408.c new file +10
-0+struct max34408_data *max34408; +struct device_node *child; +struct iio_dev *indio_dev; +struct regmap *regmap; +int rc, i; + + match =of_match_device (max34408_of_match, dev); +if (!match) +return -EINVAL ; + model_data = match->data;
match = i2c_get_match_data()
as that will cope with all forms of firmware and i2c_device_id tables.
Quoted 9 lines
drivers/iio/adc/max34408.c new file +9
-0+ + regmap =devm_regmap_init_i2c (client, &max34408_regmap_config); +if (IS_ERR (regmap)) { +dev_err_probe (dev,PTR_ERR (regmap), +"regmap_init failed\n" ); +return PTR_ERR (regmap); + } + + indio_dev =devm_iio_device_alloc (dev,sizeof (*max34408));
drivers/iio/adc/max34408.c line 239
Quoted 10 lines
drivers/iio/adc/max34408.c new file +10
-0+if (!indio_dev) +return -ENOMEM ; + + max34408 =iio_priv (indio_dev); + max34408->regmap = regmap; + max34408->dev = dev; +mutex_init (&max34408->lock); + +for_each_available_child_of_node (dev->of_node, child) { + of_property_read_u32(child, "maxim,rsense-val-micro-ohms",
Use the stuff in property.h so that we are ready for other firmware types. We are still pushing this (slowly) throughout IIO drivers that are already in tree.
Quoted 14 lines
drivers/iio/adc/max34408.c new file +14
-0+ &max34408->input_rsense[i]); + i++; + } + +/* disable ALERT and averaging */ + rc =regmap_write (max34408->regmap,MAX34408_CONTROL_REG ,0x0 ); +if (rc) +return rc; + + indio_dev->channels = model_data->channels; + indio_dev->num_channels = model_data->num_channels; + indio_dev->name = model_data->model_name; + + indio_dev->info = &max34408_info;
drivers/iio/adc/max34408.c line 263
Quoted 10 lines
drivers/iio/adc/max34408.c new file +10
-0+ indio_dev->modes =INDIO_DIRECT_MODE ; + +return devm_iio_device_register (dev, indio_dev); +} + +static struct i2c_driver max34408_driver = { + .driver = { + .name ="max34408" , + .of_match_table = max34408_of_match, + },
Provide the i2c_device_id table as well as you never know what route people will use to probe this.
Quoted 7 lines
drivers/iio/adc/max34408.c new file +7
-0+ .probe = max34408_probe, +}; +module_i2c_driver (max34408_driver); + +MODULE_AUTHOR ("Ivan Mikhaylov <[email protected]>" ); +MODULE_DESCRIPTION ("Maxim MAX34408/34409 ADC driver" ); +MODULE_LICENSE ("GPL" );