iio: potentiostat: add LMP91000 support
Subsystems (2)
v3 cover iio: potentiostat: add LMP91000 support
Changes from v1:
* Rename ti-adc1x1s.c driver to ti-adc161s626.c
* Switch from iio_channel_read() to using the industrialio-buffer-cb interface
* Process data in ADC trigger handler for buffer callbacks
* Set the mux trigger to the ADC referenced by io-channels by default
Changes from v2:
* Fix configuration index shifting values
* Switch from wait_for_completion_interruptible to wait_for_completion_timeout
Matt Ranostay (3):
iio: buffer-callback: allow getting underlying iio_dev
iio: adc: ti-adc161s626: add support for TI 1-channel differential
ADCs
iio: potentiostat: add LMP91000 support
.../devicetree/bindings/iio/adc/ti-adc161s626.txt | 17 + .../bindings/iio/potentiostat/lmp91000.txt | 30 ++ drivers/iio/Kconfig | 1 + drivers/iio/Makefile | 1 + drivers/iio/adc/Kconfig | 12 + drivers/iio/adc/Makefile | 1 + drivers/iio/adc/ti-adc161s626.c | 248 ++++++++++++++ drivers/iio/buffer/industrialio-buffer-cb.c | 24 +- drivers/iio/potentiostat/Kconfig | 22 ++ drivers/iio/potentiostat/Makefile | 6 + drivers/iio/potentiostat/lmp91000.c | 376 +++++++++++++++++++++ include/linux/iio/consumer.h | 12 + 12 files changed, 740 insertions(+), 10 deletions(-) create mode 100644 Documentation/devicetree/bindings/iio/adc/ti-adc161s626.txt create mode 100644 Documentation/devicetree/bindings/iio/potentiostat/lmp91000.txt create mode 100644 drivers/iio/adc/ti-adc161s626.c create mode 100644 drivers/iio/potentiostat/Kconfig create mode 100644 drivers/iio/potentiostat/Makefile create mode 100644 drivers/iio/potentiostat/lmp91000.c
Signature · 1 line
2.7.4
RFC v3 1/3 iio: buffer-callback: allow getting underlying iio_dev
Add iio_channel_cb_get_iio_dev function to allow getting the underlying iio_dev. This is useful for setting the trigger of the consumer ADC device.
--- drivers/iio/buffer/industrialio-buffer-cb.c | 24 ++++++++++++++---------- include/linux/iio/consumer.h | 12 ++++++++++++ 2 files changed, 26 insertions(+), 10 deletions(-)
drivers/iio/buffer/industrialio-buffer-cb.c +14 -10
@@ -18,6 +18,7 @@ struct iio_cb_buffer {int (*cb)(const void *data,void *private);void *private;struct iio_channel *channels; +struct iio_dev *indio_dev; };static struct iio_cb_buffer *buffer_to_cb_buffer (struct iio_buffer *buffer)
@@ -52,7 +53,6 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev, {int ret;struct iio_cb_buffer *cb_buff; -struct iio_dev *indio_dev;struct iio_channel *chan; cb_buff =kzalloc (sizeof (*cb_buff),GFP_KERNEL );
@@ -72,17 +72,17 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev, goto error_free_cb_buff; } - indio_dev = cb_buff->channels[0 ].indio_dev; + cb_buff->indio_dev = cb_buff->channels[0 ].indio_dev; cb_buff->buffer.scan_mask - =kcalloc (BITS_TO_LONGS (indio_dev->masklength),sizeof (long ), -GFP_KERNEL ); + =kcalloc (BITS_TO_LONGS (cb_buff->indio_dev->masklength), +sizeof (long ),GFP_KERNEL );if (cb_buff->buffer.scan_mask ==NULL ) { ret = -ENOMEM ; goto error_release_channels; } chan = &cb_buff->channels[0 ];while (chan->indio_dev) { -if (chan->indio_dev != indio_dev) { +if (chan->indio_dev != cb_buff->indio_dev) { ret = -EINVAL ; goto error_free_scan_mask; }
@@ -105,17 +105,14 @@ EXPORT_SYMBOL_GPL(iio_channel_get_all_cb);int iio_channel_start_all_cb (struct iio_cb_buffer *cb_buff) { -return iio_update_buffers (cb_buff->channels[0 ].indio_dev, - &cb_buff->buffer, +return iio_update_buffers (cb_buff->indio_dev, &cb_buff->buffer,NULL ); }EXPORT_SYMBOL_GPL (iio_channel_start_all_cb);void iio_channel_stop_all_cb (struct iio_cb_buffer *cb_buff) { -iio_update_buffers (cb_buff->channels[0 ].indio_dev, -NULL , - &cb_buff->buffer); +iio_update_buffers (cb_buff->indio_dev,NULL , &cb_buff->buffer); }EXPORT_SYMBOL_GPL (iio_channel_stop_all_cb);
@@ -133,6 +130,13 @@ struct iio_channel }EXPORT_SYMBOL_GPL (iio_channel_cb_get_channels); +struct iio_dev +*iio_channel_cb_get_iio_dev (const struct iio_cb_buffer *cb_buffer) +{ +return cb_buffer->indio_dev; +} +EXPORT_SYMBOL_GPL (iio_channel_cb_get_iio_dev); +MODULE_AUTHOR ("Jonathan Cameron <[email protected]>" );MODULE_DESCRIPTION ("Industrial I/O callback buffer" );MODULE_LICENSE ("GPL" );
include/linux/iio/consumer.h +12 -0
@@ -165,6 +165,18 @@ struct iio_channel *iio_channel_cb_get_channels(const struct iio_cb_buffer *cb_buffer);/** +* iio_channel_cb_get_iio_dev() - get access to the underlying device. +* @cb_buffer: The callback buffer from whom we want the device +* information. +* +* This function allows one to obtain information about the device. +* The primary aim is to allow drivers that are consuming a device to query +* things like current trigger. +*/ +struct iio_dev +*iio_channel_cb_get_iio_dev (const struct iio_cb_buffer *cb_buffer); + +/** * iio_read_channel_raw() - read from a given channel * @chan: The channel being queried. * @val: Value read back.
Signature · 1 line
2.7.4
RFC v3 2/3 iio: adc: ti-adc161s626: add support for TI 1-channel differential ADCs
In reply to Matt RanostayAdd support for Texas Instruments ADC141S626, and ADC161S626 chips.
--- .../devicetree/bindings/iio/adc/ti-adc161s626.txt | 17 ++ drivers/iio/adc/Kconfig | 12 + drivers/iio/adc/Makefile | 1 + drivers/iio/adc/ti-adc161s626.c | 248 +++++++++++++++++++++ 4 files changed, 278 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/adc/ti-adc161s626.txt create mode 100644 drivers/iio/adc/ti-adc161s626.c
Documentation/devicetree/bindings/iio/adc/ti-adc161s626.txt new file +17 -0
@@ -0,0 +1,17 @@ +* Texas Instruments ADC141S626, and ADC161S626 chip + +Required properties: + - compatible: Should be "ti,adc141s626" or "ti,adc161s626" + - reg: spi chip select number for the device + +Recommended properties: + - spi-max-frequency: Definition as per + Documentation/devicetree/bindings/spi/spi-bus.txt + +Example: +adc@0 { + compatible = "ti,adc161s626"; + reg = <0>; + spi-max-frequency = <4300000>; +}; +
drivers/iio/adc/Kconfig +12 -0
@@ -414,6 +414,18 @@ config TI_ADC128S052 This driver can also be built as a module. If so, the module will be called ti-adc128s052. +config TI_ADC161S626 + tristate "Texas Instruments ADC161S626 1-channel differential ADC" + depends on SPI + select IIO_BUFFER + select IIO_TRIGGERED_BUFFER + help + If you say yes here you get support for Texas Instruments ADC141S626, + and ADC161S626 chips. + + This driver can also be build as a module. If so, the module will be + called ti-adc161s626. + config TI_ADS1015 tristate "Texas Instruments ADS1015 ADC" depends on I2C && !SENSORS_ADS1015
drivers/iio/adc/Makefile +1 -0
@@ -40,6 +40,7 @@ obj-$(CONFIG_ROCKCHIP_SARADC) += rockchip_saradc.o obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o obj-$(CONFIG_TI_ADC0832) += ti-adc0832.o obj-$(CONFIG_TI_ADC128S052) += ti-adc128s052.o +obj-$(CONFIG_TI_ADC161S626) += ti-adc161s626.o obj-$(CONFIG_TI_ADS1015) += ti-ads1015.o obj-$(CONFIG_TI_ADS8688) += ti-ads8688.o obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o
drivers/iio/adc/ti-adc161s626.c new file +248 -0
248 lines not on this page · raw message
Signature · 1 line
2.7.4
RFC v3 3/3 iio: potentiostat: add LMP91000 support
In reply to Matt RanostayAdd support for the LMP91000 potentiostat which is used for chemical sensing applications.
--- .../bindings/iio/potentiostat/lmp91000.txt | 30 ++ drivers/iio/Kconfig | 1 + drivers/iio/Makefile | 1 + drivers/iio/potentiostat/Kconfig | 22 ++ drivers/iio/potentiostat/Makefile | 6 + drivers/iio/potentiostat/lmp91000.c | 376 +++++++++++++++++++++ 6 files changed, 436 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/potentiostat/lmp91000.txt create mode 100644 drivers/iio/potentiostat/Kconfig create mode 100644 drivers/iio/potentiostat/Makefile create mode 100644 drivers/iio/potentiostat/lmp91000.c
Documentation/devicetree/bindings/iio/potentiostat/lmp91000.txt new file +30 -0
@@ -0,0 +1,30 @@ +* Texas Instruments LMP91000 potentiostat + +http://www.ti.com/lit/ds/symlink/lmp91000.pdf + +Required properties: + + - compatible: should be "ti,lmp91000" + - reg: the I2C address of the device + - io-channels: the phandle of the iio provider + + - ti,external-tia-resistor: if the property ti,tia-gain-ohm is not defined this + needs to be set to signal that an external resistor value is being used. + +Optional properties: + + - ti,tia-gain-ohm: ohm value of the internal resistor for the transimpedance + amplifier. Must be 2750, 3500, 7000, 14000, 35000, 120000, or 350000 ohms. + + - ti,rload-ohm: ohm value of the internal resistor load applied to the gas + sensor. Must be 10, 33, 50, or 100 (default) ohms. + +Example: + +lmp91000@48 { + compatible = "ti,lmp91000"; + reg = <0x48>; + ti,tia-gain-ohm = <7500>; + ti,rload = <100>; + io-channels = <&adc>; +};
drivers/iio/Kconfig +1 -0
@@ -79,6 +79,7 @@ if IIO_TRIGGER source "drivers/iio/trigger/Kconfig" endif #IIO_TRIGGER source "drivers/iio/potentiometer/Kconfig" +source "drivers/iio/potentiostat/Kconfig" source "drivers/iio/pressure/Kconfig" source "drivers/iio/proximity/Kconfig" source "drivers/iio/temperature/Kconfig"
drivers/iio/Makefile +1 -0
@@ -28,6 +28,7 @@ obj-y += light/ obj-y += magnetometer/ obj-y += orientation/ obj-y += potentiometer/ +obj-y += potentiostat/ obj-y += pressure/ obj-y += proximity/ obj-y += temperature/
drivers/iio/potentiostat/Kconfig new file +22 -0
@@ -0,0 +1,22 @@ +# +# Potentiostat drivers +# +# When adding new entries keep the list in alphabetical order + +menu "Digital potentiostats" + +config LMP91000 + tristate "Texas Instruments LMP91000 potentiostat driver" + depends on I2C + select REGMAP_I2C + select IIO_BUFFER + select IIO_BUFFER_CB + select IIO_TRIGGERED_BUFFER + help + Say yes here to build support for the Texas Instruments + LMP91000 digital potentiostat chip. + + To compile this driver as a module, choose M here: the + module will be called lmp91000 + +endmenu
drivers/iio/potentiostat/Makefile new file +6 -0
@@ -0,0 +1,6 @@ +# +# Makefile for industrial I/O potentiostat drivers +# + +# When adding new entries keep the list in alphabetical order +obj-$(CONFIG_LMP91000) += lmp91000.o
drivers/iio/potentiostat/lmp91000.c new file +376 -0
376 lines not on this page · raw message
Signature · 1 line
2.7.4