iio: adc: add Nuvoton NCT7201 ADC driver
Subsystems (3)
Eason Yang
maintainerv7 cover iio: adc: add Nuvoton NCT7201 ADC driver
Change since version 7:
- Fix comments
- Derive dev from the respective regmap
- Generate the mask from the number of voltage input channels
Change since version 6:
- Fix comments
- Add use_single_read in regmap_config
- Remove unused definitions
- Do not shadow the return code by -EIO and let regmap API caller to decide
- Use simple English in all error messages
- Use a local variable for the struct device pointers. This increases code readability with shortened lines.
- Use fsleep instead of mdelay
- Use 16 bits type __le16 instead of u8 data[2]
Change since version 5:
- Fix comments
- Add NUVOTON NCT7201 IIO DRIVER section in MAINTAINERS
- Add vdd-supply and vref-supply to the DT example
- Remove mutex since the regmap should already have an internal lock
- Remove redundant assigning values
- Check errors on regmap_write
Change since version 4:
- Fix comments
- Add interrupts and reset-gpios to the DT example
- Use the FIELD_PREP and FIELD_GET
- Add use_single_write in regmap_config
- Use regmap_access_table
Change since version 3:
- Fix comments
- Don't put nct720"x" in the name, just call it nct7201
- Remove differential inputs until conversions are finished
- Add NCT7201_ prefix in all macros and avoid the tables
- Correct event threshold values in raw units
- Add with and without interrupt callback function to have the event config part and one that doesn't
- Remove print an error message if regmap_wirte failed case
Change since version 2:
- Remvoe read-vin-data-size property, default use read word vin data
- Use regmap instead of i2c smbus API
- IIO should be IIO_CHAN_INFO_RAW and _SCALE not _PROCESSED
- Use dev_xxx_probe in probe function and dev_xxx in other functions
- Use devm_iio_device_register replace of iio_device_register
- Use guard(mutex) replace of mutex_lock
- Use get_unaligned_le16 conversion API
Changes since version 1:
- Add new property in iio:adc binding document
- Add new driver for Nuvoton NCT720x driver
Eason Yang (2):
dt-bindings: iio: adc: add NCT7201 ADCs
iio: adc: add support for Nuvoton NCT7201
.../bindings/iio/adc/nuvoton,nct7201.yaml | 70 +++ MAINTAINERS | 7 + drivers/iio/adc/Kconfig | 11 + drivers/iio/adc/Makefile | 1 + drivers/iio/adc/nct7201.c | 468 ++++++++++++++++++ 5 files changed, 557 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/adc/nuvoton,nct7201.yaml create mode 100644 drivers/iio/adc/nct7201.c
Signature · 1 line
2.34.1
Eason Yang
maintainerPATCH v7 1/2 dt-bindings: iio: adc: add NCT7201 ADCs
Add a binding specification for the Nuvoton NCT7201/NCT7202 up to 12-bit ADCs with I2C interface.
--- .../bindings/iio/adc/nuvoton,nct7201.yaml | 70 +++++++++++++++++++ MAINTAINERS | 6 ++ 2 files changed, 76 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/adc/nuvoton,nct7201.yaml
Documentation/devicetree/bindings/iio/adc/nuvoton,nct7201.yaml new file +70 -0
@@ -0,0 +1,70 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/iio/adc/nuvoton,nct7201.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nuvoton nct7201 and similar ADCs + +maintainers: + - Eason Yang <[email protected]> + +description: | + The NCT7201/NCT7202 is a Nuvoton Hardware Monitor IC, contains up to 12 + voltage monitoring channels, with SMBus interface, and up to 4 sets SMBus + address selection by ADDR connection. It also provides ALERT# signal for + event notification and reset input RSTIN# to recover it from a fault + condition. + + NCT7201 contains 8 voltage monitor inputs (VIN1~VIN8). + NCT7202 contains 12 voltage monitor inputs (VIN1~VIN12). + +properties: + compatible: + enum: + - nuvoton,nct7201 + - nuvoton,nct7202 + + reg: + maxItems: 1 + + vdd-supply: + description: + A 3.3V to supply that powers the chip. + + vref-supply: + description: + The regulator supply for the ADC reference voltage. + + interrupts: + maxItems: 1 + + reset-gpios: + maxItems: 1 + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + #include <dt-bindings/interrupt-controller/irq.h> + + i2c { + #address-cells = <1>; + #size-cells = <0>; + + adc@1d { + compatible = "nuvoton,nct7202"; + reg = <0x1d>; + vdd-supply = <&vdd>; + vref-supply = <&vref>; + interrupt-parent = <&gpio3>; + interrupts = <30 IRQ_TYPE_LEVEL_LOW>; + reset-gpios = <&gpio3 28 GPIO_ACTIVE_LOW>; + }; + }; +...
MAINTAINERS +6 -0
@@ -17358,6 +17358,12 @@ F: drivers/nubus/ F: include/linux/nubus.h F: include/uapi/linux/nubus.h +NUVOTON NCT7201 IIO DRIVER +M: Eason Yang <[email protected]> +L: [email protected] +S: Maintained +F: Documentation/devicetree/bindings/iio/adc/nuvoton,nct7201.yaml + NVIDIA (rivafb and nvidiafb) FRAMEBUFFER DRIVER M: Antonino Daplas <[email protected]> L: [email protected]
Signature · 1 line
2.34.1
Eason Yang
maintainerPATCH v7 2/2 iio: adc: add support for Nuvoton NCT7201
In reply to Eason YangAdd Nuvoton NCT7201/NCT7202 system voltage monitor 12-bit ADC driver
NCT7201/NCT7202 supports up to 12 analog voltage monitor inputs and up to 4 SMBus addresses by ADDR pin. Meanwhile, ALERT# hardware event pins for independent alarm signals, and all the threshold values could be set for system protection without any timing delay. It also supports reset input RSTIN# to recover system from a fault condition.
Currently, only single-edge mode conversion and threshold events are supported.
--- MAINTAINERS | 1 + drivers/iio/adc/Kconfig | 11 + drivers/iio/adc/Makefile | 1 + drivers/iio/adc/nct7201.c | 468 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 481 insertions(+) create mode 100644 drivers/iio/adc/nct7201.c
MAINTAINERS +1 -0
@@ -17363,6 +17363,7 @@ M: Eason Yang <[email protected]> L: [email protected] S: Maintained F: Documentation/devicetree/bindings/iio/adc/nuvoton,nct7201.yaml +F: drivers/iio/adc/nct7201.c NVIDIA (rivafb and nvidiafb) FRAMEBUFFER DRIVER M: Antonino Daplas <[email protected]>
drivers/iio/adc/Kconfig +11 -0
@@ -1092,6 +1092,17 @@ config NAU7802 To compile this driver as a module, choose M here: the module will be called nau7802. +config NCT7201 + tristate "Nuvoton Instruments NCT7201 and NCT7202 Power Monitor" + depends on I2C + select REGMAP_I2C + help + If you say yes here you get support for the Nuvoton NCT7201 and + NCT7202 Voltage Monitor. + + This driver can also be built as a module. If so, the module + will be called nct7201. + config NPCM_ADC tristate "Nuvoton NPCM ADC driver" depends on ARCH_NPCM || COMPILE_TEST
drivers/iio/adc/Makefile +1 -0
@@ -97,6 +97,7 @@ obj-$(CONFIG_MESON_SARADC) += meson_saradc.o obj-$(CONFIG_MP2629_ADC) += mp2629_adc.o obj-$(CONFIG_MXS_LRADC_ADC) += mxs-lradc-adc.o obj-$(CONFIG_NAU7802) += nau7802.o +obj-$(CONFIG_NCT7201) += nct7201.o obj-$(CONFIG_NPCM_ADC) += npcm_adc.o obj-$(CONFIG_PAC1921) += pac1921.o obj-$(CONFIG_PAC1934) += pac1934.o
drivers/iio/adc/nct7201.c new file +468 -0
468 lines not on this page · raw message
Signature · 1 line
2.34.1
Re: [PATCH v7 2/2] iio: adc: add support for Nuvoton NCT7201
Quoted 10 lines · Eason Yang
Add Nuvoton NCT7201/NCT7202 system voltage monitor 12-bit ADC driver
NCT7201/NCT7202 supports up to 12 analog voltage monitor inputs and up to 4 SMBus addresses by ADDR pin. Meanwhile, ALERT# hardware event pins for independent alarm signals, and all the threshold values could be set for system protection without any timing delay. It also supports reset input RSTIN# to recover system from a fault condition.
Currently, only single-edge mode conversion and threshold events are supported.
Very good, from my point of view it's almost ready, a few nit-picks below.
...
drivers/iio/adc/nct7201.c line 12
Quoted 6 lines
drivers/iio/adc/nct7201.c new file +5
-0+#include <linux/array_size.h> +#include <linux/bitfield.h> +#include <linux/bits.h> +#include <linux/delay.h> +#include <linux/device.h>
It seems this is not used, but missingdev_printk.h
Am I mistaken?
Quoted 7 lines
drivers/iio/adc/nct7201.c new file +7
-0+#include <linux/err.h> +#include <linux/i2c.h> +#include <linux/mod_devicetable.h> +#include <linux/module.h> +#include <linux/regmap.h> +#include <linux/types.h> +#include <linux/unaligned.h>
...
Quoted 17 lines
drivers/iio/adc/nct7201.c new file +17
-0+static int nct7201_write_event_value (struct iio_dev *indio_dev, +const struct iio_chan_spec *chan, +enum iio_event_type type, +enum iio_event_direction dir, +enum iio_event_info info, +int val,int val2) +{ +struct nct7201_chip_info *chip =iio_priv (indio_dev); +int err; + +if (chan->type !=IIO_VOLTAGE ) +return -EOPNOTSUPP ; + +if (info !=IIO_EV_INFO_VALUE ) +return -EOPNOTSUPP ; + +if (dir ==IIO_EV_DIR_FALLING )
drivers/iio/adc/nct7201.c line 268
Quoted 10 lines
drivers/iio/adc/nct7201.c new file +9
-0+ err =regmap_write (chip->regmap16,NCT7201_REG_VIN_LOW_LIMIT (chan->address), +FIELD_PREP (NCT7201_REG_VIN_MASK , val)); + else + err =regmap_write (chip->regmap16,NCT7201_REG_VIN_HIGH_LIMIT (chan->address), +FIELD_PREP (NCT7201_REG_VIN_MASK , val)); +if (err) +return err; + +return 0 ;
return err;
Quoted 1 line
+}
...
drivers/iio/adc/nct7201.c line 355
Quoted 5 lines
drivers/iio/adc/nct7201.c new file +5
-0+/* +* After about 25 msecs, the device should be ready and then the power-up +* bit will be set to 1. If not, wait for it. +*/ +fsleep (25000 );
25 * USEC_PER_MSEC ?
...
drivers/iio/adc/nct7201.c line 368
Quoted 7 lines
drivers/iio/adc/nct7201.c new file +6
-0+/* Enable Channel */ +if (chip->num_vin_channels <=8 ) { + err =regmap_write (chip->regmap,NCT7201_REG_CHANNEL_ENABLE , +GENMASK (chip->num_vin_channels -1 ,0 )); +if (err) +return dev_err_probe (dev, err,"Failed to enable channel\n" );
This...
drivers/iio/adc/nct7201.c line 373
Quoted 6 lines
drivers/iio/adc/nct7201.c new file +5
-0+ }else { + err =regmap_bulk_write (chip->regmap,NCT7201_REG_CHANNEL_ENABLE , + &data,sizeof (data)); +if (err) +return dev_err_probe (dev2, err,"Failed to enable channel\n" );
...and this are identical, deduplicate by moving outside of if-else.
Quoted 1 line
(quoted diff) +1
-0+ }
Signature · 2 lines
With Best Regards, Andy Shevchenko
Jonathan Cameron
maintainerRe: [PATCH v7 2/2] iio: adc: add support for Nuvoton NCT7201
Quoted 12 lines
drivers/iio/adc/nct7201.c line 368
Quoted 9 lines
drivers/iio/adc/nct7201.c new file +6
-0+/* Enable Channel */ +if (chip->num_vin_channels <=8 ) { + err =regmap_write (chip->regmap,NCT7201_REG_CHANNEL_ENABLE , +GENMASK (chip->num_vin_channels -1 ,0 )); +if (err) +return dev_err_probe (dev, err,"Failed to enable channel\n" );This...
Quoted 9 lines
drivers/iio/adc/nct7201.c line 373
Quoted 6 lines
drivers/iio/adc/nct7201.c new file +5
-0+ }else { + err =regmap_bulk_write (chip->regmap,NCT7201_REG_CHANNEL_ENABLE , + &data,sizeof (data)); +if (err) +return dev_err_probe (dev2, err,"Failed to enable channel\n" );...and this are identical, deduplicate by moving outside of if-else.
Not worth the dev vs dev2 distinction. They are ultimately the same device so just use dev for both.
Quoted 3 lines
Quoted 1 line
(quoted diff) +1
-0+ }